جواب سوالات مسابقات جاوا کاپ در سایت Quera
نمی دونم چند درصد از برنامه نویسان این تالار تو مسابقات جاوا کاپ شرکت میکنند ولی یکسری مسابقات تستی هم داره که میتونین شرکت کنین خیلی خوب قدرت الگوریتم نویسی رو بالا میبره
خودم برای شروع دوتا از سوال هاشو که با روش خودم نوشتم میذارم خوشحال میشم دوستان نظر بدن ویا اگر بدرد شو خورد بهم بگه ممنون میشم
البته خیلی خیلی ساده هستند.
با تشکر
اعداد کامل کوچکتر از ۱۰,۰۰۰
public class CompleteNumber {
private static int sNum = 0 , cnt = 0;
private static Function<Integer , Boolean> sumFunc = FuncProc::sumNumber;
private static BiFunction<Integer,Integer,Boolean> mod = FuncProc::mod;
public static void main(String[] args) {
Consumer<Integer> cOut = System.out::println;
for (int i = 2; i < 10000; i++) {
if(sumFunc.apply(i)) cOut.accept(i);
sNum = 0; cnt = 0 ;
}
}
@Test
public void test1() {
assertEquals(sumFunc.apply(8),false);
assertEquals(sumFunc.apply(6),true);
assertEquals(sumFunc.apply(28),true);
}
private static class FuncProc {
//for loop algorithm
private static boolean sumNumber(int arg) {
int sNum = 0;
for (int i = 1; i < arg; i++) {
sNum += mod.apply(arg,i) ? i : 0;
}
return sNum == arg ;
}
//recursive algorithm
private static boolean sumNumber2(int arg) {
int i = (++cnt - arg + arg);
if(sNum== arg
&& i >= arg)
return true;
else if(sNum > arg)
return false;
sNum += mod.apply(arg,i) ? i : 0;
return sumFunc.apply(arg);
}
private static boolean mod(int a , int b) {
return a % b == 0 ;
}
}
اگر نخواستید متیونید Test هاشو غیر فعال کنید
نقل قول: جواب سوالات مسابقات جاوا کاپ در سایت Quera
تعداد دفعات تکرار رشتهی دوم در رشتهی اول
البته من با روش Regex عبارتهای منطقی نوشتم
public class RepeatInString {
private static Consumer<Integer> cOut = System.out::println;
private static Consumer<String> sOut = System.out::println;
public static void main(String[] args) {
HashMap<String,String> strs = new HashMap<>();
strs.put("sal","salam");
strs.put("gol","golgoli");
strs.put("sas","sasasas");
strs.put("nan","nanananan");
strs.put("n","nananananiiinan");
strs.put("na","nananananiiinan");
strs.put("zoz","zozozozozozo");
strs.put(null,null);
strs.put("","");
strs.forEach((k,v)-> System.out.printf("%s , %s -> , %d \n",v , k ,StringInString(v,k)));
private static int StringInString(String one, String two) {
int cnt = 0;
if (one == null || two == null || one.isEmpty() || two.isEmpty())
return cnt;
String quantifier = two.charAt(0)+"*?"+two.substring(1,two.length());
//String quantifier1 = two.concat("*?");
Pattern pattern = Pattern.compile(two.length() > 1 ? quantifier : two);
Matcher matcher = pattern.matcher(one);
Predicate<String> sPredicate = pattern.asPredicate();
boolean a = sPredicate.test(one);
while (matcher.find()) cnt++;
return cnt;
}
}
}
نقل قول: جواب سوالات مسابقات جاوا کاپ در سایت Quera
تکرار یک حرف در یک رشته
private static boolean isUniqueChars3(String str) {
int checker =0 ;
for (int i = 0; i < str.length(); i++) {
int val = str.charAt(i) - 'a';
if((checker & (val << 1)) > 0) return false;
checker |= (val << 1);
}
return true;
}
البته اینطوریم میشه که بشه!!
private boolean isUniqueChars(String str) {
byte[] strByte = str.getBytes();
boolean flag = false;
for (int j = 0; j < strByte.length; j++) {
for (int i = j; i < strByte.length; i++) {
if(Byte.compare(strByte[j],strByte[i]) == 0){
flag = true;
break;
}
}
if(flag) break;
}
return !flag;
}
نقل قول: جواب سوالات مسابقات جاوا کاپ در سایت Quera
پیدا کردن یک مقدار بزرگتر بدون استفاده از بلوک های if
private int max(int a, int b) {
int c = a - b ;
int k = (c >> 31) & 0x1;
return a -(k * c );
}
نقل قول: جواب سوالات مسابقات جاوا کاپ در سایت Quera
جمع کردن دو مقدار بدون استفاده از علامت ریاضی (+)
public int plusNoRecursive(int a , int b)
{
int sum , carry ;
while(b != 0){
sum = a ^ b;
carry = (a & b) << 1;
a = sum; b = carry;
}
return a;
}
نقل قول: جواب سوالات مسابقات جاوا کاپ در سایت Quera
اگر دوستان نظر مثبت داشته باشند ادامه خواهم داد...:تشویق:
نقل قول: جواب سوالات مسابقات جاوا کاپ در سایت Quera
اگر تمام سوالاشو دارید، بدون جواب بذارید هم مفید خواهد بود. با جواب که چه بهتر
نقل قول: جواب سوالات مسابقات جاوا کاپ در سایت Quera
واقعیت اش اینه که هدفم اینه که ببینم برنامه نویس های دیگه چطوری مینویسن الگوریتم ها به چه شکلی بعد از چند وقت دیگه کلی چیز میتونیم ازش یاد بگیریم ولی متاسفانه باید بگم کسی خیلی مشارکت نمیکنه البته به جز شما دوست خوبم vahid-p حداقل یه مطلب مینویسید ولی دوستان دیگه نمیدونم چرا کسی هیچ مطلبی نمیگن نمیدونم حالا پست مفید نیست ویا موضوع دیگه ای هست؟!
البته اگر هم پست مفید نیست انتقاد کردن که بد نیست حداقل یه نظر بدید!
یعنی تا حالا کسی به مشکل نوشتن الگوریتم بر نخورده ممکن که این راه حلهایی که من نوشتم جایی استفاده نکنید ولی مطمئنا الگوی پیاده سازی و روش الگوریتم نویسی که همیشه بدردتون خواهد خورد وگرنه تا اونجا که من یادم میاد از سال 80 که من تو المپیاد کامپیوتر شرکت کردم تا همین الان که دوستان خوب وزحمتکشی که تو جاواکاپ دارن این مسابقات رو اجرا میکنن سطح سوالات و نوع به چالش کشیدن برنامه نویس تقریبا یکسان بوده چون هدف تقویت الگوریتم نویسی در زمینه برنامه نویسی کامپیوتر.
نقل قول: جواب سوالات مسابقات جاوا کاپ در سایت Quera
نقل قول:
دوستان دیگه نمیدونم چرا کسی هیچ مطلبی نمیگن نمیدونم حالا پست مفید نیست ویا موضوع دیگه ای هست؟!
یکی از دلایلش اینه خیلی ها عضو نیستن و به عنوان مهمان بازدید میکنند. اخیرا کلا نه تو این انجمن بلکه همه انجمن های فارسی زبان با اومدن گروه های تلگرامی و... بحث ها و سوالاتشون رو میبرن اونجا مطرح می کنند و بدیش اینه که مطالب و سوالات و جوابهاشون به کار شخص دیگه ای نمیاد چون عمومی نیست و قابل جستجو نیست! و به همین دلیل وقت و زمان خیلی ها برای عده کمی هدر میره. و اصلا اینطور نیست که سوالات و مشارکت ها در کل کم شده، اتفاقا با وجود اندروید و رغبت خیلی ها به برنامه نویسی، سوالات بیشتر و بیشتر هم شده اما تو گروه ها مخفی شده. از طرفی با نوتیفیکشن های اپلیکیشن ها خیلی کارهاشون سریعتر پیش میره و مجبور نیستن اینجا یکی دو روز صبر کنن تا یک نفر به سوالشون پاسخ بده. هر چند نظم خاصی نداره گروه ها و من خوشم نمیاد.
با این حال مطالبی که اینجا نوشته میشه در دسترس عموم هست و در کشورهای دیگه هنوز به این روش کار میشه، و برای خوندنش به خیلی ها ممکنه کمک کنه الان و در آینده، هر چند ممکنه مشارکت نباشه.
اما در مورد این سوالات هر چند مربوط به جاوا کاپ هست ولی به نظرم خیلی الگوریتمی است. مثلا "جمع کردن دو عدد بدون +" یا "پیداکردن مقدار بزرگتر بدون if" و با هر زبانی تقریبا همین میشه. کاش سوالاتشون جوری بود که اگر از کلاس های متنوع جاوا استفاده نکنی، کارت به مراتب دشوارتر بشه. با این حال مفید هست و لااقل از دید الگوریتمی، نه لزوما یادگیری جاوا، چالش برانگیز و جالب هستند.
من خودم دوست داشتم راه حل هایی که به ذهنم میاد رو بنویسم ولی فعلا به دلیل درس و دانشگاه خیلی فرصت مشارکت ندارم. اما همانطور که گفتم این سوالات و مطالب شما میمونه و من مثلا چند هفته بعد میتونم بیام سراغش به راحتی و این نظم و قابلیت جستجو باعث میشه بشه به مطالب برگشت و مطالعه کرد.
نقل قول: جواب سوالات مسابقات جاوا کاپ در سایت Quera
نقل قول:
کاش سوالاتشون جوری بود که اگر از کلاس های متنوع جاوا استفاده نکنی، کارت به مراتب دشوارتر بشه.
منهم موافقم با گفته شما.
ولی هدف از بیان کردن این سوالات نوشتن برنامه به زبان جاوا نیست همونطور که میدونید تو مسابقات برنامه نویسی به زبانهای ++c و java و python میتونید برای یک سوال الگوریتم بنویسید پس دقیقا هدف من این بود که درباره الگوریتم ها نظر داده بشه.!
والبته با اینم موافقم که تو کانالها الان فعالیت بیشتر هست .
ولی متاسفانه جدیدا دیگه این سایت مثل چند سال پیش فعالیت نداره حالا یه سوال پیش میاد پس چرا StackOverFlow همچنان در راس انجمن هاست حتی با وجود git خود google بازهم به stack نمیرسه البته از نظر رفع مشکلات برنامه نویسی عرض میکنم ولی این تو ایران تقریبا برعکس شده فکر کنم خارجی ها کانال تو تلگرام ندارن :لبخند::لبخند::لبخند:
بیخود نیست که 50 میلیون کاربر تو ایران داره فکر کنم تا چند وقت دیگه بعضی ها یه بات بنویسن برای تلگ که نون و سبزی براشون بخره شاید هم باشه :لبخند::لبخند::لبخند:
وشاید هم یه دلیل دیگه اش منفعت مالی باشه فعالیت در کانالهای تلگرام بالاخره همین دیگه چه کنیم من که خودم به امثال این سایت بیشتر وابسته هستم در هر حال تمامی مطالب عنوان شده در این تاپیک نظر شخصی خودم قصد انتقاد از هیچ مرام و مسلکی ام تو هیچ سایت ویا اامثال اونم ندارم
نقل قول: جواب سوالات مسابقات جاوا کاپ در سایت Quera
سلام این جوابهای شما در حد آموزشهای جلسات دوره جاوای سایت جاواکاپ نیست و جلوتر از جلسات کدها را استفاده کرده اید لطفا به این نکته توجه داشته باشید می توانید با دانلود اسلاید جلسات با حدود آموزشها آشنا شوید مثلا در مورد اعداد کامل من این کد را نوشته ام :
public class CompleteNumber {
public static void main(String[] args){
for(int i=1;i<10000;i++)
isCompleteNumber(i);
}
public static void isCompleteNumber(int a){
if(f(a))
System.out.println(a);
}
public static boolean f(int x){
int d=0;
for(int y=1;y<x;y++){
if(x%y==0)
d=y+d;
}
if(x==d)
return true;
return false;
}
}
البته ببخشید کددرست paste نمی شود.