Quatro é o número mágico

Não verifiquei a sandbox antes de postar este desafio – parece que este desafio foi proposto por Cᴏɴᴏʀ O “Bʀɪᴇɴ .

Dada uma entrada inteira, escreva um programa que imprima os” quatro é um número mágico “enigma

  • Quatro é o número mágico
  • Cinco é quatro e quatro é o número mágico
  • Seis é três e três é cinco e cinco é quatro e quatro é o número mágico
  • Onze é seis e seis é três e três é cinco e cinco é quatro e quatro é o número mágico
  • Quinhentos é onze e onze é seis e seis é três e três é cinco e cinco é quatro e quatro é o número mágico

Se você já conhece o enigma ou é preguiçoso demais para resolvê-lo ansioso para descobrir qual é o enigma, aqui está uma explicação

O próximo número é o número de letras do número anterior. Então, para e xample, cinco tem quatro letras, então o próximo número é quatro .

seis tem três letras, então o próximo número é 3 e três tem cinco letras, então o próximo número é 5 e cinco tem quatro letras, então o próximo número é 4

A razão pela qual o enigma termina em quatro é porque quatro tem quatro letras, e quatro são quatro e quatro são quatro e quatro são quatro … (quatro é o número mágico )

Casos de teste

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 

Regras

  • A entrada pode ser obtida de STDIN ou como um argumento para uma função ção
  • A entrada será um número positivo entre 0 e 999.999
  • A entrada irá apenas conter números (seguirá o regex ^[0-9]+$)
  • A entrada pode ser considerada como um número inteiro ou uma string
  • Quando convertida em uma string de palavra, espaços e hifens não devem ser incluídos no contagem (100 [Cem] tem 10 caracteres, não 11. 1.742 [Um mil setecentos e quarenta e dois] tem 31 caracteres, não 36)
  • Quando convertido em uma string, 100 deve ser Cem, não cem ou cem, 1000 deve ser cem, não mil ou mil.
  • Quando convertido para uma string 142 deve ser cento e quarenta e dois, não cem e quarenta Dois
  • A saída é não diferencia maiúsculas de minúsculas e deve seguir o formato “ N é K e K é M e M é … e quatro é o número mágico “(a menos que a entrada seja 4, caso em que a saída deve ser simplesmente” quatro é o número mágico “)
  • A saída pode usar números em vez de letras (“5 é 4 e 4 é o número mágico” em vez de “cinco é quatro e quatro é o número mágico”), desde que seu programa seja sempre consistente
  • O resultado pode ser o valor de retorno de uma função ou impresso em STDOUT
  • Brechas padrão se aplicam
  • Este é o , então o programa mais curto em bytes vence. Boa sorte!

Bônus

-30 bytes se o programa funciona quando a entrada está entre -999.999 e 999.999.

Os números negativos, quando convertidos em palavras, têm apenas “negativo” na frente deles. Por exemplo, -4 é “Negativo Quatro”, Negativo Quatro é doze e doze é seis e seis é três e três é cinco e cinco é quatro e quatro é o número mágico

-150 bytes se o programa não usar nenhuma função interna para gerar a representação em sequência do número

Leaderboard

Este é um trecho de pilha que gera um leaderboard e uma visão geral dos vencedores por idioma.

Para garantir que sua resposta seja exibida, comece com um título usando o seguinte modelo Markdown

## Language Name, N bytes 

Onde N é o tamanho , em bytes, de seu envio

Se você deseja incluir vários números em seu cabeçalho (por exemplo, riscando pontuações antigas ou incluindo sinalizadores na contagem de bytes), certifique-se de que a pontuação real seja o último número em seu cabeçalho

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

Comentários

  • Existe uma entrada máxima possível?
  • No futuro, verifique também o Sandbox para ver se

    outra pessoa teve sua ideia .

  • @El ' endiaStarman Tudo bem, adicionei algum texto no topo do desafio com links para aquela postagem
  • Seu bônus de função embutido deve ser mais como -150 a -200 bytes.
  • I ' vou apenas jogar isso lá fora – até mesmo o número mais otimizado para conversores de nomes dificilmente vai custar menos de 150 bytes para a maioria dos idiomas, já que -150 é mais uma armadilha do que um bônus.

Resposta

Bash + utilitários comuns (incluindo jogos bsd), 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

Felizmente, a saída dos bsd-games number utilitário é quase exatamente o que precisamos. Os números de saída são todos escritos numericamente e não em palavras de acordo com o 8º marcador:

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

Resposta

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 por a resposta de Cole Cameron . Achei que poderia fazer melhor sem a definição de macro. Embora eu finalmente tenha conseguido, demorou um pouco para conseguir!

Requer um conjunto de caracteres de host com letras consecutivas (então ASCII está bem, mas EBCDIC não funciona). Isso é para o par de Tabelas de pesquisa. Escolhi j como o caractere zero e aproveitei a necessidade de duas pesquisas, para poder subtrair uma da outra em vez de ter que subtrair meu zero de ambos.

Versão 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 uma extensão óbvia para apoiar milhões , substituindo f(n/1000,8) por f(n/1000000,7)+f(n/1000%1000,8).

Teste de saída

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 

Resposta

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

Estou simplesmente surpreso que isso use strings e não seja ridiculamente longo.

Resposta

Swift 2 , 408 419 – 30 = 389 bytes

Eu seria capaz de obter livre de 176 bytes se o Swift não fosse tão prolixo com expressões regulares (removendo hífens e espaços) * olha para 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"}  

Isso pode ser testado em swiftstub.com, aqui

Corri um pequeno loop for e descobri que 100003 é o número entre 0 e 999999 tem o resultado de string mais longo, que tem 6 iterações e é

100003 é 23 e 23 é 11 e 11 é 6 e 6 é 3 e 3 é 5 e 5 é 4 e 4 é o número mágico

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

Comentários

  • NSStringCompareOptions.RegularExpressionSearch E pensei JS ' s String.fromCharCode foi prolixo. : P
  • Python e Ruby: string.replace.Swift: String.stringByReplacingOccurrencesOfString

Resposta

Haskell, 285 – 180 = 105 bytes

Na verdade, não há nenhum embutido para exibir o número. Ainda estou insatisfeito com o placar. Sinta-se à vontade para comentar. Vou experimentar mais, no entanto. Ainda assim, a pontuação é melhor do que a pontuação 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"  

Explicação.

m é trivial o suficiente, no entanto, o c não é. c é a função para contar o número de caracteres do nome em inglês de 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. 

Comentários

  • Ah sim? Bem, Swift tem … uhm. .. uma pontuação mais alta … (eu ' não sou muito bom em respostas)

Resposta

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

Experimente aqui .

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

Resposta

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

Jogado golfe

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

Comentários

  • Eu sei que ' já faz mais de um ano, mas você pode remover alguns parênteses nessa atribuição ternária, bem como alterar ==0 para <1. Portanto: 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 )

Resposta

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 testes

Sem golfe:

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

Comentários

  • Se você ' não estiver usando uma função incorporada para obter o comprimento do número, para que você possa realmente subtrair outro 150 de sua pontuação

Resposta

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

A entrada é fornecida como o parâmetro para a expressão de função invocada imediatamente.

Teste de entrada:

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 

Sem golfe:

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

Resposta

Python 641-150 = 501 bytes

Pelo menos não é maior que Java! É baseado em isto exceto usando strings.

EDITAR : I esqueci 0 e que preciso dizer " 5 é 4 ", não pule para " 4 é o número mágico " – que acrescentou um pouco à pontuação.

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) 

Experimente aqui!

Comentários

  • Você não ' não é necessário exibir o nome, certo?
  • Isso está incorreto. i(5) imprime 4 is the magic number, em vez de 5 is 4 and 4 is the magic number.

Resposta

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

Resposta

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

Versão 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 dependente da implementação versão:

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 são funções.

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *