Bốn là số ma thuật


26

Tôi đã không kiểm tra hộp cát trước khi đăng thử thách này - có vẻ như thử thách này đã được đề xuất bởi Cᴏɴᴏʀ O'Bʀɪᴇɴ .

Đưa ra một đầu vào số nguyên, viết chương trình in câu đố "bốn là số ma thuật"

  • Bốn là số ma thuật
  • Năm là bốn và bốn là số ma thuật
  • Sáu là ba và ba là năm và năm là bốn và bốn là số ma thuật
  • Mười một là sáu và sáu là ba và ba là năm và năm là bốn và bốn là số ma thuật
  • Five Hundred là mười một và mười một là sáu và sáu là ba và ba là năm và năm là bốn và bốn là số ma thuật

Nếu bạn đã biết câu đố, hoặc quá lười để giải quyết nó lo lắng để tìm hiểu câu đố là gì, đây là một lời giải thích

Số tiếp theo là số chữ cái trong số trước. Vì vậy, ví dụ, nămbốn chữ cái, vì vậy số tiếp theo là bốn .

sáuba chữ cái, vì vậy số tiếp theo là 3banăm chữ cái, vì vậy số tiếp theo là 5nămbốn chữ cái, vì vậy số tiếp theo là 4

Lý do câu đố kết thúc ở bốn là vì bốn có bốn chữ cái , và bốn là bốn và bốn là bốn và bốn là bốn ... (bốn là số ma thuật)

Các trường hợp thử nghiệm

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

Quy tắc

  • Đầu vào có thể được lấy từ STDIN hoặc làm đối số cho hàm
  • Đầu vào sẽ là một số dương trong khoảng từ 0 đến 999.999
  • Đầu vào sẽ chỉ chứa các số (nó sẽ theo regex ^[0-9]+$)
  • Đầu vào có thể được lấy dưới dạng số nguyên hoặc chuỗi
  • Khi được chuyển đổi thành một chuỗi từ, không nên bao gồm khoảng trắng và dấu gạch nối trong số đếm (100 [Một trăm] là 10 ký tự, không phải 11. 1.742 [Một nghìn Bảy trăm Bốn mươi hai] là 31 ký tự, không phải 36)
  • Khi được chuyển đổi thành một chuỗi, 100 nên là Một trăm, không phải một trăm hoặc một trăm, 1000 nên là một nghìn, không phải là một ngàn hoặc một ngàn.
  • Khi được chuyển đổi thành chuỗi 142 phải là Một trăm Bốn mươi hai, không phải Một trăm Bốn mươi hai
  • Đầu ra không phân biệt chữ hoa chữ thường và phải theo định dạng " NKKM M là ... và bốn là số ma thuật" (trừ khi đầu vào là 4, trong trường hợp đó, đầu ra chỉ đơn giản là "bốn là con số kỳ diệu ")
  • Đầu ra có thể sử dụng số thay vì chữ cái ("5 là 4 và 4 là số ma thuật" thay vì "năm là bốn và bốn là số ma thuật") miễn là chương trình của bạn luôn nhất quán
  • Đầu ra có thể là giá trị trả về của hàm hoặc được in ra STDOUT
  • Sơ hở tiêu chuẩn dụng
  • Đây là , vì vậy chương trình ngắn nhất tính bằng byte sẽ thắng. Chúc may mắn!

Tiền thưởng

-30 byte nếu chương trình hoạt động khi đầu vào nằm trong khoảng -999.999 đến 999.999.

Các số âm, khi được chuyển đổi thành các từ, chỉ có "âm" ở phía trước chúng. Ví dụ: -4"Bốn âm", Bốn âm là mười hai và mười hai là sáu và sáu là ba và ba là năm và năm là bốn và bốn là số ma thuật

-150 byte nếu chương trình không sử dụng bất kỳ hàm dựng sẵn nào để tạo biểu diễn chuỗi của số

Bảng xếp hạng

Đây là một Snippet Stack tạo ra cả bảng xếp hạng và tổng quan về người chiến thắng theo ngôn ngữ.

Để đảm bảo câu trả lời của bạn hiển thị, vui lòng bắt đầu câu trả lời của bạn bằng một tiêu đề bằng cách sử dụng mẫu Markdown sau

## Language Name, N bytes

Trong đó N là kích thước, tính bằng byte, của trình của bạn

Nếu bạn muốn bao gồm nhiều số trong tiêu đề của mình (ví dụ: vượt qua các điểm số cũ hoặc bao gồm các cờ trong số byte), chỉ cần đảm bảo rằng điểm thực tế là số cuối cùng trong tiêu đề của bạn

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


Có một đầu vào tối đa có thể?
Arcturus

7
Trong tương lai, vui lòng kiểm tra Sandbox để xem ai đó có ý tưởng của bạn không .
El'endia Starman

@ El'endiaStarman Được rồi, tôi đã thêm một số văn bản ở đầu thử thách liên kết với bài đăng đó
Jojodmo

Phần thưởng chức năng tích hợp của bạn sẽ giống như -150 đến -200 byte.
TanMath

1
Tôi sẽ ném nó ra khỏi đó - ngay cả con số được tối ưu hóa nhất cho bộ chuyển đổi tên hầu như không tốn ít hơn 150 byte cho hầu hết các ngôn ngữ, vì nó là -150 là một cái bẫy nhiều hơn là một phần thưởng.
ricdesi

Câu trả lời:


9

Bash + các tiện ích phổ biến (bao gồm các trò chơi bsd), 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

May mắn thay, đầu ra từ tiện ích bsd-gamesnumber gần như chính xác những gì chúng ta cần. Các số đầu ra đều được viết bằng số và không phải bằng chữ theo điểm đạn thứ 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
$ 

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

Lấy cảm hứng từ câu trả lời từ Cole Cameron . Tôi nghĩ rằng tôi có thể làm tốt hơn mà không cần định nghĩa vĩ mô. Mặc dù cuối cùng tôi cũng xoay sở được, nhưng phải mất một số thời gian để đạt được!

Nó yêu cầu một bộ ký tự máy chủ với các chữ cái liên tiếp (vì vậy ASCII vẫn ổn, nhưng EBCDIC sẽ không hoạt động). Đó là cho cặp bảng tra cứu. Tôi đã chọn jlàm nhân vật số 0 và tận dụng việc cần hai lần tra cứu, vì vậy tôi có thể trừ đi một nhân vật khác thay vì phải trừ số 0 của mình khỏi cả hai.

Phiên bản đã bình luận:

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

Có một phần mở rộng rõ ràng để hỗ trợ hàng triệu người, bằng cách thay thế f(n/1000,8) bằng f(n/1000000,7)+f(n/1000%1000,8).

Đầu ra thử nghiệm

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

Toán học, 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"&

Tôi chỉ đơn giản ngạc nhiên rằng điều này sử dụng chuỗi và không dài một cách lố bịch.


4

Swift 2 , 408 419 - 30 = 389 byte

Tôi sẽ có thể thoát khỏi 176 byte nếu Swift không quá dài dòng với các biểu thức thông thường (loại bỏ dấu gạch nối và dấu cách) * lườm 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"}

Điều này có thể được kiểm tra trên swiftstub.com, tại đây

Tôi đã chạy một vòng cho vòng lặp và hóa ra đó 100003là số từ 0 đến 999999 có kết quả chuỗi dài nhất, có 6 lần lặp và là

1000032323111166335544 là số ma thuật

Bị đánh cắp

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.RegularExpressionSearchVà tôi nghĩ rằng JS String.fromCharCodelà dài dòng. : P
Sản phẩm điện tử

4
Python và Ruby : string.replace. Swift:String.stringByReplacingOccurrencesOfString
con mèo

4

Haskell, 285 - 180 = 105 byte

Trong thực tế, không có tích hợp nào để hiển thị số. Tôi vẫn không hài lòng với điểm số. Hãy bình luận. Tôi sẽ thử nghiệm thêm, mặc dù. Tuy nhiên, điểm số vẫn tốt hơn điểm số của 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)

sử dụng

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"

Giải trình.

mlà đủ tầm thường, tuy nhiên, ckhông. clà chức năng đếm số ký tự tên tiếng anh của số.

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
Ồ phải không Chà, Swift có ... uhm ... điểm cao hơn ... (Tôi không giỏi về sự trở lại)
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");}

Hãy thử nó ở đây .

Bị đánh cắp

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

Bỏ chơi gôn

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

Tôi biết nó được hơn một năm, nhưng bạn có thể loại bỏ một số ngoặc ở chỗ phân ternary cũng như thay đổi ==0để <1. Vì vậy: 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"+

Bộ kiểm tra

Ung dung:

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

Nếu bạn không sử dụng chức năng tích hợp để lấy độ dài của số, vì vậy bạn thực sự có thể trừ 150 khác khỏi điểm số của mình
Jojodmo 7/1/2016

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

Đầu vào được đưa ra làm tham số cho Biểu thức hàm được gọi ngay lập tức.

Kiểm tra đầu vào:

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

Bỏ chơi gôn:

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

Ít nhất là nó không dài hơn Java! Nó dựa trên điều này ngoại trừ sử dụng chuỗi.

EDIT : Tôi đã quên về 0 và tôi cần nói "5 là 4", không bỏ qua "4 là số ma thuật" - điều đó đã thêm một chút vào điểm số.

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)

Hãy thử nó ở đây!


Bạn không cần phải hiển thị tên, phải không?
Akangka

Điều này là không chính xác. i(5)in 4 is the magic number, thay vì 5 is 4 and 4 is the magic number.
mbomb007

1

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

Phiên bản 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"

Phiên bản phụ thuộc thực hiện 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"

Cả hai đều là chức năng.


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));}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.