Patru este numărul magic

Nu am verificat sandbox înainte de a posta această provocare – se pare că această provocare a fost propusă de Cᴏɴᴏʀ O „Bʀɪᴇɴ .

Având o intrare întreagă, scrieți un program care tipărește„ patru este un număr magic „ghicitoare

  • Patru este numărul magic
  • Cinci sunt patru și patru este numărul magic
  • Șase este trei și trei este cinci și cinci sunt patru și patru este numărul magic
  • Unsprezece este șase și șase este trei și trei este cinci și cinci este patru și patru este numărul magic
  • Cinci sute este unsprezece iar unsprezece este șase și șase este trei și trei este cinci și cinci este patru și patru este numărul magic

Dacă știți deja ghicitoarea sau sunteți prea leneși pentru a o rezolva nerăbdător să aflăm care este enigma, iată o explicație

Următorul număr este numărul de litere din numărul anterior. Deci, pentru e xample, cinci are patru litere, deci următorul număr este patru .

șase are trei litere, deci următorul număr este 3 și trei are cinci litere, deci următorul număr este 5 și cinci are patru litere, deci următorul număr este 4

Motivul pentru care ghicitoarea se termină la patru este că patru are patru litere, iar patru sunt patru și patru sunt patru și patru sunt patru … (patru este numărul magic )

Cazuri de testare

0 => Zero is four and four is the magic number 1 => One is three and three is five and five is four and four is the magic number 2 => Two is three and three is five and five is four and four is the magic number 3 => Three is five and five is four and four is the magic number 4 => Four is the magic number 5 => Five is four and four is the magic number 6 => Six is three and three is five and five is four and four is the magic number 7 => Seven is five and five is four and four is the magic number 8 => Eight is five and five is four and four is the magic number 9 => Nine is four and four is the magic number 10 => Ten is three and three is five and five is four and four is the magic number 17 => Seventeen is nine and nine is four and four is the magic number 100 => One Hundred is ten and ten is three and three is five and five is four and four is the magic number 142 => One Hundred Forty Two is eighteen and eighteen is eight and eight is five and five is four and four is the magic number 1,000 => One Thousand is eleven and eleven is six and six is three and three is five and five is four and four is the magic number 1,642 => One Thousand Six Hundred Forty Two is twenty nine and twenty nine is ten and ten is three and three is five and five is four and four is the magic number 70,000 => Seventy Thousand is fifteen and fifteen is seven and seven is five and five is four and four is the magic number 131,072 => One Hundred Thirty One Thousand Seventy Two is thirty seven and thirty seven is eleven and eleven is six and six is three and three is five and five is four and four is the magic number 999,999 => Nine Hundred Ninety Nine Thousand Nine Hundred Ninety Nine is fifty and fifty is five and five is four and four is the magic number 

Reguli

  • Intrarea poate fi preluată de la STDIN sau ca argument pentru o funcție acțiune
  • Introducerea va fi un număr pozitiv între 0 și 999.999
  • Introducerea va doar conține numere (va urma regex ^[0-9]+$)
  • Intrarea poate fi luată fie ca un întreg, fie ca un șir
  • Când este convertită într-un șir de cuvinte, spațiile și cratimele nu ar trebui incluse în count (100 [O sută] este de 10 caractere, nu 11. 1.742 [O mie Șapte sute patruzeci și două] este de 31 de caractere, nu 36)
  • Când este convertit într-un șir, 100 ar trebui să fie O sută, nu o sută sau o sută, 1000 ar trebui să fie o mie, nu o mie sau o mie.
  • Când este convertită într-un șir 142 ar trebui să fie o sută patruzeci și două, nu o sută și patruzeci Două
  • Ieșirea este fără majuscule și ar trebui să urmeze formatul „ N este K și K este M și M este … și patru este numărul magic „(cu excepția cazului în care intrarea este 4, caz în care ieșirea ar trebui să fie pur și simplu” patru este numărul magic „)
  • Ieșirea poate utiliza numere în loc de litere („5 este 4 și 4 este numărul magic” în loc de „cinci este patru și patru este numărul magic”) atâta timp cât programul dvs. este întotdeauna consistent
  • Rezultatul poate fi fie valoarea returnată a unei funcții, fie tipărită pe STDOUT
  • Se aplică lacune standard
  • Acesta este , deci câștigă cel mai scurt program în octeți. Noroc!

