ทำแบบฝึกหัดการนับเกรดอัตโนมัติ


36

CodeGolf Challenge

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

คุณเข้าสู่ชั้นเรียนแรกและครูกำลังมอบหมาย เธอจะพูดหรือเขียนตัวเลขมากถึง 50 ถ้าเธอเขียนหมายเลขลงบนกระดาน (เช่น: 25) จากนั้นคุณต้องพูดตัวเลขนั้นให้มากที่สุด "หนึ่ง, สอง, สาม, ... , ยี่สิบห้า - " ถ้าเธอบอกว่าจำนวนดังออกมา (เช่น: "หก") จากนั้นบนแท็บเล็ตของคุณคุณต้องเขียนตัวเลขนั้นให้เป็นตัวเลข "1, 2, 3, 4, 5, 6"

สิ่งนี้กลายเป็นเรื่องน่าเบื่อมากและคุณตัดสินใจว่าจะทำให้กระบวนการทำงานโดยอัตโนมัติด้วยความรู้ด้านการเขียนโปรแกรมสมัยศตวรรษที่ 21


วัตถุประสงค์:

โปรแกรมของคุณควรรับอินพุต อินพุตนี้จะเป็นตัวเลขทศนิยม ( 1 thru 50) หรือหมายเลขที่เขียนออกมา ( one thru fifty)

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

•ถ้าอินพุตเป็นจำนวนที่เขียนออกเอาต์พุตของคุณควรนับจาก 1 ถึงหมายเลขดังกล่าวโดยใช้รูปแบบทศนิยม (เช่น32 )


กฎ:

อินพุทและเอาท์พุทสามารถเลือกได้ในกรณีใด ๆ (เพื่อให้คุณสามารถสร้างโปรแกรมที่รับเฉพาะตัวพิมพ์ใหญ่หากต้องการ

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

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

ค่าเอาต์พุตต้องถูกคั่นในบางรูปแบบตัวคั่นใด ๆ ก็ได้ 1,2,3 1 2 3 etc

คุณไม่สามารถเพิ่มไลบรารีพิเศษเช่นnum2words (python)เป็นต้น (อย่างไรก็ตามไลบรารีระบบนั้นใช้ได้)

แม้ว่าเบื้องหลังจะบอกว่าคุณมาจากปี 2000 คุณสามารถใช้ภาษาที่สร้างขึ้นหลังจากวันที่ดังกล่าว (lol)


นี่คือดังนั้นโปรแกรมที่มีจำนวนผู้ชนะที่สั้นที่สุด!


1
เราได้รับอนุญาตให้ใช้ไลบรารี่อย่างnum2wordsในกรณีของไพ ธ อนไหม
Gurupad Mamadapur

1
@AlbertRenshaw แต่เกี่ยวกับ builtins ที่ทำเช่นนั้น? (Mathematica)
Pavel

1
@coredump Either หมายความว่าคุณสามารถเลือกอย่างใดอย่างหนึ่งหรืออย่างอื่นหรือทั้งสองอย่าง ไม่จำเป็นต้องจัดการกับอินพุตทั้งสองชนิด
Albert Renshaw

2
"กัดตูดโลหะมันวาวของฉัน!" ฉันจะไม่นับตัวเอง
RaisingAgent

1
ฉันคิดว่าชื่อเรื่องคือ "การนับครั้งแรกของคุณ (การนับเกรด)" ไม่ "การนับของคุณ (ชั้นแรก)"
CAD97

คำตอบ:


32

Perl 6 , 119 113 bytes

{my \n=<①     ㊿>.map:{|map *.uniname.words[2..*].join,$^a..$^b}
/\d/??n[^$_]!!1..1+first $_,n,:k}

FTW ฐานข้อมูล Unicode!

การใช้ประโยชน์บนกรณีตัวเลขที่เขียนออกโดยไม่ต้อง hypen TWENTYTWOเช่น
ส่งคืนรายการสตริงหรือช่วงของตัวเลข (ทั้งสองใช้พื้นที่เป็นตัวคั่นเมื่อพิมพ์ด้วยput)


3
ahahaha ฉลาดมาก! รักเลย
Albert Renshaw

13

Python3, 276 271 269 243 237 235 232 217 ไบต์

รับคิวจากการส่ง @smls perl ...

from unicodedata import*
o=[name(chr(k)).split(' ',2)[-1]for j in['①⑴','㉑㉠','㊱㋀']for k in range(ord(j[0]),ord(j[1]))]
i=input()
w=i in o
for i in range(w and o.index(i)+1or int(i)):print(w and i+1or o[i])

ฉันสงสัยว่ามันอาจจะตีกอล์ฟเพิ่มขึ้นอีกนิด

มันใช้ไลบรารีระบบunicodedataเพื่อค้นหาชื่อของตัวเลข มันต้องมีชื่อหมายเลขกรณีบน (คั่นด้วยช่องว่าง:) FORTY TWOหรือจำนวนเต็มทศนิยมเป็นอินพุต

(นี่คือการส่งรหัสกอล์ฟครั้งแรกของฉัน)

(ฉันเพิ่งสังเกตเห็นว่าฉันกำลังตัดความยาว (การเข้ารหัส) ดังนั้นมันจึงน้อยกว่าที่คาดไว้ก่อนหน้านี้สองสามไบต์ฉันเพิ่งอัปเดตจำนวนไบต์ล่าสุดเท่านั้นโอ๊ะโอ)


ยินดีต้อนรับสู่ PPCG!
AdmBorkBork

ในการสนับสนุน: unicodedataเป็นไลบรารีระบบที่มาพร้อมกับการติดตั้งเริ่มต้นไม่ใช่ไลบรารี "พิเศษ" ที่ต้องติดตั้งแยกต่างหาก
unayok

ยินดีต้อนรับสู่เว็บไซต์! คุณสามารถลบจำนวนมากของช่องว่างจากรหัสของคุณ
xnor

1
ยินดีต้อนรับสู่ PPCG คุณสามารถสูญเสีย 3 ไบต์โดยการพิมพ์ภายในforลูปและมีการขึ้นบรรทัดใหม่ระหว่างแต่ละเอาต์พุต print()ไม่สนใจว่ามันจะเป็นจำนวนเต็มหรือสตริง ลองออนไลน์!
ElPedro

1
ฉันคิดว่าคุณสามารถimport*แทนimport nameเพื่อประหยัดคู่ของไบต์
ข้าวสาลีช่วยสร้าง

10

เสียงกระเพื่อมสามัญ 297 253 243 242 144 128

(lambda(s)(#1=dotimes(u(or(#1#(i 51)(if(equal(#2=format()"~R"i)s)(return i)))s))(#2#t"~[~:;, ~]~:[~R~;~D~]"u(stringp s)(1+ u))))

รายละเอียด

(lambda (s) 
  (dotimes                         ; iterate...                                                                          
      (u                           ; for u from zero below ...                
       (or                         ; if s is a string, then                   
        (dotimes (i 51)            ;   parse s by iterating from 0 to 50      
          (if (equal               ;   until we find a match between          
               (format nil "~R" i) ;   the English word(s) for i              
               s)                  ;   and the given s                        
              (return i)))         ;   (exit loop)                            
        s))                        ; otherwise, use s, which is a number      
    (format t                      ; for each U, print to standard output     
            "~[~:;, ~]~:[~R~;~D~]" ; (see below for details)                  
            u                      ; ...                                      
            (stringp s)            ; ... arguments to format                  
            (1+ u))))              ; ...                                      
  • ~[ 0 ~; 1 ~; ... ~:; else ~]เป็นสวิตช์ขึ้นอยู่กับค่าของอาร์กิวเมนต์ที่มีอยู่ถัดไปซึ่งข้ามไปยังรูปแบบการควบคุมย่อยที่เหมาะสม ที่นี่ฉันมีเฉพาะกรณีของ "0" และสำหรับ "อื่น ๆ " ใช้เพื่อแทรกตัวคั่นหน้าหมายเลขแต่ละตัวยกเว้นหมายเลขแรกด้วย U ที่เริ่มต้นจากศูนย์

  • ~:[ FALSE ~; TRUE ~]เป็นรูปแบบตามเงื่อนไข ที่นี่เราเอาท์พุทสิ่งที่แตกต่างไม่ว่าจะเป็นอินพุทเป็นสตริงหรือไม่

  • ~Rเขียนตัวเลขเป็นตัวเลขภาษาอังกฤษที่สำคัญในขณะที่~Dเพียงพิมพ์หมายเลข

ตัวอย่าง

CL-USER> (test "five")
1, 2, 3, 4, 5

CL-USER> (test 32)
one, two, three, four, five, six, seven, eight, nine, ten, eleven, twelve, thirteen, fourteen, fifteen, sixteen, seventeen, eighteen, nineteen, twenty, twenty-one, twenty-two, twenty-three, twenty-four, twenty-five, twenty-six, twenty-seven, twenty-eight, twenty-nine, thirty, thirty-one, thirty-two

จากสิ่งที่ฉันเข้าใจในคำถามคุณจะต้องสามารถแยกวิเคราะห์ทั้งสองสไตล์ไม่ใช่แค่แบบเดียวดังนั้นโซลูชัน 55 ไบต์ของคุณอาจไม่ถูกต้อง "โปรแกรมของคุณไม่จำเป็นต้องยอมรับทั้งสอง" หมายถึง 25 เทียบกับ "25", ทศนิยมเป็นตัวเลขหรือสตริง
ทอม

@ TomDevs ขอบคุณ นี่คือความสับสนอย่างแน่นอน เพื่อให้แน่ใจว่าถ้าฉันกำหนดfว่า "(f 2)" พิมพ์ "หนึ่งสอง" และ(f "two")พิมพ์ "1, 2" มันดูดีสำหรับคุณหรือไม่
coredump

ใช่ฉันคิดว่าถูกต้อง
ทอม

@ TomDevs ขอบคุณฉันแก้ไขมัน
coredump

1
@AlbertRenshaw ไม่เฉพาะภาษาอังกฤษเท่านั้น คุณลักษณะนี้อาจถูกพิจารณาว่าเป็นแบบขยายได้ แต่เนื่องจากมีการใช้งานแล้วในบาง Lisps จึงเป็นมาตรฐาน
coredump

8

JavaScript ES6, 559 526 381 368 364 358 332 327 315 ไบต์

a="one0two0three0four0five0six0seven0eight0nine0ten0eleven0twelve0thir10four10fif10six10seven10eigh10nine1".replace(/1/g,'teen').split(0),b="twenty0thirty0forty0fifty".split(0),c=(n,d=Array,e=b.forEach(i=>a=a.concat(i,a.slice(0,9).map(x=>i+x))))=>1/n?a.slice(0,n).join():d.from(d(a.indexOf(n)+1),(x,i)=>i+1).join();

ขอบคุณ Kritixi Lithos สำหรับแนวคิดในการแบ่งอาร์เรย์และ Arnauld สำหรับเคล็ดลับ 1 / n

a="one0two0three0four0five0six0seven0eight0nine0ten0eleven0twelve0thir10four10fif10six10seven10eigh10nine1".replace(/1/g,'teen').split(0),b="twenty0thirty0forty0fifty".split(0),c=(n,d=Array,e=b.forEach(i=>a=a.concat(i,a.slice(0,9).map(x=>i+x))))=>1/n?a.slice(0,n).join():d.from(d(a.indexOf(n)+1),(x,i)=>i+1).join();

console.log(c("twentyfive"));
console.log(c("fifty"));
console.log(c(50));


1
คุณสามารถลบvarและคุณสามารถเปลี่ยนอาร์เรย์['one,'two',..]เป็น"one0two0three0...".split(0)
Kritixi Lithos

null, Array(n)ช่องว่างที่ซ้ำซ้อน
Yytsi

2
คุณสามารถแทนที่โดย!isNaN(n) 1/nสิ่งนี้ทำให้คุณNaNมีสตริง (falsy), float ที่ไม่เป็นศูนย์สำหรับจำนวนเต็มที่ไม่เป็นศูนย์ (ความจริง) หรือInfinityสำหรับ 0 (เช่นความจริง)
Arnauld

เพิ่มช่องว่างด้านหน้า 4 บรรทัดของโค้ดทุกบรรทัด
sagiksp

@sagiksp ใช่ต้องมีบางสิ่งบางอย่าง messed ขึ้นเมื่อมีการแก้ไขโพสต์ที่ควรได้รับการแก้ไขในขณะนี้ :)
ทอม

6

Python 2 , 503 499 494 490 479 ไบต์

-5 ขอบคุณ @JonathanAllan

l='one two three four five six seven eight nine ten eleven twelve thir#four#fif#six#seven#eigh#nine#'.replace('#','teen ').split()
m='twenty','thirty','forty','fifty'
i,z,R=raw_input(),' ',range
try:n=int(i);p=(n/10)-2;o=(l+sum([[m[x]]+[m[x]+z+l[y]for y in R(9)]for x in R(p)],[])+[m[p]]+[m[p]+z+l[y]for y in R(n%10)],l[:n])[n<20]
except:j=i.split();o=map(str,R(1,(m.index(j[0])+2)*10+l.index(j[1])+2if z in i else l.index(i)+2if i in l else(m.index(i)+2)*10+1))
print','.join(o)

ลองออนไลน์!

ป้อนตัวเลขหรือช่องว่างเพื่อแยกการสะกดของตัวเลข

รุ่น golfed น้อยกว่าและอ่านง่ายขึ้นเล็กน้อย:

l='one two three four five six seven eight nine ten eleven twelve thirteen fourteen fifteen sixteen seventeen eighteen nineteen'.split()
m='twenty','thirty','forty','fifty'
i=raw_input()
try:
 n=int(i)
 if n<20:
  o=l[0:n]
 else:
  o=l
  for x in range((n/10)-2):
   o+=[m[x]]+[m[x]+' '+l[y]for y in' '*9]
  p=m[(n/10)-2]
  o+=[p]+[p+' '+l[y]for y in' '*n%10]
except:
 if' 'in i:
  t=i.split()
  s=((m.index(t[0])+2)*10)+l.index(t[1])+2
 else:
  s=l.index(i)+2 if i in l else((m.index(i)+2)*10)+1
 r=range(1,s)
 o=map(str,r)
print','.join(o)

1
6 ไบต์บันทึกด้วยl="one two three four five six seven eight nine ten eleven twelve thir#four#fif#six#seven#eigh#nin#".replace("#","teen ").split()
Jonathan Allan

... โอ๊ะ 5 พลาดจากe nineteen
Jonathan Allan

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

@ nedla2004 - ไม่มีเหตุผลอย่างอื่นมากกว่าที่ฉันไม่ได้มีการติดตั้งรอบหลาม 3 แล็ปท็อปใหม่ล่าสุดของฉันยัง :-)
ElPedro

6

โครงการ, 161 , 152 , 149

(define (c x)(let((r(string->number x)))(let l((i 1))(let((n (format #f "~r" i)))(display(if r n i))(newline)(or(eq? r i)(equal? x n)(l (+ i 1)))))))

ไม่มีการบีบอัด:

(define (count limit)
  (let ((numerical-limit (string->number limit)))
    (let l ((i 1))
      (let ((current-number (format #f "~r" i)))
        (display (if numerical-limit current-number i))
        (newline)
        (or (eq? numerical-limit i)
            (equal? limit current-number)
            (l (+ i 1)))))))

คุณจะแปลงจากเช่น "สี่" ถึง 4 ได้อย่างไร? ผมไม่แน่ใจว่าstring->numberทำอย่างนี้ฉันจะตรวจสอบได้อย่างรวดเร็วและดูเหมือนว่าจะใช้ในการแปลงเช่นจากสตริงกับจำนวน"4" 4
coredump

@coredump นั่นถูกต้อง ผลตอบแทน(string->number "four") #f
Michael Vehrs

คุณกำลังใช้โครงการใดอยู่
coredump

1
@coredump guile 2.0.9
Michael Vehrs

6

PHP - 397 372 349 344 329 ไบต์

แรงบันดาลใจจากโซลูชัน JS ของ TomDevs

บันทึก 25 ไบต์โดยแทนที่$a=[...]ด้วย$a=explode(...)

บันทึกอีก 23 ไบต์ด้วยการสลับกลับไปเป็นอาร์เรย์โดยไม่มีตัวคั่นสตริงและเก็บไว้teenในตัวแปรขอบคุณ @ user59178

บันทึกอีก 5 ไบต์ด้วยการลบ(int)typecasting

บันทึกอีก 15 ไบต์โดยปล่อยลง$b, $iในการforประกาศและวงเล็บปีกกาขอบคุณ @ user59178 อีกครั้ง

$a=[one,two,three,four,five,six,seven,eight,nine,ten,eleven,twelve,thir.$t=teen,four.$t,fif.$t,six.$t,seven.$t,eigh.$t,nine.$t];foreach([twenty,thirty,forty,fifty] as$c){$a[]=$c;for($i=0;$i<9;)$a[]=$c.'-'.$a[$i++];}if($argv[1]!=0)for($i=0;$i<$argv[1];)echo$a[$i++].' ';else for($i=1;$i<=array_search($argv[1],$a)+1;)echo$i++.' ';

Ungolfed:

$a =[one,two,three,four,five,six,seven,eight,nine,ten,eleven,‌​twelve,thir.$t=teen,‌​four.$t,fif.$t,six.$‌​t,seven.$t,eigh.$t,n‌​ine.$t];
foreach ([twenty,thirty,forty,fifty] as $c){
    $a[] = $c;
    for ($i=0;$i<9;)
        $a[] = $c . '-' . $a[$i++];
}
if( $argv[1] !=0 )
    for ($i=0;$i<$argv[1];)
        echo $a[$i++] . ' ';
else
    for ($i=1;$i<=array_search($argv[1], $a)+1;)
        echo $i++ . ' ';

ลองใช้กับสตริงอินพุตหรือสำหรับหมายเลขอินพุต


1
เมื่อเล่นกอล์ฟคุณสามารถใช้สตริงจำนวนมากได้โดยตรงโดยไม่ต้องใส่เครื่องหมายคำพูดใด ๆ รวมถึงหมายเลขทั้งหมดที่คุณใช้ สิ่งนี้ทำให้เกิดการแจ้งเตือน แต่สามารถละเว้นได้ นอกจากนี้มันจะสั้นลง (2 ไบต์โดยรวม) เพื่อเก็บไว้teenในตัวแปรแทนที่จะทำซ้ำในแต่ละครั้ง เช่นนี้มันจะกลายเป็น:$a=[one,two,three,four,five,six,seven,eight,nine,ten,eleven,twelve,thir.$t=teen,four.$t,fif.$t,six.$t,seven.$t,eigh.$t,nine.$t];
59178

ไม่คิดอย่างนั้นขอบคุณ;)
roberto06

คุณสามารถบันทึกได้อีก 7 ไบต์โดยการวาง$bและวางอาร์เรย์ที่สองลงใน foreach โดยตรงและอีก 6 ไบต์โดยการวางวงเล็บปีกกาทั้งหมด (แม้ว่าคุณจะต้องใส่$a=$cลงในเซ็ตอัพของ for loop) และอีก 6 ไบต์โดยการเพิ่มทีละหลัง$iเมื่อคุณใช้มันมากกว่าในบิต 'after' ของลูป
user59178

บันทึกหกไบต์ (สองต่อวง) โดยการย้ายการเพิ่มภายหลังจากสำหรับถึงบรรทัดต่อไปนี้:for ($i=0;$i<9;)$a[]=$c.'-'.$a[$i++];
Alex Howansky

อ๊ะขอโทษเพิ่งสังเกตเห็นว่า @ user59178 แนะนำสิ่งเดียวกัน ...
อเล็กซ์ Howansky

6

Python 2, 262 ไบต์

x="one two three four five six seven eight nine ten eleven twelve thir#four#fif#six#seven#eigh#nine#".replace("#","teen ").split()
x+=[a+"ty"+b for a in"twen","thir","for","fif"for b in['']+x[:9]]
v=input()
for s in range(1,x.index(v)+2)if v>50else x[:v]:print s

repl.it

สตริงอินพุตและเอาต์พุตเป็นตัวพิมพ์เล็กและต่อกัน * ดังนั้นเพื่อทดสอบอินพุตสตริงตัวอย่างเช่น"thirtyfive"ที่พร้อมต์

สร้างรายการของคำทั้งหมด (บวก"fiftyone"ถึง"fiftynine") xจากนั้นทดสอบว่าinputเป็นคำที่มีพร็อกซี่v>50(สตริงมีค่ามากกว่าตัวเลขใน Python 2 และตัวเลขทั้งหมดในช่วงอินพุตที่ถูกต้องจากสเปคคือ<=50) และprintเหมาะสม ค่าโดยทั้งหั่นรายการหรือสร้างช่วงของจำนวนเต็ม,x[:v]range(1,x.index(v)+2)

* การเพิ่มยัติภังค์ค่าใช้จ่ายทั้ง 11 ไบต์โดยการแทนที่ด้วยa+"ty"ba+"ty"+'-'*(b>'')+b


5

ภาษา Wolfram, 92 ไบต์

If[NumberQ@#, Do[Print@IntegerName@i, {i, #}], 
  Do[Print@i, {i, Interpreter["SemanticNumber"]@#}]] &

(ฉันใหม่สำหรับสิ่งนี้โปรดแจ้งให้ฉันทราบหากฉันทำอะไรผิด)


2
-10 bytes:Do[Print@If[#>0,i,,IntegerName@i],{i,If[#>0,#,,Interpreter["SemanticNumber"]@#]}]&
JungHwan Min

5

JavaScript (ES6), 261 ไบต์

หมายเหตุ: สตริงที่ได้รับมอบหมายถึง z atobถูกเข้ารหัสด้วย ในสตริงที่เข้ารหัสมี 11 ไบต์ที่ฉันไม่สามารถโพสต์ไปยังเว็บไซต์นี้แม้ว่าพวกเขาจะเป็นตัวละครที่ถูกต้องในสตริงจาวาสคริปต์ ดังนั้นฉันจึงใช้ hex escape ในรูปแบบ \ xHH หนึ่งในการหลบหนีเหล่านี้จะถูกนับเป็น 1 ไบต์
สตริงที่ไม่บีบอัดดั้งเดิมเป็นเวอร์ชันที่ตีกอล์ฟน้อย

x=>(z=btoa('ö\x89ÞöÜ(öØkyï_¢êý~+Þöȱöǯz\x7f^\x8a\x08möx§{Û^\x9f×¥z÷§öÜ\x1e\x96÷½¶\x18«÷×â\x7fß}z(!÷Ûpz\x7f}~\x8aý').split(9),o=(0+z.map((v,i)=>i<20?i<13?v:(v||z[i-10])+'teen':z.slice(0,10).map(d=>(z[i]||z[i-8]||z[i-18])+'ty'+d))).split`,`,p=o.indexOf(x),o.slice(1,-~x+p+!~p).map((x,i)=>~p?i+1:x))

น้อย golfed

x => (
  z = '9one9two9three9four9five9six9seven9eight9nine9ten9eleven9twelve9thir99fif999eigh99twen99for9'
      .split(9),
  o = (0 + // 0 + array to build a comma separated string
       z.map( (v, i) => 
         i < 20 
         ? i < 13 
           ? v // 1 to 13 are 'as is'
           : (v||z[i-10])+'teen' // compose for 14 to 19
         : z.slice(0,10).map(d=>(v||z[i-8]||z[i-18])+'ty'+d)) // 20s, 30s, 40s, 50s
      ).split`,`, // from comma separated to array again
  // o contains strings from one to fiftynine
  p = o.indexOf(x), // look for input
  o.slice(1, -~x+p+!~p).map((x,i) => ~p?i+1:x)
)

ทดสอบ

F=
x=>(z=btoa('ö\x89ÞöÜ(öØkyï_¢êý~+Þöȱöǯz\x7f^\x8a\x08möx§{Û^\x9f×¥z÷§öÜ\x1e\x96÷½¶\x18«÷×â\x7fß}z(!÷Ûpz\x7f}~\x8aý').split(9),o=(0+z.map((v,i)=>i<20?i<13?v:(v||z[i-10])+'teen':z.slice(0,10).map(d=>(v||z[i-8]||z[i-18])+'ty'+d))).split`,`,p=o.indexOf(x),o.slice(1,-~x+p+!~p).map((x,i)=>~p?i+1:x))

function update() {
  var i=I.value
  O.textContent = F(i)
}  

update()
<input id=I value=25 oninput='update()'><pre id=O></pre>


ö\x89ÞöÜ(öØ...สิ่งนี้เป็นสิ่งที่ดี hahaa
Albert Renshaw

เกี่ยวข้องกับบันทึกย่อสูงสุดของคุณ: meta.stackoverflow.com/questions/342546/…
Albert Renshaw

5

Python 3 , 305 303 bytes

แปลงเป็น Python 3 หลังจากคำแนะนำจาก @ nedla2004 ตอนนี้ยังไม่มีช่องว่างระหว่างตัวเลขที่เขียนบนอินพุตหรือเอาต์พุตเช่นป้อนยี่สิบสอง

l='one two three four five six seven eight nine ten eleven twelve thir#four#fif#six#seven#eigh#nine#'.replace('#','teen ').split()
m='twenty','thirty','forty','fifty'
i,R=input(),range
l+=sum([[m[x]]+[m[x]+l[y]for y in R(9)]for x in R(3)],[])
for x in R(1,l.index(i)+2)if i in l else l[:int(i)]:print(x)

ลองออนไลน์ 3!

Python 2 , 327 320 313 308 ไบต์

l='one two three four five six seven eight nine ten eleven twelve thir#four#fif#six#seven#eigh#nine#'.replace('#','teen ').split()
m='twenty','thirty','forty'
i,R=raw_input(),range
l+=sum([[m[x]]+[m[x]+l[y]for y in R(9)]for x in R(3)],[])+['fifty']
for x in R(1,l.index(i)+2)if i in l else l[:int(i)]:print x

ลองออนไลน์ 2!

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


5

Python 2, 432 422 416 403 ไบต์

ฉันแน่ใจว่าสิ่งนี้สามารถปรับปรุงได้ อย่างน้อยที่สุดถ้าฉันสามารถออกไปกับ hardcoding ค่าที่จะทำงานและไม่จำเป็นต้องมีฟังก์ชั่นฉันสามารถบันทึก 20 มันต้องมีพื้นที่ว่างที่จะแยกคำในการป้อนข้อความ บันทึก 6 ไบต์ด้วยคำขอบคุณจาก JonathanAllan ต่อคำตอบของ ElPedro, 4 สำหรับการจัดเรียงคณิตศาสตร์ใหม่

def z(f):
 a,b,i,d="one two three four five six seven eight nine ten eleven twelve thir#four#fif#six#seven#eigh#nine#".replace("#","teen ").split()+[""],"twenty thirty forty fifty".split(),1,f>50
 if d:f=f.split();f=a.index(f[-1])+21+b.index(f[-2])*10 if len(f)>1 else b.index(f[-1])*10+20 if f[-1]in b else a.index(f[-1])+1
 while i<=f:s=i if d else a[i-1]if i<20 else b[i//10-2]+a[i%10-1];print s;i+=1

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


@ JonathanAllan ความคิดเห็นเกี่ยวกับคำตอบของ ElPedro ทำงานที่นี่เช่นกันสำหรับ -6
Chris H

1
len(`f`)>2สามารถ...`f`[2:]อีก 3 ฉันเชื่อ (เพิกเฉยไม่...สามารถทำให้ backticks ทำงานได้อย่างเหมาะสม)
Jonathan Allan

ในความเป็นจริงในหลาม 2 คุณสามารถไปf>50สำหรับ 6 (และอีกคนหนึ่งโดยไม่ได้ใช้d)
โจนาธานอัลลัน

@JonathanAllan TypeError: 'int' object has no attribute '__getitem__'ที่ไม่ทำงานสำหรับการส่งผ่านตัวเลขเป็นจำนวนเต็มซึ่งผมกำลังทำ: ถ้าผมผ่านการป้อนข้อมูลที่เป็นตัวเลขเป็นสตริง, f[2:]ได้ใกล้ชิด แต่ยังคงล้มเหลวเมื่อ trated เป็นแบบบูล ( print f[2:] and Trueพิมพ์บรรทัดว่างถ้า len (ฉ) <2 ไม่ได้TrueหรือFalse)
คริส H

@JanathanAllan f>50ทำงานได้ดีขอบคุณ การวางdไม่ง่ายอย่างนั้นเพราะฉันใส่ค่าสิ้นสุดของลูปเข้าไปfเพื่อไม่สามารถเปลี่ยนif f>50เป็นบรรทัดที่ 8 ได้เพราะมันจะไม่เป็นจริง
Chris H

4

C ++ 11, 484 480 477 ไบต์

#import<iostream>
#import<cstdlib>
#import<vector>
using namespace std;f(){int j,i=2;string s="teen";vector<string>v={"","one","two","three","four","five","six","seven","eight","nine","ten","eleven","twelve"};for(;i++<9;)v.push_back(v[i]+s);v[13]="thir"+s;v[15]="fif"+s;v[18]="eigh"+s;for(i=19;i++<50;){string n[4]={"twenty","thirty","forty","fifty"};v.push_back(n[i/10-2]+v[i%10]);}cin>>s;if(i=atoi(s.c_str()))for(j=0;j++<i;)cout<<v[j]<<" ";else while(v[i++]!=s)cout<<i<<" ";}

การป้อนข้อความเป็นตัวพิมพ์เล็กโดยไม่มีเครื่องหมายขีดคั่น


3

PowerShellขนาด 362 ไบต์

$z=0..50|%{("0twenty0thirty0forty0fifty"-split0)[+(($b="$_"[0])-gt49)*($_-gt19)*(+"$b"-1)]+($x=(("0one0two0three0four0five0six0seven0eight0nine0ten0eleven0twelve"-split0)+(-split'thir four fif six seven eigh nine'|%{$_+'teen'})))[($_%10)*($_-gt19)]+$x[$_*($_-le19)]}
if(($n=-split$args)[0][0]-in48..57){$z[$n[0]..$n[2]]}else{$z.IndexOf($n[0])..$z.IndexOf($n[2])}

ลองออนไลน์! การป้อนคำหรือการป้อนตัวเลข

นี่เป็นระเบียบที่ถูกต้องและฉันไม่ได้มีความสุขมากกับมัน แต่ที่นี่เป็น ยินดีต้อนรับคำแนะนำการเล่นกอล์ฟ

บรรทัดแรกกำหนด$zให้เป็นอาร์เรย์ของคำภาษาอังกฤษเต็มรูปแบบ ท่านสามารถเข้าดู-split0สำหรับตัวเลข1การ12และวงที่จะสร้างทั้งหมดteens และแล้วก็มีพวงของตรรกะที่จะนำทุกอย่างมารวมกันทางด้านขวา ลองออนไลน์!

บรรทัดที่สองเริ่มต้นด้วยตรรกะบางอย่าง เรารับอินพุต$args(เป็นสตริง) วาง-splitไว้ในช่องว่างเก็บไว้$nเพื่อใช้ในภายหลังใช้[0]คำแรกและ[0]อักขระตัวแรกของนั้นและตรวจสอบว่าเป็น-inช่วง48..57(เช่น ASCII 0ถึง9) ดังนั้นเรากำลังตรวจสอบว่าเรามีการป้อนทศนิยมหรืออินพุตภาษาอังกฤษ ลองออนไลน์!

ในกรณีแรกที่เราสร้างช่วงบนพื้นฐานของปัจจัยการผลิตทศนิยมและการใช้งานที่ดัชนีลง$n[0]..$n[2] $z[...]ในอีกกรณีหนึ่งเราจะพบ.indexOf()คำแรกและคำสุดท้ายและสร้างเพียงช่วงตัวเลขจากนั้น ในทั้งสองสถานการณ์ตอนนี้เรามีอาร์เรย์ของออบเจกต์บนไพพ์ไลน์ (ไม่ว่าจะเป็นสตริงหรือจำนวนเต็ม) และโดยนัยWrite-Outputเมื่อโปรแกรมเสร็จสมบูรณ์จะทำให้เรามีบรรทัดใหม่ระหว่างองค์ประกอบ


3

Swift3, 402 ไบต์

let f=["one","two","three","four","five","six","seven","eight","nine"]
let g=["twenty","thirty","forty","fifty"]
let v=[f,["ten","eleven","twelve"],["thir","four","fif","six","seven","eigh","nine"].map{$0+"teen"},[g[0]],f.map{g[0]+$0},[g[1]],f.map{g[1]+$0},[g[2]],f.map{g[2]+$0},[g[3]]].flatMap{$0}
func c(s:String){if let i=Int(s){print(v.prefix(upTo:i))}else{for j in 1...v.index(of:s)!+1{print(j)}}}

Ungolfed:

let f = ["one","two","three","four","five","six","seven","eight","nine"]
let g = ["twenty","thirty","forty","fifty"]

let values = [f,["ten","eleven","twelve"],["thir","four","fif","six","seven","eigh","nine"].map{$0+"teen"},
              [g[0]], f.map{g[0]+$0},
              [g[1]], f.map{g[1]+$0},
              [g[2]], f.map{g[2]+$0},
              [g[3]]].flatMap{$0}

func count(s:String){
    if let i = Int(s) {
        print(values.prefix(upTo: i))
    } else {
        for j in 1...values.index(of: s)!+1{
            print(j)
        }
    }
}

count(s:"29")
count(s:"twentyeight")

ไม่มีอะไรพิเศษที่นี่เพียงใช้อาร์เรย์เพื่อสำรองข้อมูลหมายเลขที่เขียนออกมา

ฉันเดิมคิดว่าวิธีนี้ใช้วิธีอื่นในการคำนวณvaluesอาร์เรย์:

let values = f + ["eleven","twelve"]
    + ["thir","four","fif","six","seven","eigh","nine"].map{$0+"teen"}
    + [g[0]] + f.map{g[0]+$0}
    + [g[1]] + f.map{g[1]+$0}
    + [g[2]] + f.map{g[2]+$0}
    + [g[3]]

ซึ่งสามารถ golfed ไปที่:

let v=f+["eleven","twelve"]+["thir","four","fif","six","seven","eigh","nine"].map{$0+"teen"}+[g[0]]+f.map{g[0]+$0}+[g[1]]+f.map{g[1]+$0}+[g[2]]+.map{g[2]+$0}+[g[3]]

แทนที่บรรทัดที่ 3 ในรหัส golfed

ฉันได้คะแนน 381 ไบต์ แต่มีข้อผิดพลาดของคอมไพเลอร์ที่ระบุว่า: "นิพจน์ซับซ้อนเกินไปที่จะแก้ไขในเวลาที่เหมาะสม" ข้อมูลเพิ่มเติมเกี่ยวกับข้อผิดพลาดสามารถพบได้ที่นี่


ชอบที่จะเห็นอย่างรวดเร็วในที่นี่ฉันจะต้องตรวจสอบเรื่องนี้มากขึ้นเมื่อฉันกลับ
อัลเบิร์ต Renshaw

3

R, 452 430 424 ไบต์

o=c("","one","two","three","four","five","six","seven","eight","nine") 
t=gsub(0,"teen",c("ten","eleven","twelve","thir0","four0","fif0","six0","seven0","eigh0","nine0"))
s=c("twenty","thirty","forty") 
p=""
for(i in s){for(j in o){p=paste0(p,i,j," ")}}
as.data.frame(t(d<-1:50))
names(d)=c(o[-1],t,as.vector(strsplit(p," ")[[1]]),"fifty")
f=function(x){if(is.numeric(x)){names(d)[1:x]}else{matrix(d[1:d[x]],dimnames=NULL)}}

#> f(5)
#[1] "one"   "two"   "three" "four"  "five" 

#> f('five')
#     [,1]
#[1,]    1
#[2,]    2
#[3,]    3
#[4,]    4
#[5,]    5

วางตัวเลขใน data.frame ด้วยหมายเลขที่เขียนออกมาเป็นชื่อคอลัมน์ทำให้การแปลระหว่างสอง (และการพิมพ์ที่ตามมา) เป็นเรื่องง่าย

ความพยายามหลักในการเล่นกอล์ฟคือการสร้างหมายเลขที่เขียนออกมาสำหรับวันที่ 20-49 ซึ่งอาจมากกว่าการเล่นกอล์ฟที่นี่

ฉันพยายามas.matrixพิมพ์ data.frame ด้วยตัวเลข แต่ฉันยังคงมีส่วนหัวของเมทริกซ์ หวังว่าไม่เป็นไร

Ungolfed:

ones <- c("","one","two","three","four","five","six","seven","eight","nine") 
teens <- c("ten","eleven","twelve","thirteen","fourteen","fifteen","sixteen","seventeen","eighteen","nineteen")
tens <- c("twenty","thirty","forty") 

p=""
for(i in tens){
  for(j in ones){
    p=paste0(p, i, j," ")
  }
}

nums <- 1:50
as.data.frame(t(nums))
names(nums) <- c(ones[-1], teens, as.vector(strsplit(p, " ")[[1]]), "fifty")
f <- function(x){
  if(is.numeric(x)){
    names(nums)[1:x]
  } else {
    matrix(nums[1:nums[x]], dimnames = NULL)
  }
}

การปรับปรุงเล็กน้อยเป็น 359 ไบต์:o=c("","one","two","three","four","five","six","seven","eight","nine") ; v=c("ten","eleven","twelve","thirteen","fourteen","fifteen","sixteen","seventeen","eighteen","nineteen"); w=c("twenty","thirty","forty"); a=data.frame(0:50, c(o,v, sapply(w[1:3],function(y) sapply(o,function(x) paste0(y,x))),"fifty")); b=which(a==i); a[if(b<52) 2:b else 2:(b-51),ifelse(b<52,2,1)]
นับ

@count ดูเหมือนว่าจะเป็นการปรับปรุงครั้งใหญ่! ฉันไม่สามารถคิดออกได้ว่าฟังก์ชันนั้นอยู่ที่ไหนหรือคุณจะโต้เถียง
BLT

2

C, 342 331 ไบต์

char*x[]={"teen","one","two","three","four","five","six","seven","eight","nine","ten","eleven","twelve","thir","four","fif","twenty","thirty","fourty","fifty"};void main(int z,char**i){for(z=1;z<=atoi(i[3]);z++)printf("%s%s%s\n",z<16?x[z]:z<20?z^18?x[z-10]:"eigh":x[z/10+14],z>20&&z%10?"-":z>12&&z<20?*x:"",z>20&&z%10?x[z%10]:"");}

ลองออนไลน์!


ภาษาที่ฉันชอบ :)
Albert Renshaw

1
จริงๆแล้วคุณไม่จำเป็นต้องใช้ 1 thru หรือ one thru; codegolf ทั้งหมดนี้ต้องมีอาร์กิวเมนต์ที่สามของคุณ สองคนแรกจะเป็น "1 และถึง" เสมอ (หรือ "หนึ่งและผ่าน")
อัลเบิร์ต Renshaw

@AlbertRenshaw โทรดีมาก! ขอบคุณ :)
Ahemone

1

SAS, 179

%macro c(n);%let f=words.;%if%length(&n)>2%then%do;%do c=1%to 50;%if%qsysfunc(putn(&c,&f))=&n%then%let n=&c;%end;%let f=2.;%end;%do i=1%to &n;%put%sysfunc(putn(&i,&f));%end;%mend;

เอาต์พุตถูกเขียนลงในบันทึกโดยคั่นด้วยบรรทัดใหม่ SAS มีรูปแบบในตัวสำหรับการแปลงตัวเลขเป็นคำซึ่งเป็นข้อได้เปรียบที่สำคัญสำหรับความท้าทายนี้ แต่ก็น่ารำคาญว่ามันไม่มีข้อมูลสำหรับการย้อน

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