Cuatro es el número mágico

No comprobé la zona de pruebas antes de publicar este desafío. – parece que este desafío fue propuesto por Cᴏɴᴏʀ O «Bʀɪᴇɴ .

Dada una entrada entera, escribe un programa que imprima el» cuatro es un número mágico «acertijo

  • Cuatro es el número mágico
  • Cinco es cuatro y cuatro es el número mágico
  • Seis es tres y tres es cinco y cinco es cuatro y cuatro es el número mágico
  • Once es seis y seis es tres y tres es cinco y cinco es cuatro y cuatro es el número mágico
  • Quinientos es once y once es seis y seis es tres y tres es cinco y cinco es cuatro y cuatro es el número mágico

Si ya conoces el acertijo, o eres demasiado perezoso para resolverlo ansioso por averiguar cuál es el acertijo, aquí hay una explicación

El siguiente número es el número de letras del número anterior. Entonces, para e xample, cinco tiene cuatro letras, por lo que el siguiente número es cuatro .

seis tiene tres letras, por lo que el siguiente número es 3 y tres tiene cinco letras, por lo que el siguiente número es 5 y cinco tiene cuatro letras, por lo que el siguiente número es 4

La razón por la que el acertijo termina en cuatro es porque cuatro tienen cuatro letras, y cuatro son cuatro y cuatro son cuatro y cuatro son cuatro … (cuatro es el número mágico )

Casos de prueba

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 

Reglas

  • La entrada puede tomarse de STDIN o como argumento de una función
  • La entrada será un número positivo entre 0 y 999,999
  • La entrada solo contendrá números (seguirá la expresión regular ^[0-9]+$)
  • La entrada puede tomarse como un número entero o una cadena
  • Cuando se convierte en una cadena de palabras, los espacios y guiones no deben incluirse en la cuenta (100 [Cien] son 10 caracteres, no 11. 1.742 [Mil setecientos cuarenta y dos] son 31 caracteres, no 36)
  • Cuando se convierte en una cadena, 100 debe ser Cien, no cien o cien, 1000 debe ser mil, no mil o mil.
  • Cuando se convierte en una cadena, 142 debe ser ciento cuarenta y dos, no cien y cuarenta Dos
  • La salida es que no distingue entre mayúsculas y minúsculas y debe seguir el formato « N es K y K es M y M es … y cuatro es el número mágico «(a menos que la entrada sea 4, en cuyo caso la salida debería ser simplemente» cuatro es el número mágico «)
  • La salida puede usar números en lugar de letras («5 es 4 y 4 es el número mágico» en lugar de «cinco es cuatro y cuatro es el número mágico») siempre y cuando su programa sea siempre consistente
  • La salida puede ser el valor de retorno de una función o imprimirse en STDOUT
  • Se aplican lagunas legales
  • Esto es , por lo que gana el programa más corto en bytes. ¡Buena suerte!

Bonificación

-30 bytes si el programa funciona cuando la entrada está entre -999,999 y 999,999.

Los números negativos, cuando se convierten en palabras, solo tienen «negativo» delante de ellos. Por ejemplo, -4 es «Cuatro negativos», Cuatro negativos son doce y doce son seis y seis son tres y tres son cinco y cinco son cuatro y cuatro es el número mágico

-150 bytes si el programa no usa ninguna función incorporada para generar la representación de cadena del número

Tabla de clasificación

Este es un fragmento de pila que genera tanto una tabla de clasificación como una descripción general de los ganadores por idioma.

Para asegurarse de que su respuesta aparezca, comience su respuesta con un título usando la siguiente plantilla de Markdown

## Language Name, N bytes 

Donde N es el tamaño , en bytes, de su envío

Si desea incluir varios números en su encabezado (por ejemplo, tachando puntajes antiguos o incluyendo banderas en el recuento de bytes), asegúrese de que el puntaje real sea el último número en su encabezado

## 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> 

Comentarios

  • ¿Hay una entrada máxima posible?
  • En el futuro, compruebe también la zona de pruebas para ver si

    alguien más tuvo tu idea .

  • @El ' endiaStarman Muy bien, agregué un texto en el parte superior del desafío vinculando a esa publicación
  • Su bonificación de función incorporada debe ser más como -150 a -200 bytes.
  • I ' Voy a tirar esto por ahí: incluso el número más increíblemente optimizado para los convertidores de nombres apenas va a costar menos de 150 bytes para la mayoría de los idiomas, tal como está el -150 es más una trampa que una bonificación.