Bonus

-30 octeți dacă programul funcționează când intrarea este între -999.999 și 999.999.

Numerele negative, convertite în cuvinte, au doar „negative” în fața lor. De exemplu, -4 este „Patru negativ”, Patru negativ este doisprezece și doisprezece este șase și șase este trei și trei este cinci și cinci este patru și patru este numărul magic

-150 octeți dacă programul nu folosește nicio funcție încorporată pentru generarea reprezentarea în șir a numărului

Clasament

Acesta este un fragment de stivă care generează atât un clasament, cât și o prezentare generală a câștigătorilor în funcție de limbă.

Pentru a vă asigura că răspunsul dvs. apare, vă rugăm să începeți răspunsul cu un titlu folosind următorul șablon Markdown

## Language Name, N bytes 

Unde N este dimensiunea , în octeți, a trimiterii dvs.

Dacă doriți să includeți mai multe numere în antetul dvs. (de exemplu, marcarea scorurilor vechi sau includerea steagurilor în numărul de octeți), asigurați-vă că scorul real este numărul ultimul din antetul dvs.

## Language Name, <s>K</s> X + 2 = N bytes 
 var QUESTION_ID=67344;var OVERRIDE_USER=20634;function answersUrl(e){return"http://api.stackexchange.com/2.2/questions/"+QUESTION_ID+"/answers?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+ANSWER_FILTER}function commentUrl(e,s){return"http://api.stackexchange.com/2.2/answers/"+s.join(";")+"/comments?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+COMMENT_FILTER}function getAnswers(){jQuery.ajax({url:answersUrl(answer_page++),method:"get",dataType:"jsonp",crossDomain:!0,success:function(e){answers.push.apply(answers,e.items),answers_hash=[],answer_ids=[],e.items.forEach(function(e){e.comments=[];var s=+e.share_link.match(/\d+/);answer_ids.push(s),answers_hash[s]=e}),e.has_more||(more_answers=!1),comment_page=1,getComments()}})}function getComments(){jQuery.ajax({url:commentUrl(comment_page++,answer_ids),method:"get",dataType:"jsonp",crossDomain:!0,success:function(e){e.items.forEach(function(e){e.owner.user_id===OVERRIDE_USER&&answers_hash[e.post_id].comments.push(e)}),e.has_more?getComments():more_answers?getAnswers():process()}})}function getAuthorName(e){return e.owner.display_name}function process(){var e=[];answers.forEach(function(s){var r=s.body;s.comments.forEach(function(e){OVERRIDE_REG.test(e.body)&&(r="<h1>"+e.body.replace(OVERRIDE_REG,"")+"</h1>")});var a=r.match(SCORE_REG);a&&e.push({user:getAuthorName(s),size:+a[2],language:a[1],link:s.share_link})}),e.sort(function(e,s){var r=e.size,a=s.size;return r-a});var s={},r=1,a=null,n=1;e.forEach(function(e){e.size!=a&&(n=r),a=e.size,++r;var t=jQuery("#answer-template").html();t=t.replace("{{PLACE}}",n+".").replace("{{NAME}}",e.user).replace("{{LANGUAGE}}",e.language).replace("{{SIZE}}",e.size).replace("{{LINK}}",e.link),t=jQuery(t),jQuery("#answers").append(t);var o=e.language;/<a/.test(o)&&(o=jQuery(o).text()),s[o]=s[o]||{lang:e.language,user:e.user,size:e.size,link:e.link}});var t=[];for(var o in s)s.hasOwnProperty(o)&&t.push(s[o]);t.sort(function(e,s){return e.lang>s.lang?1:e.lang<s.lang?-1:0});for(var c=0;c<t.length;++c){var i=jQuery("#language-template").html(),o=t[c];i=i.replace("{{LANGUAGE}}",o.lang).replace("{{NAME}}",o.user).replace("{{SIZE}}",o.size).replace("{{LINK}}",o.link),i=jQuery(i),jQuery("#languages").append(i)}}var ANSWER_FILTER="!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe",COMMENT_FILTER="!)Q2B_A2kjfAiU78X(md6BoYk",answers=[],answers_hash,answer_ids,answer_page=1,more_answers=!0,comment_page;getAnswers();var SCORE_REG=/<h\d>\s*([^\n,]*[^\s,]),.*?(-?\d+)(?=[^\n\d<>]*(?:<(?:s>[^\n<>]*<\/s>|[^\n<>]+>)[^\n\d<>]*)*<\/h\d>)/,OVERRIDE_REG=/^Override\s*header:\s*/i; 
 body{text-align:left!important}#answer-list,#language-list{padding:10px;width:290px;float:left}table thead{font-weight:700}table td{padding:5px} 
 <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <link rel="stylesheet" type="text/css" href="//cdn.sstatic.net/codegolf/all.css?v=83c949450c8b"> <div> <h2>Leaderboard</h2> <table class="answer-list"> <thead> <tr><td></td><td>Author</td><td>Language</td><td>Size</td></tr></thead> <tbody> </tbody> </table> </div><div> <h2>Winners by Language</h2> <table class="language-list"> <thead> <tr><td>Language</td><td>User</td><td>Score</td></tr></thead> <tbody> </tbody> </table> </div><table style="display: none"> <tbody> <tr><td>{{PLACE}}</td><td>{{NAME}}</td><td>{{LANGUAGE}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr></tbody> </table> <table style="display: none"> <tbody> <tr><td>{{LANGUAGE}}</td><td>{{NAME}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr></tbody> </table> 

Comentarii

  • Există o intrare maximă posibilă?
  • În viitor, verificați și Sandbox pentru a vedea dacă

    altcineva a avut ideea ta .

  • @El ' endiaStarman Alright, am adăugat un text la partea de sus a provocării care se leagă de postarea respectivă
  • Bonusul funcției încorporate ar trebui să fie mai mult de -150 până la -200 octeți.
  • I ' Voi arunca acest lucru acolo – chiar și cel mai nebunesc număr optimizat pentru convertizoare de nume abia va costa mai puțin de 150 de octeți pentru majoritatea limbilor, deoarece se pare că -150 este mai mult o capcană decât un bonus.

Răspuns

Bash + utilitare comune (inclusiv jocuri bsd), 123 – 30 = 93 octeți

 for((n=$1;n-4;n=m)){ m=`number -l -- $n|sed "s/nus/&&/;s/\W//g"` s+="$n is $[m=${#m}] and " } echo $s 4 is the magic number  

Din fericire, ieșirea din bsd-games number utilitarul este aproape exact ceea ce avem nevoie. Numerele de ieșire sunt scrise numeric și nu în cuvinte conform punctului 8:

$ ./4magic.sh 131072 131072 is 37 and 37 is 11 and 11 is 6 and 6 is 3 and 3 is 5 and 5 is 4 and 4 is the magic number $ ./4magic.sh -4 -4 is 12 and 12 is 6 and 6 is 3 and 3 is 5 and 5 is 4 and 4 is the magic number $ 

Răspuns

C, 263 261 bytes – 180 = 81

 char*i="jmmonnmoonmpprrqqsrrjjddeeecdd",x;f(n,c){return!n?n:n<0?f(-n,8):n<100?c+i[n<20?n:n%10]-i[20+n/10]:f(n/1000,8)+f(n/100%10,7)+f(n/100%10,0)+c;}main(int c,char**v){for(c=atoi(*++v);c-4;c=x)printf("%d is %d and ",c,x=c?f(c,0)):4;puts("4 is the magic number");}  

Inspirat de răspunsul de la Cole Cameron . M-am gândit că aș putea să fac mai bine fără definiția macro. Deși în cele din urmă am reușit, a fost nevoie de ceva stoarcere pentru a obține!

Necesită un set de caractere gazdă cu litere consecutive (deci ASCII este în regulă, dar EBCDIC nu a funcționat). Asta este pentru perechea de tabele de căutare. Am ales j ca caracter zero și am profitat de necesitatea a două căutări, așa că aș putea scădea una din cealaltă, mai degrabă decât să-mi scăd zero-ul din ambele.

Versiune comentată:

 char*i= "jmmonnmoon" /* 0 to 9 */ "mpprrqqsrr" /* 10 to 19 */ "jjddeeecdd"; /* tens */ char x; /* current letter count */ f(n,c){ return !n?n /* zero - return 0 (ignore c) */ :n<0?f(-n,8) /* negative n (only reached if c==0) */ :n<100?c+i[n<20?n:n%10]-i[20+n/10] /* lookup tables */ : f(n/1000,8) /* thousand */ + f(n/100%10,7) /* hundred */ + f(n%100,0) /* rest */ + c; /* carry-in */ } main(int c, char**v) { for(c=atoi(*++v);c-4;c=x) printf("%d is %d and ",c,x=c?f(c,0):4); puts("4 is the magic number"); }  

Există o extensie evidentă pentru a susține milioane , prin înlocuirea f(n/1000,8) cu f(n/1000000,7)+f(n/1000%1000,8).

Rezultatul testului

0 is 4 and 4 is the magic number 1 is 3 and 3 is 5 and 5 is 4 and 4 is the magic number 2 is 3 and 3 is 5 and 5 is 4 and 4 is the magic number 3 is 5 and 5 is 4 and 4 is the magic number 4 is the magic number 5 is 4 and 4 is the magic number 6 is 3 and 3 is 5 and 5 is 4 and 4 is the magic number 7 is 5 and 5 is 4 and 4 is the magic number 8 is 5 and 5 is 4 and 4 is the magic number 9 is 4 and 4 is the magic number 10 is 3 and 3 is 5 and 5 is 4 and 4 is the magic number 17 is 9 and 9 is 4 and 4 is the magic number 100 is 10 and 10 is 3 and 3 is 5 and 5 is 4 and 4 is the magic number 142 is 18 and 18 is 8 and 8 is 5 and 5 is 4 and 4 is the magic number 1000 is 11 and 11 is 6 and 6 is 3 and 3 is 5 and 5 is 4 and 4 is the magic number 1642 is 29 and 29 is 10 and 10 is 3 and 3 is 5 and 5 is 4 and 4 is the magic number 70000 is 15 and 15 is 7 and 7 is 5 and 5 is 4 and 4 is the magic number 131072 is 37 and 37 is 11 and 11 is 6 and 6 is 3 and 3 is 5 and 5 is 4 and 4 is the magic number 999999 is 50 and 50 is 5 and 5 is 4 and 4 is the magic number 

Răspuns

Mathematica, 156 – 30 = 126 octeți

a=ToString;({a@#," is ",a@#2," and "}&@@@Partition[NestWhileList[#~IntegerName~"Words"~StringCount~LetterCharacter&,#,#!=4&],2,1])<>"4 is the magic number"& 

Sunt „pur și simplu surprins că acest lucru folosește șiruri și nu este” ridicol de lung.

Răspuns

Swift 2 , 408 419 – 30 = 389 octeți

aș putea obține scăpați de 176 de octeți dacă Swift nu era atât de detaliat cu expresii regulate (eliminarea cratimelor și spațiilor) * se uită la Apple *

 func c(var s:Int)->String{var r="";while(s != 4){r+="\(s)";let f=NSNumberFormatter();f.numberStyle=NSNumberFormatterStyle.SpellOutStyle;let v=f.stringFromNumber(s)!;s=v.stringByReplacingOccurrencesOfString("[- ]",withString:"",options:NSStringCompareOptions.RegularExpressionSearch,range:Range<String.Index>(start:v.startIndex,end:v.endIndex)).utf8.count+(s<0 ?3:0);r+=" is \(s) and "};return r+"4 is the magic number"}  

Acest lucru poate fi testat pe swiftstub.com, aici

Am fugit puțin pentru buclă și se dovedește că 100003 este numărul dintre 0 și 999999 are cel mai lung rezultat al șirului, care are 6 iterații și este

100003 este 23 și 23 este 11 și 11 este 6 și 6 este 3 și 3 este 5 și 5 este 4 și 4 este numărul magic

Ungolfed

 func a(var s: Int) -> String{ var r = "" while(s != 4){ r+="\(s)" let f = NSNumberFormatter() f.numberStyle = NSNumberFormatterStyle.SpellOutStyle let v = f.stringFromNumber(s)! s = v.stringByReplacingOccurrencesOfString( "[- ]", withString: "", options: NSStringCompareOptions.RegularExpressionSearch, range: Range<String.Index>(start: v.startIndex, end: v.endIndex) ).utf8.count + (s < 0 ? 3 : 0) r+=" is \(s) and " } return r+"4 is the magic number" }  

Comentarii

  • NSStringCompareOptions.RegularExpressionSearch Și am crezut că JS ' s String.fromCharCode a fost detaliat. : P
  • Python și Ruby: string.replace.Swift: String.stringByReplacingOccurrencesOfString

Răspuns

Haskell, 285 – 180 = 105 octeți

De fapt, nu există deloc încorporat pentru afișarea numărului. Încă sunt nemulțumit de scor. Simțiți-vă liber să comentați. Totuși, voi experimenta mai departe. Totuși, scorul este mai bun decât scorul Swift

 c n|n<0=8+c(-n)|n>999=r 1000+8|n>99=7+r 100|n>19=r 10+2-g[30..59]+g[20..29]|n>15=r 10-1|2>1=[0,3,3,5,4,4,3,5,5,4,3,6,6,8,8,7]!!n where{g=fromEnum.elem n;r k=c(mod n k)+c(div n k)} m 4="4 is the magic number" m 0="0 is 4 and "++m 4 m n=show n++" is "++show(c n)++" and "++m(c n)  

utilizare

 m 7 "7 is 5 and 5 is 4 and 4 is the magic number" m 999999 "999999 is 50 and 50 is 5 and 5 is 4 and 4 is the magic number"  

Explicație.

m este suficient de banal, cu toate acestea, c nu este. c este funcția de numărare a numărului de caractere al numelui englezesc de număr.

c n |n<0=8+c(-n) -- Add word "negative" in front of it, the length is 8 |n>999=r 1000+8 -- the english name for number with form xxx,yyy is xxx thousand yyy |n>99=7+r 100 -- the english name for number with form xyy is x hundred yy |n>19=r 10+2-g[30..59]+g[20..29] -- the english name for number with form xy with x more -- than 1 is x-ty. However *twoty>twenty, -- *threety>thirty, *fourty>forty, *fivety>fifty. |n>10=r 10-1-g(15:18:[11..13]) -- the english name for number with form 1x is x-teen. -- However, *oneteen>eleven, *twoteen>twelve, -- *threeteen>thirteen, *fiveteen>fifteen, -- *eightteen>eighteen |2>1=[0,3,3,5,4,4,3,5,5,4,3]!!n -- for number 0-10, the length is memorized. 0 is 0 -- because it is omitted. Input zero is handled -- separately. If we defined 0 to be 4, then -- 20 => twenty zero. where g =fromEnum.elem n -- Check if n is element of argument array, if true, 1 else 0 r k=c(mod n k)+c(div n k) -- Obvious. 

Comentarii

  • Da? Ei bine, Swift are … uhm. .. un scor mai mare … (Nu ' nu sunt foarte bun la reveniri)

Răspuns

C, 268 – 180 = 88 bytes

 #define t(x,o)n<x?o:f(n/x)+(n%x?f(n%x):0) char*i="4335443554366887798866555766";f(n){return t(1000,t(100,n<20?n<0?8+f(-n):i[n]-48:i[n/10+18]-48+(n%10?f(n%10):0))+7)+8;}main(n){for(scanf("%d",&n);n^4;n=f(n))printf("%d is %d and ",n,f(n));puts("4 is the magic number");}  

Încercați aici .

Ungolfed

 /* Encode number length in string (shorter representation than array) */ char*i="4335443554366887798866555766"; f(n) { return n < 1000 ? n < 100 ? n < 20 ? n < 0 ? 8 + f(-n) /* "Negative x" */ : i[n] - 48 /* "x" */ : i[n/10+18] + (n%10 ? f(n%10) : 0) /* 20-99 */ : f(n/100) + (n%100 ? f(n%100) : 0) + 7 /* x hundred y */ : f(n/1000) + (n%1000 ? f(n%1000) : 0) + 8; /* x thousand y */ } main(n) { /* Keep printing until you get to the magic number */ for(scanf("%d",&n);n^4;n=f(n)) printf("%d is %d and ",n,f(n)); puts("4 is the magic number"); }  

Răspuns

Java, 800 – 150 = 650 octeți

class G{static String e="",i="teen",j="ty",k="eigh",y="thir",d="zero",l="one",n="two",m="three",h="four",s="five",c="six",t="seven",b=k+"t",g="nine",D="ten",L="eleven",N="twelve",M=y+i,H=h+i,S="fif"+i,C=c+i,T=t+i,B=k+i,G=g+i,o="twen"+j,p=y+j,q="for"+j,r="fif"+j,u=c+j,v=t+j,w=k+j,x=g+j,A=" ",O=" hundred ",z,E;public static void main(String a[]){z=e;int l=new Integer(a[0]);do{E=a(l,1,e);l=E.replace(A,e).length();z=z+E+" is "+a(l,1,e)+" and ";}while(l!=4);System.out.print(z+h+" is the magic number");}static String a(int P,int _,String Q){String[]f={e,l,n,m,h,s,c,t,b,g,D,L,N,M,H,S,C,T,B,G,e,D,o,p,q,r,u,v,w,x};int R=20,X=10,Y=100,Z=1000;return P==0?(_>0?d:e):(P<R?f[P]+Q:(P<Y?(f[R+(P/X)]+" "+a(P%X,0,e)).trim()+Q:(P<Z?a(P/Y,0,O)+a(P%Y,0,e)+Q:a(P/Z,0," thousand ")+a((P/Y)%X,0,O)+a(P%Y,0,e)+Q)));}} 

De-golf

class G { static String e="",i="teen",j="ty",k="eigh",y="thir",d="zero",l="one",n="two",m="three",h="four",s="five",c="six",t="seven",b=k+"t",g="nine",D="ten",L="eleven",N="twelve",M=y+i,H=h+i,S="fif"+i,C=c+i,T=t+i,B=k+i,G=g+i,o="twen"+j,p=y+j,q="for"+j,r="fif"+j,u=c+j,v=t+j,w=k+j,x=g+j,A=" ",O=" hundred ",z,E; public static void main(String a[]){ z = e; int l = new Integer(a[0]); do { E = a(l,1,e); l = E.replace(A,e).length(); z = z+E+" is "+a(l,1,e)+" and "; } while(l!=4); System.out.println(z+h+" is the magic number"); } static String a(int P,int _,String Q) { String[] f = {e,l,n,m,h,s,c,t,b,g,D,L,N,M,H,S,C,T,B,G,e,D,o,p,q,r,u,v,w,x}; int R=20,X=10,Y=100,Z=1000; return P==0?(_>0?d:e):(P<R?f[P]+Q:(P<Y?(f[R+(P/X)]+" "+a(P%X,0,e)).trim()+Q:(P<Z?a(P/Y,0,O)+a(P%Y,0,e)+Q:a(P/Z,0," thousand ")+ a((P/Y)%X,0,O)+a(P%Y,0,e)+Q))); } } 

Comentarii

  • Știu că ' a trecut mai mult de un an, dar puteți elimina unele paranteze în acea atribuire ternară, precum și puteți schimba ==0 la <1. Deci: return P<1?_>0?d:e:P<R?f[P]+Q:P<Y?(f[R+(P/X)]+" "+a(P%X,0,e)).trim()+Q:P<Z?a(P/Y,0,O)+a(P%Y,0,e)+Q:a(P/Z,0," thousand ")+a((P/Y)%X,0,O)+a(P%Y,0,e)+Q; ( – 10 octeți )

Răspuns

QC, 265 – 30 – 150 = 85 bytes

(✵1:oaT%=ta100%=ha100/⌋T%=X[0 3 3 5 4 4 3 5 5 4 3 6 6 8 8 7 7 9 8 8]=Y[6 6 5 5 5 7 6 6]=a0≟4a20<Xt☌YtT/⌋2-☌Xo☌+▲▲hXh☌7+0▲+)(❆1:na0<8*=ba‖1000/⌋=ca1000%=nbb✵8+0▲a✵++){I4≠:EEI" is "++=II❆=EEI" and "++=E!}E"4 is the magic number"+ 

Test suite

Ungolfed:

(✵1: oaT%= # ones ta100%= # tens ha100/⌋T%= # hundreds X[0 3 3 5 4 4 3 5 5 4 3 6 6 8 8 7 7 9 8 8]= # length of "zero", "one", "two", ..., "nineteen" Y[6 6 5 5 5 7 6 6]= # length of "twenty", ..., "ninety" a0≟ 4 a20< Xt☌ YtT/⌋2-☌ Xo☌ + ▲ ▲ hXh☌7+0▲+) (❆1: na0<8*= # if negative, add 8 ba‖1000/⌋= # split aaaaaa into bbbccc ca1000%= n bb✵8+0▲ a✵ ++) {I4≠:EEI" is "++=II❆=EEI" and "++=E!}E"4 is the magic number"+ 

Comentarii

  • Dacă ' nu utilizați o funcție încorporată pentru a obține lungimea număr, astfel încât să puteți scădea încă un 150 din scorul dvs.

Răspuns

JavaScript, 382 – 150 – 30 = 202 octeți

var o=[0,3,3,5,4,4,3,5,5,4],f=s=>(s[1]==1?[3,6,6,8,8,7,7,9,8,8][s[0]]:o[s[0]]+(s.length>1?[0,3,6,6,5,5,5,7,6,6][s[1]]:0))+(s.length==3?(7+o[s[2]]-(o[s[2]]==0?7:0)):0),l=n=>{var s=(""+n).split("").reverse();return f(s.slice(0,3))+(s.length>3?(f(s.slice(3,6))+8):0)};(n=>{var s="";while(n!=4){s+=n+" is ";n=n>=0?l(n):(l(-n)+8);s+=n+" and ";}console.log(s+"4 is the magic number");})() 

Intrarea este dată ca parametru pentru Expresia funcției invocate imediat.

Test de intrare:

999999 -> 999999 is 50 and 50 is 5 and 5 is 4 and 4 is the magic number 17 -> 17 is 9 and 9 is 4 and 4 is the magic number -404 -> -404 is 23 and 23 is 11 and 11 is 6 and 6 is 3 and 3 is 5 and 5 is 4 and 4 is the magic number 

De-gol:

// array of the lengths of digits in ones place: // one is 3, two is 3, three is 5, etc... zero is a special case // and is assigned zero length because zero is never written out in a number name var o=[0,3,3,5,4,4,3,5,5,4], // function that computes the length of a substring of the input // because the input is 6 digits, it can be broken into two 3 digit subsections // each of which can have it"s length calculated separately f=s=> ( s[1]==1? // check for if the tens digit is a one // when the tens is a one, pull the string length from an array that represents // ten, eleven, twelve, thirteen, etc... [3,6,6,8,8,7,7,9,8,8][s[0]] : // when the tens digit is not a one, add the ones digit normally and... o[s[0]] + // add the tens digit length from the array that represents // zero, ten, twenty, thirty, forty, fifty, sixty, seventy, eighty, ninety (s.length>1?[0,3,6,6,5,5,5,7,6,6][s[1]]:0) ) + ( s.length==3? // check if the length is 3 and weren"t not accidentally trying to do something wierd with a minus sign // if so, then we have to add a hundred (7 characters) to the length and the // length of the ones digit that is in the hundreds place like // "one" hundred or "two" hundred (7+o[s[2]]- ( // also, if the hundreds place was a zero, subtract out those 7 characters // that were added because "hundred" isn"t added if there"s a zero in its // place o[s[2]]==0? 7 : 0 ) ) : // if the length wasn"t 3, then don"t add anything for the hundred 0 ), // function that computes the length of the whole six digit number l=n=>{ // coerce the number into a string and then reverse the string so that the // ones digit is the zeroth element instead of last element var s=(""+n).split("").reverse(); return // calculate the character length of the first 3 characters // like in the number 999888, this does the "888" f(s.slice(0,3)) + // then if there actually are any characters after the first 3 (s.length>3? // parse the character length of the second 3 characters (f(s.slice(3,6))+8) : 0 ) }; // lastly is the Immediately-Invoked Function Expression (n=>{ var s=""; // as long as we haven"t reached four, just keep going through the loop while(n!=4){ s+=n+" is "; n=n>=0?l(n):(l(-n)+8) // this handles negatives by only passing positive values to l and then just adding 8 onto the length for negatives s+=n+" and "; } // finally just say that "4 is the magic number" console.log(s+"4 is the magic number"); })(999999) 

Răspuns

Python 641-150 = 501 bytes

Cel puțin nu este „mai lung decât Java! Se bazează pe aceasta cu excepția utilizării șirurilor.

EDIT : I am uitat de 0 și că trebuie să spun " 5 este 4 ", nu săriți la " 4 este numărul magic " – care a adăugat un pic la scor.

w={0:"zero",1:"one",2:"two",3:"three",4:"four",5:"five",6:"six",7:"seven",8:"eight",9:"nine",10:"ten",11:"eleven",12:"twelve",13:"thirteen",14:"fourteen",15:"fifteen",16:"sixteen",17:"seventeen",18:"eighteen",19:"nineteen",20:"twenty",30:"thirty",40:"forty",50:"fifty",60:"sixty",70:"seventy",80:"eighty",90:"ninety"} s="" def i(n): global s e="" o=n%10 t=n%100 h=n/100%10 th=n/1000 if th: e+=i(th) e+="thousand" if h: e+=w[h] e+="hundred" if t: if t<20 or o==0: e+=w[t] else: e+=w[t-o] e+=w[o] if len(e)==4:s+="4 is the magic number";print s else: s+="%d is %d and "%(n,len(e));i(len(e)) In=input() i(In) 

Încercați aici!

Comentarii

  • Nu aveți ' nu trebuie să afișați numele, nu?
  • Acest lucru este incorect. i(5) tipărește 4 is the magic number, în loc de 5 is 4 and 4 is the magic number.

Răspuns

PHP, 168 – 30 = 138 octeți

function m($i){$e=strlen(preg_replace("/[^a-z-]/","",(new NumberFormatter("en",5))->format($i)));echo($i==$e?"":"$i is $e and "),($e==4?"4 is the magic number":m($e));} 

Răspuns

Moo, 182 176 / 192 188 octeți – 30 = 146/158

Versiune de 188 octeți:

u=$string_utils;s="";i=args[1];while(i-4)j=u:english_number(i);s=s+j+(s?" and "+j|"")+" is ";i=length(u:strip_chars(j,"- "}));endwhile;return s+(s?"four and "|"")+"four is the magic number" 

176 octeți dependent de implementare versiune:

s="";i=args[1];while(i-4)j=#20:english_number(i);s=s+j+(s?" and "+j|"")+" is ";i=length(#20:strip_chars(j," -"));endwhile;return s+(s?"four and "|"")+"four is the magic number" 

Ambele sunt funcții.

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *