Otomatiskan latihan penghitungan tingkat pertama Anda


36

Tantangan CodeGolf

PWSSHHHH! Anda terbangun di laboratorium cryogenics pada tahun 3000. Setelah diantar ke kantor penugasan untuk menerima chip karier Anda, mungkin seorang pengantar kiriman, seorang penyelidik mendeteksi bahwa Anda berasal dari tahun 2000. Karena itu, dan beberapa stereotip, Anda dianggap bodoh dibandingkan dengan manusia modern saat ini dan dipaksa untuk mengulang sekolah dasar.

Anda memasuki ruang kelas satu dan guru memberi tugas. Dia akan mengatakan atau menulis nomor hingga 50. Jika dia menulis nomor di papan tulis (misalnya: 25) maka Anda harus mengatakan angka hingga angka itu "satu, dua, tiga, ..., dua puluh lima ". Jika dia mengatakan nomor itu keras-keras (misalnya: "enam") maka, di tablet Anda, Anda harus menulis angka hingga angka itu "1, 2, 3, 4, 5, 6"

Ini menjadi sangat membosankan dan Anda memutuskan untuk mengotomatiskan proses dengan pengetahuan pemrograman abad ke-21 yang masih berfungsi.


Objektif:

Program Anda harus mengambil input. Input ini akan berupa angka desimal ( 1 thru 50) atau angka yang dituliskan ( one thru fifty).

• Jika input adalah angka desimal, output Anda harus dihitung dari satu ke angka tersebut, menggunakan gaya penulisan. (mis. tiga puluh dua )

• Jika input adalah angka yang ditulis, output Anda harus dihitung dari 1 hingga angka tersebut, menggunakan gaya desimal. (mis. 32 )


Aturan:

Input dan Output dapat dalam hal apa pun yang Anda pilih (sehingga Anda dapat membuat program yang hanya menerima huruf besar jika diinginkan).

Input angka desimal tidak harus dari tipe angka (misalnya int), mereka dapat berupa string input yang berisi angka (25 vs "25"). Keduanya baik-baik saja dan Anda dapat memilih mana yang Anda inginkan untuk diterima oleh program Anda. (Program Anda tidak perlu menerima keduanya)

Gaya tertulis TIDAK memerlukan tanda hubung di antara kata-kata majemuk, tetapi Anda bisa jika diinginkan.

Nilai output harus dipisahkan dalam beberapa bentuk, pemisah apa pun baik-baik saja 1,2,3 1 2 3 etc

Anda tidak dapat menambahkan pustaka tambahan seperti num2words (python) dll. (Namun pustaka sistem baik-baik saja)

Meskipun cerita belakang mengatakan bahwa Anda berasal dari tahun 2000, Anda dapat menggunakan bahasa yang dibuat setelah tanggal tersebut (lol)


Ini adalah , sehingga program dengan bytecount terpendek menang!


1
Apakah kami diizinkan menggunakan perpustakaan seperti num2words dalam kasus python.
Gurupad Mamadapur

1
@AlbertRenshaw tetapi bagaimana dengan builtin yang melakukan itu? (Mathematica)
Pavel

1
@coredump Either berarti Anda dapat memilih satu atau yang lain atau keduanya. Itu tidak harus mampu menangani kedua jenis input
Albert Renshaw

2
"Gigit pantat logam mengkilapku!" Saya tidak akan menghitung sendiri
RaisingAgent

1
Saya terus berpikir bahwa judulnya adalah "penghitungan nilai (pertama Anda)" bukan "penghitungan (nilai pertama)"
CAD97

Jawaban:


32

Perl 6 , 119 113 byte

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

Basis data Unicode FTW!

Menggunakan angka-angka yang ditulis dalam huruf besar tanpa hip, misalnya TWENTYTWO.
Mengembalikan daftar string, atau serangkaian angka. (Keduanya menggunakan ruang sebagai pemisah saat dicetak dengan put.)