Respuesta

Bash + utilidades comunes (incluidos bsd-games), 123 – 30 = 93 bytes

 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  

Afortunadamente, el resultado de los bsd-games La number utilidad es casi exactamente lo que necesitamos. Los números de salida se escriben todos numéricamente y no en palabras según el octavo punto:

$ ./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 $ 

Respuesta

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");}  

Inspirado en la respuesta de Cole Cameron . Pensé que podría hacerlo mejor sin la definición macro. Aunque finalmente lo logré, ¡me costó un poco de esfuerzo lograrlo!

Requiere un conjunto de caracteres de host con letras consecutivas (así que ASCII está bien, pero EBCDIC no funcionará). Eso es para el par de tablas de búsqueda. Elegí j como el carácter cero, y aproveché la necesidad de dos búsquedas, para poder restar una de la otra en lugar de tener que restar mi cero de ambas.

Versión comentada:

 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"); }  

Existe una extensión obvia para admitir millones , reemplazando f(n/1000,8) con f(n/1000000,7)+f(n/1000%1000,8).

Salida de prueba

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 

Respuesta

Mathematica, 156 – 30 = 126 bytes

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

Estoy simplemente sorprendido de que esto use cadenas y no ridículamente largo.

Respuesta

Swift 2 , 408 419 – 30 = 389 Bytes

Podría obtener deshacerse de 176 bytes si Swift no era tan detallado con expresiones regulares (eliminando guiones y espacios) * mira a 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"}  

Esto se puede probar en swiftstub.com, aquí

Ejecuté un poco el bucle for, y resultó que 100003 es el número entre 0 y 999999 tiene el resultado de cadena más largo, que tiene 6 iteraciones, y es

100003 es 23 y 23 es 11 y 11 es 6 y 6 es 3 y 3 es 5 y 5 es 4 y 4 es el número mágico

Sin golf

 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" }  

Comentarios

  • NSStringCompareOptions.RegularExpressionSearch Y pensé que JS ' s String.fromCharCode era detallado. : P
  • Python y Ruby: string.replace.Swift: String.stringByReplacingOccurrencesOfString

Responder

Haskell, 285 – 180 = 105 Bytes

De hecho, no hay nada incorporado para mostrar el número. Todavía estoy insatisfecho con la partitura. Siéntete libre de comentar. Sin embargo, experimentaré más. Aún así, la puntuación es mejor que la puntuación de 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)  

uso

 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"  

Explicación.

m es bastante trivial, sin embargo, c no lo es. c es la función para contar el número de caracteres del nombre en inglés del número.

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. 

Comentarios

  • ¿Ah, sí? Bueno, Swift tiene … uhm. .. una puntuación más alta … (Yo ' no soy muy bueno en las remontadas)

Respuesta

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");}  

Pruébelo aquí .

Sin golf

 /* 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"); }  

Respuesta

Java, 800 – 150 = 650 bytes

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)));}} 

Sin 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))); } } 

Comentarios

  • Sé que ' ha pasado más de un año, pero puedes quitar algunos paréntesis en esa asignación ternaria y cambiar ==0 a <1. Entonces: 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 bytes )

Respuesta

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"+ 

Conjunto de pruebas

Sin golf:

(✵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"+ 

Comentarios

  • Si ' no está utilizando una función incorporada para obtener la longitud del número, por lo que puede restar otros 150 de su puntuación

Respuesta

JavaScript, 382 – 150 – 30 = 202 bytes

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");})() 

La entrada se proporciona como parámetro para la expresión de función invocada inmediatamente.

Entrada de prueba:

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 

Sin golf:

// 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) 

Respuesta

Python 641-150 = 501 bytes

¡Al menos no es más largo que Java! Está basado en esto excepto el uso de cadenas.

EDIT : I me olvidé de 0 y que necesito decir " 5 es 4 ", no pasar a " 4 es el número mágico ", que agregó un poco a la puntuación.

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) 

Pruébelo aquí

Comentarios

  • No ' No tiene que mostrar el nombre, ¿verdad?
  • Esto es incorrecto. i(5) imprime 4 is the magic number, en lugar de 5 is 4 and 4 is the magic number.

Respuesta

PHP, 168 – 30 = 138 bytes

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));} 

Respuesta

Moo, 182 176 / 192 188 bytes – 30 = 146/158

Versión de 188 bytes:

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 bytes dependiente de la implementación versión:

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" 

Ambas son funciones.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *