জাভা 11, 1325 1379 1356 1336 1290 বাইট
import java.math.*;String c(String s)throws Exception{String r="",T=r,a[],b[],z="\\.";int i=0,l,A[],M=0,m=s.length(),j,f=0,q=m;if(s.contains("(")){for(;i<m;){var c=s.charAt(i++);if(f<1){if(c==40){f=1;continue;}r+=c;}else{if(c==41&T.replaceAll("[^(]","").length()==T.replaceAll("[^)]","").length()){r+="x"+s.substring(i);break;}T+=c;}}return c(r.replace("x",c(T)));}else{for(a=s.split("[\\+\\-\\*/]"),A=new int[l=a.length];i<l;f=b.length>1&&(j=b[1].length())>f?j:f)M=(j=(b=a[i++].split(z))[0].length())>M?j:M;for(b=a.clone(),i=0;i<l;A[i]=b[i].contains(".")?j=b[i].length()-1:b[i].replaceAll("0*$","").length(),i++)for(q=(j=b[i].replace(".","").length())<q?j:q,j=a[i].split(z)[0].length();j++<M;)b[i]=0+b[i];double R=new Double(new javax.script.ScriptEngineManager().getEngineByName("JS").eval(s)+""),p;for(int x:A)m=x<m?x:m;m=m==M&R%1==0&(int)R/10%10<1&(j=(r=R+"").split(z)[0].length())>m?j-q>1?q:j:R>99?m:R%10==0?r.length()-1:m<1?1:m;R=new BigDecimal(R).round(new MathContext((R<0?-R:R)<1?m-1:m)).doubleValue();r=(m<M&(p=Math.pow(10,M-m))/10>R?(int)(R/p)*p:R)+"";l=r.length()-2;r=(r=f<1?r.replaceAll(z+"0$",""):r+"0".repeat(f)).substring(0,(j=r.length())<m?j:r.contains(".")?(j=r.replaceAll("^0\\.0+","").length())<m?m-~j:m+1:m);for(i=r.length();i++<l;)r+=0;return r.replaceAll(z+"$","");}}
প্রান্তের কেসটি ঠিক করার জন্য +54 বাইট 501*2.0(ফলাফল 1002আগে দিয়েছিল , তবে এখন সঠিক 1000)।
আমি এখন বুঝতে পেরেছি কেন এই চ্যালেঞ্জটি প্রায় দুই বছর ধরে
উত্তরহীন ছিল ..>>> এই চ্যালেঞ্জটিতে ডাচ ভাষার চেয়ে আরও বিশেষ কিছু মামলা রয়েছে যা কিছু বলছে .. জাভা অবশ্যই এই ধরণের চ্যালেঞ্জগুলির জন্য সঠিক ভাষা নয় (বা কোনও কোডগল্ফ) এই বিষয়টির জন্য চ্যালেঞ্জ ..; পি), তবে এটি এমন একমাত্র ভাষা যা আমি এর মতো একটি কঠিন চ্যালেঞ্জের চেষ্টা করার পক্ষেও যথেষ্ট ভাল জানি।
Stringফাঁকা জায়গা ছাড়া ইনপুট ফর্ম্যাট (যদি এটি অনুমোদিত না হয় তবে আপনি s=s.replace(" ","")পদ্ধতির শীর্ষে (+19 বাইট) যুক্ত করতে পারেন )।
এটি অনলাইনে চেষ্টা করুন।
ব্যাখ্যা:
দীর্ঘ পোস্টের জন্য দুঃখিত।
if(s.contains("(")){
for(;i<m;){
var c=s.charAt(i++);
if(f<1){
if(c==40){
f=1;
continue;}
r+=c;}
else{
if(c==41&T.replaceAll("[^(]","").length()==T.replaceAll("[^)]","").length()){
r+="x"+s.substring(i);
break;}
T+=c;}}
return c(r.replace("x",c(T)));}
এই অংশটি প্রথম বন্ধনী যুক্ত ইনপুট জন্য ব্যবহৃত হয়। এটি পৃথক অংশগুলি পাবেন এবং পুনরাবৃত্ত-কলগুলি ব্যবহার করবে।
0.4*(2*6)হয়ে যায় 0.4*A, যেখানে Aপুনরাবৃত্তি কলc(2*6)
(8.3*0.02)+(1.*(9*4)+2.2)হয়ে A+B, যেখানে Aএকটি recursive কল c(8.3*0.02)এবং Bএকটি recursive কল c(1.*(9*4)+2.2)→ যেটা ঘুরে ফিরে হয়ে 1.*C+2.2, যেখানে Cএকটি recursive কলc(9*4)
for(a=s.split("[\\+\\-\\*/]"),A=new int[l=a.length];
i<l;
f=b.length>1&&(j=b[1].length())>f?j:f)
M=(j=(b=a[i++].split(z))[0].length())>M?j:M;
এই প্রথম লুপটি মানগুলি পূরণ করতে Mএবং kযেখানে Mউল্লেখযোগ্য পরিসংখ্যান এবং kবৃহত্তম দশমিক দৈর্ঘ্যের ক্ষেত্রে বৃহত্তম সংখ্যার দৈর্ঘ্য is
1200+3.0হয়ে যায় M=2, k=1( 12, .0)
999+2.00হয়ে যায় M=3, k=2( 999, .00)
300.+1-300.হয়ে যায় M=3, k=0( 300, .)
for(b=a.clone(),i=0;
i<l;
A[i]=b[i].contains(".")?j=b[i].length()-1:b[i].replaceAll("0*$","").length(),i++)
for(q=(j=b[i].replace(".","").length())<q?j:q,
j=a[i].split(z)[0].length();
j++<M;)
b[i]=0+b[i];
এই দ্বিতীয় লুপটি অ্যারে পূরণ করতে Aএবং bপাশাপাশি মান হিসাবে ব্যবহৃত হয় q, যেখানে Aউল্লেখযোগ্য পরিসংখ্যানের পরিমাণ, bমিলের জন্য নেতৃস্থানীয় শূন্যগুলির সাথে পূর্ণসংখ্যাকে ধরে রাখে Mএবং qবিন্দু উপেক্ষা করে সর্বনিম্ন দৈর্ঘ্যের দৈর্ঘ্য।
1200+3.0হয়ে যায় A=[2, 5] (12, 00030), b=[1200, 0003.0]এবং q=2( 30)
999+2.00হয়ে যায় A=[3, 5] (999, 00200), b=[999, 002.00]এবং q=3(উভয় 999এবং 200)
300.+1-300.হয়ে যায় A=[3, 3, 3] (300, 001, 300), b=[300., 001, 300.]এবং q=1( 1)
501*2.0হয়ে যায় A=[3, 4] (501, 0020), b=[501, 002.0]এবং q=2( 20)
double R=new Double(new javax.script.ScriptEngineManager().getEngineByName("JS").eval(s)+"")
ইনপুটটি প্রকাশের জন্য একটি জাভাস্ক্রিপ্ট ইঞ্জিন ব্যবহার করে, যা Rদ্বিগুণ হিসাবে সংরক্ষণ করা হবে ।
1200+3.0 হয়ে R=1203.0
999+2.00 হয়ে R=1001.0
300.+1-300. হয়ে R=1.0
for(int x:A)
m=x<m?x:m;
এটি mঅ্যারের মধ্যে ক্ষুদ্রতম মানকে সেট করে A।
A=[2, 5] হয়ে m=2
A=[3, 5] হয়ে m=3
A=[3, 3, 3] হয়ে m=3
m=m==M // If `m` equals `M`
&R%1==0 // and `R` has no decimal values (apart from 0)
&(int)R/10%10<1 // and floor(int(R)/10) modulo-10 is 0
&(j=(r=R+"").split(z)[0].length())>m?
// and the integer-length of R is larger than `m`:
j-q>1? // If this integer-length of `R` minus `q` is 2 or larger:
q // Set `m` to `q` instead
: // Else:
j // Set `m` to this integer-length of `R`
:R>99? // Else-if `R` is 100 or larger:
m // Leave `m` the same
:R%10==0? // Else-if `R` modulo-10 is exactly 0:
r.length()-1 // Set `m` to the total length of `R` (minus the dot)
:m<1? // Else-if `m` is 0:
1 // Set `m` to 1
: // Else:
m; // Leave `m` the same
এটি mএকাধিক কারণের ভিত্তিতে পরিবর্তিত হয়।
999+2.00 = 1001.0& m=3,q=3হয়ে যায় m=4(কারণ m==M(উভয় 3) → R%1==0( 1001.0কোনও দশমিক মান নেই) → (int)R/10%10<1( (int)1001.0/10হয়ে যায় 100→ 100%10<1) → "1001".length()>m( 4>3) → "1001".length()-q<=1( 4-3<=1) → সুতরাং mপূর্ণসংখ্যার অংশ "1001"( 4)) এর দৈর্ঘ্য হয়ে যায়
3.839*4 = 15.356& m=1,q=1থাকে m=1(কারণ m==M(উভয় 1) → R%1!=0( 15.356দশমিক মান রয়েছে) → R<=99→ R%10!=0( 15.356%10==5.356) → m!=0→ তাই mএকই থাকে ( 1))
4*7*3 = 84.0& m=1,q=1থাকে m=1(কারণ m==M(উভয় 1) → R%1==0( 84.0কোনও দশমিক মান নেই) → (int)R/10%10>=1( (int)84/10হয়ে যায় 8→ 8%10>=1) → R<=99→ R%10!=0( 84%10==4) → m!=0→ সুতরাং mএকই থাকে ( 1))
6.0+4.0 = 10.0& m=2,q=2হয়ে যায় m=3(কারণ m!=M( m=2, M=1) → R<=99→ R%10==0( 10%10==0) → তাই mমোটের দৈর্ঘ্য হয় R(বিয়োগ বিন্দু "10.0".length()-1( 3))
0-8.8 = -8.8& m=0,q=1হয়ে যায় m=1(কারণ m!=M( m=0, M=1) → R<=99→ R%10!=0( -8.8%10==-8.8) becomes m<1→ তাই mহয় 1)
501*2.0 = 1001.0& m=3,q=2হয়ে যায় m=2(কারণ m==M(উভয় 3) → R%1==0( 1001.0কোনও দশমিক মান নেই) → (int)R/10%10<1( (int)1001.0/10হয়ে যায় 100→ 100%10<1) → "1001".length()>m( 4>3) → "1001".length()-q>1( 4-2>1)) তাই mহয়ে যায় q( 2))
R=new BigDecimal(R).round(new MathContext((R<0?-R:R)<1?m-1:m)).doubleValue();
এখন Rউপর ভিত্তি করে বৃত্তাকার হয় m।
1001.0& m=4হয়ে যায়1001.0
0.258& m=3হয়ে যায় 0.26(কারণ abs(R)<1, m-1( 2) এর পরিবর্তে m=3ভিতরে ব্যবহার করা হয় MathContext)
-8.8& m=1হয়ে যায়-9.0
1002.0& m=2হয়ে যায়1000.0
m<M&(p=Math.pow(10,M-m))/10>R?(int)(R/p)*p:R;
এটি Rপ্রয়োজনীয় হলে পূর্ণসংখ্যার অংশটি পরিবর্তন করে ।
300.+1-300. = 1.0& m=3,M=3থাকে 1.0(কারণ the m>=Mতাই Rএকই থাকে ( 1.0))
0.4*10 = 4.0& m=1,M=2থাকে 4.0(কারণ m<M→ (10^(M-m))/10<=R( (10^1)/10<=4.0→ 10/10<=4.0→ 1<=4.0) → তাই Rএকই থাকে ( 4.0))
300+1-300 = 1.0& m=1,M=3হয়ে 0.0(কারণ m<M→ (10^(M-m))/10>R( (10^2)/10>1.0→ 100/10>1.0→ 10>1.0) → তাই Rহয়ে 0.0কারণ int(R/(10^(M-m)))*(10^(M-m))( int(1.0/(10^2))*(10^2)→ int(1.0/100)*100→ 0*100→ 0)
r=(...)+""; // Set `R` to `r` as String (... is the part explained above)
l=r.length()-2; // Set `l` to the length of `R` minus 2
r=(r=k<1? // If `k` is 0 (no decimal values in any of the input-numbers)
r.replaceAll(z+"0$","")
// Remove the `.0` at the end
: // Else:
r+"0".repeat(f)
// Append `k` zeroes after the current `r`
).substring(0, // Then take the substring from index `0` to:
(j=r.length())<m? // If the total length of `r` is below `m`:
j // Leave `r` the same
:r.contains(".")? // Else-if `r` contains a dot
(j=r.replaceAll("^0\\.0+","").length())<m?
// And `R` is a decimal below 1,
// and its rightmost decimal length is smaller than `m`
m-~j // Take the substring from index 0 to `m+j+1`
// where `j` is this rightmost decimal length
: // Else:
m+1 // Take the substring from index 0 to `m+1`
: // Else:
m); // Take the substring from index 0 to `m`
এটি স্ট্রিং হিসাবে সেট Rকরে rএবং একাধিক কারণের ভিত্তিতে এটি সংশোধন করে।
1203.0& m=4,k=2হয়ে যায় 1203.(কারণ becomes k>=1তাই rহয়ে যায় 1001.000; r.length()>=m( 8>=4) → r.contains(".")→ r.length()>=m( 8>=4) index সূচক 0থেকে m+1( 5)) এ বিস্তৃত হয়
6.9& m=2,k=2থাকে 6.9(কারণ becomes k>=1তাই rহয়ে যায় 6.900; r.length()>=m( 5>=2) → r.contains(".")→ r.length()>=m( 5>=2) index সূচক 0থেকে m+1( 3)) এ বিস্তৃত হয়
1.0& m=3,k=0হয়ে যায় 1(কারণ becomes k<1তাই rহয়ে যায় 1; r.length()<m( 1<3) index সূচক 0থেকে r.length()( 1)) এ বিস্তৃত হয়
25.0& m=4,k=4হয়ে যায় 25.00(কারণ becomes k>=1তাই rহয়ে যায় 25.00000; r.length()>=m( 8>=4) → r.contains(".")→ r.length()>+m( 8>=4) index সূচক 0থেকে m+1( 5)) এ বিস্তৃত হয়
0& m=1,k=0স্থির হয় 0(কারণ k<1→ তাই rথাকে 0; r.length()>=m( 1>=1) → !r.contains(".")index সূচক 0থেকে m( 1)) এর উপরের থাকে
for(i=r.length();i++<l;)
r+=0;
এটি প্রয়োজন অনুসারে পিছনের জিরোগুলি পূর্বে পূর্ণসংখ্যার অংশে রেখে দেয়।
r="12"& R=1200.0হয়ে যায়r="1200"
r="1"& R=10.0হয়ে যায়r="10"
r="8"& R=80.0হয়ে যায়r="80"
return r.replaceAll(z+"$","");
এবং অবশেষে আমরা ফলাফলটি ফিরে আসি, আমরা কোনও পিছনের বিন্দু সরিয়ে দেওয়ার পরে।
1203. হয়ে 1203
5. হয়ে 5
কয়েকশ বাইটের দ্বারা অবশ্যই গল্ফ করা যেতে পারে তবে আমি এখন খুশি যে এটি এখন কাজ করছে। ইতিমধ্যে প্রতিটি মামলা এবং চ্যালেঞ্জটিতে কী জিজ্ঞাসা করা হয়েছিল তা বুঝতে কিছুক্ষণ সময় নিয়েছে। এবং তারপরে এটি অনেকগুলি পরীক্ষা-নিরীক্ষা এবং ত্রুটি নিয়েছে, উপরের ফলাফলটি পেতে পরীক্ষার এবং পুনরায় পরীক্ষা করে নিচ্ছে। এবং উপরে এই ব্যাখ্যাটি লেখার সময় আমি অব্যবহৃত কোডের আরও 50 ডলার বাইটগুলি সরাতে সক্ষম হয়েছি ..
999 + 2.00,।