3
Ahahaha sangat pintar! Menyukainya
Albert Renshaw

13

Python3, 276 271 269 243 237 235 232 217 byte

Mengambil isyarat dari pengiriman perl @smls ...

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

Saya kira itu mungkin golf sedikit lebih jauh.

Itu menggunakan perpustakaan sistem unicodedatauntuk mencari nama untuk angka. Ini membutuhkan nama-nama nomor huruf besar (dipisahkan oleh spasi :) FORTY TWO) atau bilangan bulat desimal sebagai input.

(Ini adalah pengiriman golf kode pertama saya.)

(Saya juga baru menyadari bahwa saya salah menghitung panjang (penyandian), jadi beberapa byte lebih sedikit dari yang diperkirakan sebelumnya. Namun, saya hanya memperbarui jumlah byte yang terbaru. Ups.)


Selamat datang di PPCG!
AdmBorkBork

Dalam advokasi: unicodedataadalah pustaka sistem yang datang dengan instalasi default, bukan pustaka "ekstra" yang perlu diinstal secara terpisah.
unayok

Selamat datang di situs ini! Anda dapat menghapus banyak ruang dari kode Anda .
xnor

1
Selamat datang di PPCG. Anda dapat kehilangan 3 byte dengan meletakkan cetakan di dalam satu forlingkaran dan memiliki baris baru di antara setiap output. print()tidak peduli apakah itu bilangan bulat atau string. Cobalah online!
ElPedro

1
Saya pikir Anda bisa import*daripada import namemenyimpan beberapa byte
Wheat Wizard

10

Gangguan umum, 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))))

Detail

(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 ~]adalah switch, berdasarkan nilai argumen yang tersedia berikutnya, yang melompat ke format sub-kontrol yang sesuai. Di sini, saya hanya memiliki case "0" dan untuk "lain". Ini digunakan untuk menyisipkan pemisah sebelum setiap angka kecuali yang pertama, terima kasih kepada U mulai dari nol.

  • ~:[ FALSE ~; TRUE ~]adalah format bersyarat; di sini kita menampilkan berbagai hal secara berbeda apakah input s adalah string atau tidak.

  • ~Rtulis nomor sebagai nomor kardinal bahasa Inggris, sedangkan ~Dcukup cetak nomornya.

Contohnya

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

Dari apa yang saya pahami dari pertanyaan, Anda harus dapat mengurai kedua gaya, bukan hanya satu, sehingga solusi 55 byte Anda mungkin tidak valid. "Program Anda tidak perlu menerima keduanya" mengacu pada 25 vs "25", desimal sebagai angka atau sebagai string.
Tom

@TomDevs Terima kasih. Ini jelas membingungkan. Yang pasti, jika saya mendefinisikan fsehingga "(f 2)" mencetak "satu, dua" dan (f "two")mencetak "1, 2", apakah itu terlihat baik bagi Anda?
coredump

Ya, saya pikir itu benar.
Tom

@ TomDevs Terima kasih, saya memperbaikinya
coredump

1
@AlbertRenshaw Tidak, hanya bahasa Inggris; fitur ini mungkin sudah dianggap sebagai mengasapi, tetapi karena sudah diterapkan di beberapa Lisps, itu standar.
coredump

8

JavaScript ES6, 559 526 381 368 364 358 332 327 315 byte

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

Terima kasih kepada Kritixi Lithos untuk gagasan pemisahan array dan Arnauld untuk trik 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
Anda dapat menghapus vardan Anda dapat mengubah array ['one,'two',..]ke"one0two0three0...".split(0)
Kritixi Lithos

Spasi berlebihan di null, Array(n).
Yytsi

2
Anda bisa menggantinya !isNaN(n)dengan 1/n. Ini memberi Anda NaNuntuk string (falsy), float non-nol untuk integer non-nol (benar), atau Infinityuntuk 0 (juga benar).
Arnauld

Tambahkan 4 spasi di depan setiap baris kode
sagiksp

@sagiksp Ya, pasti mengacaukan sesuatu saat mengedit posting, harus diperbaiki sekarang :)
Tom

6

Python 2 , 503 499 494 490 479 byte

-5 dengan terima kasih kepada @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)

Cobalah online!

Masukkan angka atau spasi ejaan angka yang terpisah.

Versi sedikit kurang golf dan lebih mudah dibaca:

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
Hemat 6 byte denganl="one two three four five six seven eight nine ten eleven twelve thir#four#fif#six#seven#eigh#nin#".replace("#","teen ").split()
Jonathan Allan

... oops 5, ketinggalan edari nineteen.
Jonathan Allan

Apakah ada alasan Anda perlu menggunakan Python 2, tanpanya cetak akan lebih lama, tetapi raw_input hanya bisa menjadi input? (Pertanyaan yang sama untuk jawaban Anda yang lain)
nedla2004

@ nedla2004 - Tidak ada alasan lain selain itu saya belum sempat menginstal Python 3 di laptop terbaru saya :-)
ElPedro

6

Skema, 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)))))))

Terkompresi:

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

Bagaimana Anda mengonversi dari misalnya "empat" menjadi 4? Saya tidak yakin string->numberapakah ini, saya memeriksa dengan cepat dan tampaknya digunakan untuk mengkonversi misalnya dari string "4"ke angka 4.
coredump

@coredump Itu benar. (string->number "four")kembali #f.
Michael Vehrs

Skema apa yang Anda jalankan?
coredump

1
@coredump tipu 2.0.9
Michael Vehrs

6

PHP - 397 372 349 344 329 byte

Terinspirasi oleh solusi JS TomDevs

Disimpan 25 byte dengan mengganti $a=[...]oleh$a=explode(...)

Menyimpan 23 byte lainnya dengan beralih kembali ke array tanpa pembatas string dan dengan menyimpan teendalam sebuah variabel, terima kasih kepada @ user59178

Menyimpan 5 byte lainnya dengan menghapus (int)typecasting

Disimpan 15 byte lagi dengan menjatuhkan $b, $idalam fordeklarasi, dan kurung kurawal, terima kasih kepada @ user59178 lagi

$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++.' ';

Tidak Disatukan:

$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++ . ' ';

Cobalah untuk string input atau untuk nomor input


1
Saat bermain golf, Anda dapat menggunakan banyak string secara langsung tanpa tanda kutip, termasuk semua nomor yang Anda gunakan. Ini menyebabkan pemberitahuan tetapi itu dapat diabaikan. Selain itu lebih pendek (dengan 2 byte penuh) untuk disimpan teendalam variabel daripada mengulanginya setiap kali. Dengan demikian akan menjadi:$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];
user59178

Tidak memikirkan hal itu, terima kasih;)
roberto06

Anda dapat menyimpan 7 byte lebih banyak dengan menjatuhkan $bdan meletakkan array kedua langsung ke foreach, 6 byte lebih banyak dengan menjatuhkan semua kurung kurawal (meskipun Anda harus memasukkan $a=$cke dalam pengaturan loop for) dan 6 byte lagi dengan post-incrementing $iketika Anda menggunakannya daripada di 'setelah' sedikit untuk loop.
user59178

Simpan enam byte (dua per loop) dengan memindahkan kenaikan-pos dari dari ke ke baris berikut:for ($i=0;$i<9;)$a[]=$c.'-'.$a[$i++];
Alex Howansky

Ooops, maaf, hanya memperhatikan bahwa @ user59178 menyarankan hal yang sama ...
Alex Howansky

6

Python 2, 262 byte

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

String input dan output adalah huruf kecil dan bersambung *, jadi untuk menguji input string masukkan, misalnya, "thirtyfive"pada prompt.

Buat daftar semua kata (plus "fiftyone"to "fiftynine"),, xlalu uji apakah inputkata dengan proxy v>50(string lebih besar dari angka di Python 2, dan semua angka dalam rentang input yang valid dari spesifikasi tersebut <=50) dan printapakah sesuai nilai dengan mengiris daftar x[:v],, atau membangun berbagai bilangan bulat range(1,x.index(v)+2),.

* Menambahkan tanda hubung pada kedua biaya 11 byte, dengan mengganti a+"ty"bdengan a+"ty"+'-'*(b>'')+b.


5

Bahasa Wolfram, 92 byte

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

(Saya baru dalam hal ini, beri tahu saya jika saya melakukan sesuatu yang salah)


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

5

JavaScript (ES6), 261 byte

Catatan: string yang ditugaskan ke z dikodekan dengan atob. Dalam string yang disandikan ada 11 byte yang saya tidak bisa posting ke situs ini, bahkan jika mereka karakter yang valid dalam string javascript. Jadi saya menggunakan hex escape dalam bentuk \ xHH. Masing-masing lolos ini dihitung sebagai 1 byte.
String asli yang tidak dikompresi adalah versi yang kurang golf .

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

Kurang golf

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

Uji

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ÞöÜ(öØ...barang ini sangat bagus hahaa
Albert Renshaw

Relevan dengan catatan teratas Anda: meta.stackoverflow.com/questions/342546/…
Albert Renshaw

5

Python 3 , 305 303 byte

Dikonversi ke Python 3 setelah saran dari @ nedla2004. Sekarang juga tidak ada ruang antara angka tertulis pada input atau output misalnya masukkan dua puluh dua

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)

Cobalah secara online 3!

Python 2 , 327 320 313 308 byte

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

Cobalah online 2!

163 170 177 byte lebih pendek dari jawaban asli saya jadi saya mempostingnya sebagai alternatif. Ini digunakan forpada dua daftar untuk membangun daftar lengkap semua representasi string dari angka-angka kemudian mengidentifikasi yang benar dalam daftar dan mencetak semuanya hingga itu baik dengan nilai atau indeks. Menghasilkan baris baru untuk setiap nilai.


5

Python 2, 432 422 416 403 byte

Saya yakin ini bisa diperbaiki. Paling tidak jika saya bisa lolos dengan hardcoding nilai untuk dikerjakan dan tidak membutuhkan fungsi saya dapat menyimpan 20. Perlu ruang untuk memisahkan kata-kata dalam input teks. Disimpan 6 byte berkat komentar JonathanAllan pada jawaban ElPedro, 4 untuk mengatur ulang matematika.

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: Versi aktual ini menggunakan tab untuk indentasi alih-alih spasi. QPaysTaxes menambahkan spasi tunggal karena itu tidak merender dengan benar, untuk memastikan bahwa kode yang dikompilasi. Tidak seharusnya mengubah jumlah byte.)


@ Jonathan Jonathan komentar pada jawaban ElPedro bekerja di sini juga untuk -6
Chris H

1
len(`f`)>2bisa ...`f`[2:]untuk 3 lagi saya percaya. (abaikan yang ...sepertinya tidak bisa membuat backtick bekerja dengan benar)
Jonathan Allan

Bahkan dalam python 2 Anda bisa menggunakan untuk f>506. (dan satu lagi dengan tidak menggunakan d)
Jonathan Allan

@JonathanAllan yang tidak bekerja untuk melewati angka sebagai bilangan bulat, yang saat ini saya lakukan: TypeError: 'int' object has no attribute '__getitem__'. Jika saya melewatkan input numerik sebagai string, f[2:]semakin dekat tetapi masih gagal ketika dijalankan sebagai boolean ( print f[2:] and Truemencetak garis kosong jika len (f) <2, tidak Trueatau False)
Chris H

@ JonathanAllan f>50bekerja, terima kasih. Menjatuhkan dtidak begitu sederhana karena saya selalu memasukkan nilai akhir dari loop ke dalam fsehingga baris 8 tidak dapat diubah if f>50karena tidak akan pernah benar.
Chris H

4

C ++ 11, 484 480 477 byte

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

Input teks dalam huruf kecil tanpa tanda hubung.


3

PowerShell , 362 byte

$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])}

Cobalah online! input kata atau input angka

Ini adalah kekacauan yang tepat, dan saya tidak terlalu senang dengan itu, tapi ini dia. Saran bermain golf diterima.

Baris pertama $zmenjadi array kata-kata bahasa Inggris penuh. Anda dapat melihat -split0angka-angka 1untuk 12, dan loop untuk membangun semua teen, dan kemudian ada banyak logika untuk menyatukan semuanya dengan benar. Cobalah online!

Baris kedua dimulai dengan beberapa logika. Kami mengambil input $args(sebagai string), -splititu di spasi, menyimpannya $nuntuk digunakan nanti, mengambil [0]kata pertama , dan [0]karakter pertama dari itu, dan memeriksa apakah itu adalah -inrentang 48..57(yaitu, ASCII 0ke 9). Jadi, kami sedang memeriksa apakah kami memiliki input desimal atau input bahasa Inggris. Cobalah online!

Dalam kasus pertama, kami membuat rentang berdasarkan input desimal $n[0]..$n[2]dan menggunakannya untuk mengindeks $z[...]. Dalam kasus lain, kami menemukan .indexOf()kata pertama dan kata terakhir, dan hanya membangun rentang numerik dari itu. Dalam situasi apa pun, kami sekarang memiliki array objek pada pipa (baik string atau integer), dan implisit Write-Outputpada penyelesaian program memberi kita garis baru antar elemen.


3

Swift3, 402 byte

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

Tidak Disatukan:

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

Tidak ada yang istimewa di sini, hanya menggunakan array untuk membuat cadangan angka yang ditulis.

Saya awalnya berpikir solusi ini menggunakan cara lain ini untuk menghitung valuesarray:

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

Yang bisa golf ke:

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

mengganti baris ke-3 dalam kode golf

Saya bisa saja mencetak 381 byte, tetapi, ada kesalahan kompiler yang mengatakan: "ekspresi terlalu rumit untuk dipecahkan dalam waktu yang wajar", info lebih lanjut tentang kesalahan dapat ditemukan di sini


CINTA melihat dengan cepat di sini, saya harus memeriksa ini lebih banyak ketika saya kembali
Albert Renshaw

3

R, 452 430 424 byte

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

Tempatkan angka-angka dalam data.frame dengan angka-angka yang ditulis sebagai nama kolom, membuat terjemahan antara keduanya (dan pencetakan berikutnya) cukup mudah.

Upaya utama dalam bermain golf adalah menciptakan angka-angka yang ditulis untuk 20-49, mungkin lebih banyak untuk bermain golf di sini.

Saya berusaha dengan as.matrix mencetak data.frame hanya dengan angka-angka, tetapi saya masih pergi dengan header matriks. Semoga tidak apa-apa.

Tidak Disatukan:

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

Peningkatan sedikit ke 359 Bytes: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)]
hitung

@count terlihat seperti peningkatan besar! Sepertinya saya tidak bisa mencari tahu di mana fungsinya, atau di mana Anda akan bertengkar.
BLT

2

C, 342 331 byte

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

Cobalah online!


Bahasa favorit saya :)
Albert Renshaw

1
Anda sebenarnya tidak membutuhkan 1 melalui atau satu melalui; semua codegolf ini membutuhkan adalah argumen ketiga Anda. Dua yang pertama akan selalu menjadi "1 dan melalui" (atau "satu dan melalui")
Albert Renshaw

@AlbertRenshaw Panggilan bagus! Terima kasih :)
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;

Output ditulis ke log yang dipisahkan oleh baris baru. SAS memiliki format bawaan untuk mengonversi angka menjadi kata-kata, yang merupakan keuntungan utama untuk tantangan ini, tetapi yang menjengkelkan tidak memiliki informasi untuk melakukan sebaliknya.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.