Empat adalah angka ajaib

26

Saya tidak memeriksa kotak pasir sebelum memposting tantangan ini - sepertinya tantangan ini diusulkan oleh Cᴏɴᴏʀ O'Bʀɪᴇɴ .

Diberikan input integer, tulis sebuah program yang mencetak teka-teki "four is a magic number"

  • Empat adalah angka ajaib
  • Lima adalah empat dan empat adalah angka ajaib
  • Enam adalah tiga dan tiga adalah lima dan lima adalah empat dan empat adalah angka ajaib
  • Sebelas enam dan enam tiga dan tiga lima dan lima empat dan empat adalah angka ajaib
  • Five Hundred adalah sebelas dan sebelas adalah enam dan enam adalah tiga dan tiga adalah lima dan lima adalah empat dan empat adalah angka ajaib

Jika Anda sudah tahu teka-teki itu, atau terlalu malas untuk menyelesaikannya dengan cemas untuk mencari tahu apa teka-teki itu, inilah penjelasannya

Nomor berikutnya adalah jumlah huruf di nomor sebelumnya. Jadi, misalnya, lima memiliki empat huruf, jadi angka berikutnya adalah empat .

enam memiliki tiga huruf, jadi angka berikutnya adalah 3 , dan tiga memiliki lima huruf, jadi angka berikutnya adalah 5 , dan lima memiliki empat huruf, jadi angka berikutnya adalah 4.

Alasan teka-teki berakhir pada empat adalah karena empat memiliki empat huruf , dan empat adalah empat dan empat adalah empat dan empat adalah empat ... (empat adalah angka ajaib)

Uji Kasus

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

Aturan

  • Input dapat diambil dari STDINatau sebagai argumen ke suatu fungsi
  • Masukan akan berupa angka positif antara 0 dan 999.999
  • Input hanya akan berisi angka (akan mengikuti regex ^[0-9]+$)
  • Input dapat diambil sebagai integer atau string
  • Ketika dikonversi ke string kata, spasi dan tanda hubung tidak boleh dimasukkan dalam hitungan (100 [Seratus] adalah 10 karakter, bukan 11. 1.742 [Seribu Tujuh ratus Empat Puluh Dua] adalah 31 karakter, bukan 36)
  • Ketika dikonversi menjadi string, 100 harus Seratus, bukan Seratus atau Seratus, 1000 harus Seribu, bukan Seribu atau Seribu.
  • Ketika dikonversi ke string 142 harus Seratus Forty Two, tidak Seratus dan Forty Two
  • Outputnya adalah case-insensitive , dan harus mengikuti format " N adalah K dan K adalah M dan M adalah ... dan empat adalah angka ajaib" (kecuali inputnya 4, dalam hal ini outputnya seharusnya hanya "empat adalah angka ajaib ")
  • Outputnya dapat menggunakan angka alih-alih huruf ("5 adalah 4 dan 4 adalah angka ajaib" bukan "lima adalah empat dan empat adalah angka ajaib") selama program Anda selalu konsisten
  • Outputnya bisa berupa nilai balik suatu fungsi, atau dicetak ke STDOUT
  • Celah standar berlaku
  • Ini adalah , jadi program terpendek dalam byte menang. Semoga berhasil!

Bonus

-30 byte jika program bekerja saat input berada di antara -999.999 dan 999.999.

Angka negatif, ketika dikonversi menjadi kata, hanya memiliki "negatif" di depannya. Misalnya -4adalah "Negatif Empat", Negatif Empat adalah dua belas dan dua belas adalah enam dan enam adalah tiga dan tiga adalah lima dan lima adalah empat dan empat adalah angka ajaib

-150 byte jika program tidak menggunakan fungsi bawaan untuk menghasilkan representasi string dari angka tersebut

Papan peringkat

Ini adalah Cuplikan Stack yang menghasilkan leaderboard dan ikhtisar pemenang berdasarkan bahasa.

Untuk memastikan jawaban Anda muncul, silakan mulai jawaban Anda dengan tajuk utama menggunakan templat Penurunan harga berikut

## Language Name, N bytes

Di mana N adalah ukuran, dalam byte, dari kiriman Anda

Jika Anda ingin memasukkan beberapa angka dalam tajuk Anda (misalnya, mencoret skor lama, atau menyertakan bendera dalam jumlah byte), pastikan saja skor sebenarnya adalah angka terakhir di tajuk Anda

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

Jojodmo
sumber
Apakah ada input maksimum yang mungkin?
Arcturus
7
Di masa depan, silakan juga periksa Kotak Pasir untuk melihat apakah orang lain memiliki ide Anda .
El'endia Starman
@ El'endiaStarman Baiklah, saya menambahkan beberapa teks di bagian atas tantangan yang menghubungkan ke pos itu
Jojodmo
Bonus fungsi bawaan Anda harus lebih seperti -150 hingga -200 byte.
TanMath
1
Saya hanya akan membuang ini di luar sana - bahkan konverter angka ke nama yang paling gila-gilaan hampir tidak akan menghabiskan biaya kurang dari 150 byte untuk sebagian besar bahasa, karena -150 lebih merupakan jebakan daripada bonus.
ricdesi

