สี่คือหมายเลขเวทย์มนตร์


26

ฉันไม่ได้ตรวจสอบกล่องเครื่องมือก่อนที่จะโพสต์ความท้าทายนี้ - มันดูเหมือนว่าความท้าทายนี้ถูกเสนอโดยCᴏɴᴏʀO'Bʀɪᴇɴ

รับอินพุตจำนวนเต็มเขียนโปรแกรมที่พิมพ์ริดเดิ้ล "สี่คือจำนวนเวทย์มนตร์"

  • สี่คือหมายเลขเวทย์มนตร์
  • ห้าคือสี่และสี่คือเลขอาคม
  • หกเป็นสามและสามคือห้าและห้าคือสี่และสี่คือเลขกล
  • สิบเอ็ดคือหกและหกคือสามและสามคือห้าและห้าคือสี่และสี่คือเวทมนตร์
  • ห้าร้อยเป็นสิบเอ็ดและสิบเอ็ดคือหกและหกคือสามและสามคือห้าและห้าคือสี่และสี่คือจำนวนเวทมนตร์

หากคุณรู้จักไขปริศนาอยู่แล้วหรือขี้เกียจเกินกว่าที่จะแก้ปัญหาได้ก็อยากรู้ว่าปริศนานี้คืออะไรนี่คือคำอธิบาย

หมายเลขถัดไปคือจำนวนตัวอักษรในหมายเลขก่อนหน้า ดังนั้นสำหรับตัวอย่างเช่นห้ามีสี่ตัวอักษรดังนั้นจำนวนต่อไปคือสี่

หกมีตัวอักษรสามตัวดังนั้นหมายเลขถัดไปคือ3และสามมีตัวอักษรห้าตัวดังนั้นหมายเลขถัดไปคือ5และห้ามีตัวอักษรสี่ตัวดังนั้นหมายเลขต่อไปคือ4

เหตุผลที่ปริศนาจบที่สี่คือเพราะสี่มีสี่ตัวอักษร และสี่คือสี่และสี่คือสี่และสี่คือสี่ ... (สี่คือเลขกล)

กรณีทดสอบ

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

กฎระเบียบ

  • อินพุตอาจถูกนำมาจากSTDINหรือเป็นอาร์กิวเมนต์ของฟังก์ชัน
  • อินพุตจะเป็นตัวเลขบวกระหว่าง 0 ถึง 999,999
  • ข้อมูลที่ป้อนจะมีตัวเลขเท่านั้น (จะเป็นไปตาม regex ^[0-9]+$)
  • อินพุตสามารถนำมาเป็นจำนวนเต็มหรือสตริง
  • เมื่อแปลงเป็นสตริงคำช่องว่างและยัติภังค์ไม่ควรรวมอยู่ในการนับ (100 [หนึ่งร้อย] คือ 10 ตัวอักษรไม่ใช่ 11 1,742 [หนึ่งพันเจ็ดร้อยสี่สิบสอง] คือ 31 ตัวอักษรไม่ใช่ 36)
  • เมื่อแปลงเป็นสตริง 100 ควรเป็นหนึ่งร้อยไม่ใช่หนึ่งร้อยหรือร้อย 1,000 ควรเป็นหนึ่งพันไม่ใช่หนึ่งพันหรือหนึ่งพัน
  • เมื่อแปลงเป็นสตริง 142 ควรเป็นหนึ่งร้อยสี่สิบสองไม่ใช่หนึ่งร้อยและสี่สิบสอง
  • เอาต์พุตเป็นตัวพิมพ์เล็กและตัวพิมพ์ใหญ่และควรเป็นไปตามรูปแบบ " NคือKและKคือMและMคือ ... และสี่คือหมายเลขเวทย์มนตร์" (เว้นแต่อินพุตคือ 4 ซึ่งในกรณีนี้เอาต์พุตควรเป็น "สี่" คือหมายเลขเวทมนต์ ")
  • ผลลัพธ์สามารถใช้ตัวเลขแทนตัวอักษร ("5 คือ 4 และ 4 คือหมายเลขเวทย์มนตร์" แทน "ห้าคือสี่และสี่คือหมายเลขเวทย์มนตร์") ตราบใดที่โปรแกรมของคุณสอดคล้องกันเสมอ
  • เอาท์พุทอาจเป็นค่าตอบแทนของฟังก์ชั่นหรือพิมพ์ STDOUT
  • ช่องโหว่มาตรฐานใช้
  • นี่คือดังนั้นโปรแกรมที่สั้นที่สุดในหน่วยไบต์ชนะ โชคดี!

โบนัส

-30 ไบต์หากโปรแกรมทำงานเมื่ออินพุตอยู่ระหว่าง -999,999 ถึง 999,999

ตัวเลขลบเมื่อแปลงเป็นคำให้มี "ลบ" อยู่ข้างหน้า ตัวอย่างเช่น-4"Negative Four", Negative Four คือสิบสองและสิบสองคือหกและหกคือสามและสามคือห้าและห้าคือสี่และสี่คือจำนวนมายากล

-150 ไบต์หากโปรแกรมไม่ได้ใช้ฟังก์ชั่นในตัวสำหรับการสร้างการแสดงสตริงของจำนวน

ลีดเดอร์บอร์ด

นี่คือตัวอย่างสแต็กที่สร้างทั้งกระดานผู้นำและภาพรวมของผู้ชนะตามภาษา

เพื่อให้แน่ใจว่าคำตอบของคุณปรากฏขึ้นโปรดเริ่มคำตอบด้วยบรรทัดแรกโดยใช้เทมเพลต Markdown ต่อไป

## Language Name, N bytes

โดยที่ N คือขนาดไบต์ของการส่งของคุณ

หากคุณต้องการรวมหลายตัวเลขไว้ในส่วนหัวของคุณ (ตัวอย่างเช่นการดูผ่านคะแนนเก่าหรือรวมถึงการตั้งค่าสถานะในจำนวนไบต์) เพียงตรวจสอบให้แน่ใจว่าคะแนนจริงเป็นจำนวนสุดท้ายในส่วนหัวของคุณ

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


มีอินพุตที่เป็นไปได้สูงสุดหรือไม่
Arcturus

7
ในอนาคตโปรดตรวจสอบแซนด์บ็อกซ์เพื่อดูว่ามีคนอื่นที่มีความคิดของคุณหรือไม่
El'endia Starman

@ El'endiaStarman เอาล่ะฉันจะเพิ่มข้อความบางส่วนที่ด้านบนของความท้าทายที่เชื่อมโยงไปยังโพสต์ที่
Jojodmo

โบนัสฟังก์ชั่นในตัวของคุณควรมากกว่า -150 ถึง -200 ไบต์
TanMath

1
ฉันแค่จะโยนมันออกไปที่นั่น - แม้แต่จำนวนที่เพิ่มประสิทธิภาพมากที่สุดที่แปลงเมมโมรี่เป็นชื่อก็ยังต้องเสียค่าใช้จ่ายที่น้อยกว่า 150 ไบต์สำหรับภาษาส่วนใหญ่
ricdesi

คำตอบ:


9

Bash + ยูทิลิตี้ทั่วไป (รวมถึงเกม bsd), 123 - 30 = 93 ไบต์

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

โชคดีที่ผลลัพธ์จากยูทิลิตี้bsd-gamenumberเกือบจะเป็นสิ่งที่เราต้องการ หมายเลขเอาต์พุตทั้งหมดเขียนด้วยตัวเลขและไม่ใช่คำตามสัญลักษณ์แสดงหัวข้อย่อยที่ 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 ไบต์ - 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");}

แรงบันดาลใจจากคำตอบจากโคลคาเมรอน ฉันคิดว่าฉันอาจทำได้ดีกว่านี้หากไม่มีคำจำกัดความของมาโคร แม้ว่าในที่สุดฉันก็สามารถจัดการมันได้ แต่ต้องใช้แรงกดดันบ้างเพื่อให้บรรลุผล!

มันต้องมีชุดอักขระโฮสต์ด้วยตัวอักษรที่ต่อเนื่องกัน (ดังนั้น ASCII ก็โอเค แต่ EBCDIC จะไม่ทำงาน) สำหรับคู่ของตารางการค้นหา ฉันเลือกjเป็นตัวละครที่เป็นศูนย์และใช้ประโยชน์จากความต้องการการค้นหาสองครั้งดังนั้นฉันสามารถลบอันหนึ่งออกจากอีกอันหนึ่งแทนที่จะลบศูนย์ของฉันทั้งสอง

รุ่นที่แสดงความคิดเห็น:

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

มีส่วนขยายที่เห็นได้ชัดนับล้านสนับสนุนโดยการเปลี่ยนด้วยf(n/1000,8)f(n/1000000,7)+f(n/1000%1000,8)

ทดสอบผลลัพธ์

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 ไบต์

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

ฉันเพียงแค่ประหลาดใจว่านี่ใช้สายและไม่นานขัน


4

สวิฟท์ 2 , 408 419 - 30 = 389 ไบต์

ฉันจะสามารถกำจัด 176 ไบต์ได้ถ้า Swift ไม่ได้แสดงออกอย่างชัดเจนด้วยการแสดงออกปกติ (ลบเครื่องหมายขีดกลางและช่องว่าง) * จ้องที่ 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"}

สามารถทดสอบได้ที่ swiftstub.com ที่นี่

ฉันวิ่งวนนิดหน่อยแล้วปรากฎว่า100003ตัวเลขระหว่าง 0 ถึง 999999 มีผลลัพธ์สตริงที่ยาวที่สุดซึ่งมีการวนซ้ำ 6 ครั้งและเป็น

100003คือ23และ23คือ11และ11คือ6และ6คือ3และ3คือ5และ5คือ4และ4คือเลขอาคม

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.RegularExpressionSearchและฉันคิดว่า JS String.fromCharCodeนั้นละเอียดมาก : P
ETHproductions

4
string.replaceงูหลามและทับทิม Swift:String.stringByReplacingOccurrencesOfString
cat

4

Haskell, 285 - 180 = 105 ไบต์

อันที่จริงแล้วไม่มีการติดตั้งเพื่อแสดงหมายเลข ฉันยังคงไม่พอใจกับคะแนน รู้สึกอิสระที่จะแสดงความคิดเห็น แต่ฉันจะทดลองเพิ่มเติม คะแนนยังดีกว่าคะแนนของ 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)

การใช้

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"

คำอธิบาย

mเป็นเรื่องไม่สำคัญพออย่างไรก็ตามcไม่ใช่ cเป็นฟังก์ชั่นในการนับจำนวนตัวอักษรชื่อภาษาอังกฤษของตัวเลข

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
อือ ดีสวิฟท์มี ... เอ่อ ... คะแนนที่สูงกว่า ... (ฉันไม่ค่อยเก่งในการคัมแบ็ก)
Jojodmo

4

C, 268 - 180 = 88 ไบต์

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

ลองมันนี่

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 ไบต์

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-แข็งแรงเล่นกอล์ฟ

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

ฉันรู้ว่ามันถูกกว่าปี แต่คุณสามารถลบวงเล็บบางอย่างในการที่ได้รับมอบหมาย ternary เช่นเดียวกับการเปลี่ยนแปลงที่จะ==0 <1ดังนั้น: 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 ไบต์ )
Kevin Cruijssen

3

QC, 265 - 30 - 150 = 85 ไบต์

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

ชุดทดสอบ

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

หากคุณไม่ได้ใช้ฟังก์ชั่นในตัวเพื่อรับความยาวของจำนวนดังนั้นคุณสามารถลบอีก150จากคะแนนของคุณ
Jojodmo

2

JavaScript, 382 - 150 - 30 = 202 ไบต์

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

อินพุตถูกกำหนดเป็นพารามิเตอร์ให้กับนิพจน์ฟังก์ชันที่เรียกใช้ทันที

ทดสอบอินพุต:

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-แข็งแรงเล่นกอล์ฟ:

// 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 ไบต์

อย่างน้อยมันก็ไม่ได้ยาวไปกว่า Java! มันขึ้นอยู่กับสิ่งนี้ยกเว้นการใช้สตริง

แก้ไข : ฉันลืมเกี่ยวกับ 0 และฉันจำเป็นต้องพูดว่า "5 คือ 4" ไม่ข้ามไปที่ "4 คือหมายเลขมายากล" - ที่เพิ่มคะแนนเล็กน้อย

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)

ลองที่นี่!


คุณไม่ต้องแสดงชื่อใช่มั้ย
Akangka

สิ่งนี้ไม่ถูกต้อง i(5)พิมพ์แทน4 is the magic number 5 is 4 and 4 is the magic number
mbomb007

1

หมู่182 176/ 192 188 ไบต์ - 30 = 146/158

188 ไบต์เวอร์ชัน:

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 ไบต์ขึ้นอยู่กับการใช้งานรุ่น:

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"

ทั้งสองฟังก์ชั่น


1

PHP, 168 - 30 = 138 ไบต์

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));}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.