Dört sihirli sayıdır


26

Bu mücadeleyi göndermeden önce sanal alanı kontrol etmedim - bu meydan okuma Cᴏɴᴏʀ O'Bʀɪᴇɴ tarafından önerilmiş gibi görünüyor .

Bir tamsayı girişi göz önüne alındığında, "dört bir sihirli sayıdır" bilmecesini yazdıran bir program yazın

  • Dört sihirli sayıdır
  • Beş dört ve dört sihirli sayı
  • Altı, üç, üç, beş, beş, dört, ve dördüncü, sihirli sayı.
  • Onbir altı ve altı üç ve üç beş ve beş dört ve dört sihirli sayı
  • Beş Yüz onbir ve onbir altı ve altı üç ve üç beş ve beş dört ve dört sihirli sayı

Eğer bilmeceyi zaten biliyorsan ya da bilmecenin ne olduğunu bulmak için endişeli çözmek için çok tembelsen , işte bir açıklama

Bir sonraki sayı, önceki sayıdaki harf sayısıdır. Yani, örneğin, beş sahiptir dört sonraki sayıdır nedenle, harfler dört .

Altı vardır üç sonraki sayıdır nedenle, harfleri 3 ve üç sahiptir beş sonraki sayıdır nedenle, mektuplar 5 ve beş sahiptir dört harf sonraki sayıdır nedenle, 4

dört dört harfi vardır çünkü dörtte bilmece uçları olmasının sebebi , dördü dördü dördü dördü dördü dördü dördü dördü ... (dördü sihirli sayı)

Test Kılıfları

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

kurallar

  • Girdi, STDINişlevden veya bir işlevin argümanı olarak alınabilir.
  • Giriş 0 ile 999.999 arasında pozitif bir sayı olacaktır.
  • Girdi yalnızca sayıları içerecek (regex'i takip edecek ^[0-9]+$)
  • Giriş, bir tam sayı veya dize olarak alınabilir.
  • Bir kelime dizgisine dönüştürüldüğünde, boşluklar ve kısa çizgiler sayıma dahil edilmemelidir (100 [Yüz], 10 değil, 10 karakterdir. 1.742 [Bin Yedi Kırk İki], 31 değil, 31 karakterdir)
  • Bir dizgiye dönüştürüldüğünde, 100, Yüz veya Yüz değil, Yüz Bin veya Bin veya Yüz olmalıdır.
  • Bir dizeye dönüştürülür zaman 142 Yüz Kırk İki, değil Yüz olmalıdır ve Kırk İki
  • Çıktı büyük / küçük harf duyarsızdır ve " N , K ve K , M ve M'dir ... ve dört, sihirli sayıdır" biçiminde olmalıdır (girdi 4 değilse, çıktı basitçe "dört olmalıdır" sihirli sayı ")
  • Çıktı , programınız her zaman tutarlı olduğu sürece, harfler yerine ("5, 4 ve 4, sihirli sayıdır") yerine "beş, dört ve dört, sihirli sayıdır" yerine rakamlar kullanabilir.
  • Çıktı, bir işlevin dönüş değeri olabilir veya STDOUT
  • Standart boşluklar uygulanır
  • Bu , yani bayt cinsinden en kısa program kazanır. İyi şanslar!

Bonus

Giriş -999,999 ve 999,999 arasında olduğunda program çalışıyorsa -30 bayt .

Negatif sayılar, kelimelere dönüştürüldüğünde, önünde "negatif" var. Örneğin -4, "Negatif Dört", Negatif Dört on iki ve on iki altı ve altı, üç ve üç beş ve beş, dört ve dört, sihirli sayıdır.

Program, numaranın dize gösterimini oluşturmak için herhangi bir yerleşik işlevi kullanmazsa -150 bayt

Liderler Sıralaması

Bu, hem lider tablosunu hem de kazananların dile göre genel bir bakış oluşturmasını sağlayan bir Stack Snippet'tir.

Cevabınızın göründüğünden emin olmak için, lütfen aşağıdaki Markdown şablonunu kullanarak cevabınızı bir başlık ile başlatın

## Language Name, N bytes

N, gönderinizin bayt olarak büyüklüğüdür.

Başlığınıza birden çok numara eklemek istiyorsanız (örneğin, eski puanlara dikkat çekmek veya bayt sayımındaki bayraklar dahil), gerçek puanın başlığınızdaki son sayı olduğundan emin olun.

## Language Name, <s>K</s> X + 2 = N bytes


Mümkün olan azami giriş var mı?
Arcturus

7
Gelecekte, başka birinin fikrinizin olup olmadığını görmek için lütfen Sandbox'ı da kontrol edin .
El'endia Starman

@ El'endiaStarman Pekala, bu yazıya bağlanan mücadelenin en üstüne bazı metinler ekledim
Jojodmo

Dahili fonksiyon bonusunuz -150 ile -200 bayt arasında olmalıdır.
TanMath

1
Bunu oraya fırlatacağım - dönüştürücülere isimlendirmek için en delice optimize edilmiş numara bile çoğu dilde 150 bayttan daha azına mal olacak, -150 gibi bir bonusdan daha fazla tuzak.
ricdesi

Yanıtlar:


9

Bash + ortak yardımcı programları (bsd oyunlar dahil), 123 - 30 = 93 bayt

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

Neyse ki, bsd-games numberprogramından çıkan sonuç , tam olarak ihtiyacımız olan şey. Çıktı numaralarının tümü sayısal olarak yazılmıştır ve 8. madde işaretine göre yazılmaz:

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

6

C, 263 261 bayt - 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");}

Cole Cameron'dan gelen cevaptan esinlenildi . Makro tanımı olmadan daha iyisini yapabileceğimi düşündüm. Sonunda başardı rağmen, elde etmek için biraz sıkma aldı!

Ardışık harflerle ayarlanan bir ana bilgisayar karakteri gerektirir (yani ASCII tamam, ancak EBCDIC çalışmaz). Bu, arama tablolarının çifti için. jSıfır karakter olarak seçtim ve iki arama yapmak gerektiğinden faydalandım, böylece sıfırı her ikisinden de çıkarmak yerine birisini diğerinden çıkarabilirdim.

Yorumlanan sürüm:

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

Yerine koyarak milyonlarca destek açık bir uzantısı f(n/1000,8)var f(n/1000000,7)+f(n/1000%1000,8).

Test çıkışı

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

4

Mathematica, 156 - 30 = 126 bayt

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

Bunun dizeleri kullanmasına ve saçma bir şekilde uzun olmamasına şaşırdım .


4

Swift 2 , 408 419 - 30 = 389 Bayt

Swift, düzenli ifadelerle (tire ve boşlukları kaldırarak) çok ayrıntılı olmasaydı, 176 bayttan kurtulabilirdim * Apple'da *

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

Bu, swiftstub.com adresinde test edilebilir.

Döngü için biraz koştum ve sonuçta, 1000030 ile 999999 arasındaki sayı, 6 yinelemeye sahip en uzun dize sonucuna sahip ve

100003 olan 23 ve 23 olan 11 ve 11 olan 6 ve 6 olan 3 ve 3 olan 5 ve 5 olan 4 ve 4 sihirli sayıdır

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

7
NSStringCompareOptions.RegularExpressionSearchVe JS'nin String.fromCharCodeayrıntılı olduğunu sanıyordum . : P
ETH Sunumları

4
Python ve Ruby: string.replace. Swift:String.stringByReplacingOccurrencesOfString
Kedi

4

Haskell, 285 - 180 = 105 Bayt

Aslında, sayı görüntülemek için hiçbir yerleşik yoktur. Hala skordan memnun değildim. Yorum yapmaktan çekinmeyin. Yine de daha fazla deney yapacağım. Yine de skor Swift'in skorundan daha iyi.

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)

kullanım

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"

Açıklama.

myeterince önemsiz, ancak cöyle değil. csayının ingilizce isminin karakter sayımını saymak

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.

1
Oh evet? Eh, Swift ... uhm ... daha yüksek bir skor ... (geri dönüşlerde pek iyi değilim)
Jojodmo

4

C, 268-180 = 88 bayt

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

Burada dene .

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

3

Java, 800 - 150 = 650 bayt

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

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

Ben bir yıldan fazla oldu biliyorum ama siz de değişiklik olarak bu üçlü atamasında bazı parantez kaldırabilir ==0için <1. Yani: 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 bayt )
Kevin Cruijssen

3

QC, 265 - 30 - 150 = 85 bayt

(✵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 odası

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

Numaranın uzunluğunu almak için yerleşik bir işlev
kullanmıyorsanız

2

JavaScript, 382 - 150 - 30 = 202 bayt

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

Giriş, Hemen Çağrılan İşlev İfadesinin parametresi olarak verilir.

Test girişi:

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-golfed:

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

1

Python 641-150 = 501 bayt

En azından Java'dan daha uzun değil! Bu dayanmaktadır bu dizeleri kullanılarak hariç.

EDIT : 0 'ı unuttum ve "5 4" demeliyim, "4 sihirli sayı"' yı geçmeyin - bu skoru biraz arttırdı.

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)

Burada dene!


Adı görüntülemek zorunda değilsin, değil mi?
Akangka

Bu yanlış. yerine i(5)yazdırır . 4 is the magic number5 is 4 and 4 is the magic number
mbomb007

1

Moo, 182 176/ 192 188 bayt - 30 = 146/158

188 bayt sürümü:

u=$string_utils;s="";i=args[0];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 bayt uygulamaya bağlı sürüm:

s="";i=args[0];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"

Her ikisi de işlevdir.


1

PHP, 168 - 30 = 138 bayt

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));}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.