Jawaban:

9

Bash + utilitas umum (termasuk bsd-game), 123 - 30 = 93 byte

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

Untungnya keluaran dari utilitas bsd-gamesnumber hampir persis seperti yang kita butuhkan. Nomor-nomor keluaran semuanya ditulis secara numerik dan tidak dalam kata-kata sesuai dengan poin ke-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
$ 
Trauma Digital
sumber
6

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

Terinspirasi oleh jawaban dari Cole Cameron . Saya pikir saya mungkin bisa melakukan yang lebih baik tanpa definisi makro. Meskipun pada akhirnya saya berhasil, perlu beberapa tekanan untuk mencapainya!

Ini membutuhkan set karakter host dengan huruf berurutan (jadi ASCII baik-baik saja, tetapi EBCDIC tidak akan berfungsi). Itu untuk sepasang tabel pencarian. Saya memilih jsebagai karakter nol, dan mengambil keuntungan dari membutuhkan dua pencarian, jadi saya bisa mengurangi satu dari yang lain daripada harus mengurangi nol dari keduanya.

Versi yang dikomentari:

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

Ada perpanjangan jelas untuk mendukung jutaan, dengan mengganti f(n/1000,8)dengan f(n/1000000,7)+f(n/1000%1000,8).

Uji keluaran

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
Toby Speight
sumber
4

Mathematica, 156 - 30 = 126 byte

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

Saya hanya terkejut bahwa ini menggunakan string dan tidak terlalu panjang.

LegionMammal978
sumber
4

Swift 2 , 408 419 - 30 = 389 Bytes

Saya akan dapat menghilangkan 176 byte jika Swift tidak begitu bertele-tele dengan ekspresi reguler (menghilangkan tanda hubung dan spasi) * melotot ke 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"}

Ini dapat diuji di swiftstub.com, di sini

Saya berlari sedikit untuk loop, dan ternyata 100003angka antara 0 dan 999999 memiliki hasil string terpanjang, yang memiliki 6 iterasi, dan

100003 adalah 23 dan 23 adalah 11 dan 11 adalah 6 dan 6 adalah 3 dan 3 adalah 5 dan 5 adalah 4 dan 4 adalah angka ajaib

Tidak disatukan

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"
}
Jojodmo
sumber
7
NSStringCompareOptions.RegularExpressionSearchDan saya pikir JS String.fromCharCodeverbose. : P
ETHproduk
4
Python dan Ruby: string.replace. Swift:String.stringByReplacingOccurrencesOfString
cat
4

Haskell, 285 - 180 = 105 Bytes

Bahkan, tidak ada built-in sama sekali untuk menampilkan nomor. Saya masih tidak puas dengan skor. Jangan ragu untuk berkomentar. Saya akan bereksperimen lebih lanjut. Skor masih lebih baik dari skor 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)

pemakaian

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"

Penjelasan.

mcukup sepele, namun, ctidak. cadalah fungsi untuk menghitung jumlah karakter nama bahasa inggris dari angka.

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.
Akangka
sumber
1
Oh ya Baiklah, Swift memiliki ... uhm ... skor yang lebih tinggi ... (Saya tidak pandai comeback)
Jojodmo
4

C, 268 - 180 = 88 byte

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

Coba di sini .

Tidak disatukan

/* 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");
}
Cole Cameron
sumber
3

Java, 800 - 150 = 650 byte

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)));
   }
}
Minimal
sumber
Saya tahu ini sudah lebih dari setahun, tetapi Anda dapat menghapus beberapa tanda kurung dalam tugas ternary itu dan juga mengubahnya ==0menjadi <1. Jadi: 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 byte )
Kevin Cruijssen
3

QC, 265 - 30 - 150 = 85 byte

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

Suite uji

Tidak Disatukan:

(✵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"+
Avris
sumber
Jika Anda tidak menggunakan fungsi
bawaan
2

JavaScript, 382 - 150 - 30 = 202 byte

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

Input diberikan sebagai parameter untuk Ekspresi Fungsi yang Segera Diminta.

Masukan tes:

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-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)
Davis
sumber
1

Python 641-150 = 501 byte

Setidaknya itu tidak lebih lama dari Jawa! Ini didasarkan pada ini kecuali menggunakan string.

EDIT : Saya lupa tentang 0 dan saya harus mengatakan "5 adalah 4", bukan langsung ke "4 adalah angka ajaib" - yang menambahkan sedikit ke skor.

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)

Coba di sini!

TanMath
sumber
Anda tidak harus menampilkan nama, bukan?
Akangka
Ini salah. i(5)cetakan 4 is the magic number, bukan 5 is 4 and 4 is the magic number.
mbomb007
1

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

Versi 188 byte:

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"

Versi tergantung implementasi 176 byte :

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"

Keduanya adalah fungsi.

pppery
sumber
1

PHP, 168 - 30 = 138 byte

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));}
Jonathan Moyes
sumber