Tantangan ini didasarkan pada video ini . Saya sarankan Anda menontonnya sebelum mencoba tantangan ini.
Pertama kita mendefinisikan suatu fungsi. Fungsi ini ( OEIS ) mengambil bilangan bulat n sebagai input dan menghasilkan jumlah huruf dalam representasi bahasa Inggris dari n (tanpa spasi atau tanda hubung). Misalnya "tiga" memiliki 5 huruf jadi 3 peta ke 5.
Seperti yang diperlihatkan dalam video dimulai dengan nomor yang berulang proses ini pada akhirnya akan menghasilkan empat, yang akan memetakan dirinya sendiri selamanya.
Berikut ini adalah grafik yang diarahkan langsung yang menunjukkan orbit angka kurang dari 16:
12 11
\|
15 2 6 1 10 14 13
\ \|/ / / /
7 3-/ 8--/
\| /
9 0 5--/
\ \|
\-4
Tantangan Anda adalah menentukan jumlah langkah yang akan diambil suatu angka (atau berapa kali fungsi ini harus diterapkan pada angka) sebelum mencapai empat (yaitu level pada grafik yang diarahkan pada gambar).
Membentuk angka bahasa Inggris
Berikut adalah penjelasan singkat tentang bagaimana seseorang harus membentuk kata-kata bahasa Inggris untuk tantangan ini:
Angka satu hingga sembilan belas adalah:
satu, dua, tiga, empat, lima, enam, tujuh, delapan, sembilan, sepuluh, sebelas, dua belas, tiga belas, empat belas, lima belas, enam belas, tujuh belas, delapan belas, sembilan belas
Untuk angka yang lebih besar dari sembilan belas prosesnya adalah sebagai berikut:
Jika nomor tersebut memiliki ratusan tempat, mulailah dengan nama digit di ratusan tempat dan "ratus".
misalnya
100 -> "onehundred"
Jika sisanya kurang dari dua puluh tambahkan perwakilan bahasa Inggris sisanya.
misalnya
714 -> "sevenhundredfourteen"
Kalau tidak, jika puluhan digit bukan nol tambahkan representasi yang tepat:
2-> twenty
3-> thirty
4-> forty
5-> fifty
6-> sixty
7-> seventy
8-> eighty
9-> ninety
misalnya
470 -> "fourhundredseventy"
Akhirnya jika ada satu digit menambahkan perwakilannya
misalnya
681 -> "sixhundredeightyone"
Ketentuan lebih lanjut
Untuk angka yang lebih besar dari seratus Anda harus meninggalkan "dan" saat menghitung jumlah huruf. Misalnya 577 adalah "fivehundredseventyseven" yang memiliki 23 huruf.
Program Anda harus menerima semua bilangan bulat yang lebih besar dari 0 dan kurang dari 1.000 sebagai input melalui metode standar.
Program Anda harus menampilkan jumlah langkah yang diperlukan untuk metode keluaran standar.
Ini codegolf sehingga solusi dengan byte paling sedikit menang.
Uji kasus
1 -> 3
4 -> 0
7 -> 2
23 -> 5
577 -> 6
600 -> 4
sumber
Jawaban:
JavaScript (ES6), 106 byte
String tampaknya menjadi cara terbaik untuk menyandikan panjang, meskipun overhead konversi numerik.
sumber
Python, dengan num2words,
97 113 115 94 9392 byte+16 byte (lupa tanda hubung yang berlaku num2words yang tidak benar-benar mengubah hasil dari setiap kasus uji, meskipun
23
dan577
masing-masing memiliki tanda hubung)+2 byte (lupa untuk menyertakan
f=
meskipun rekursif)-20 byte (gunakan
re
)-8 byte berkat @Wheat Wizard (gunakan
~
, gantin!=4
dengann-4
, dan ... satu impor baris> _ <)-1 byte berkat @Cyoce (spasi dari
4 and
)Hitung saja jumlah langkah; berfungsi untuk bilangan bulat besar dan negatif juga (
\W
temukan spasi, koma, dan tanda hubung dalam hasil num2words):Inilah kasus terakhir, langkah demi langkah:
sumber
f=
sebelum fungsi lambda Andaimport re,num2words as r
alih-alih dari dua pernyataan yang berbeda.n-4
adalah hal yang sama sepertin!=4
num2words
adalahw
,re
masihre
- perhatikan bahwa baik modul dan fungsinya disebutnum2words
and 1+
bisa diganti denganand-~
menyimpan satu bytePyth - 54 byte
Akan mencoba untuk refactor.
Test Suite .
sumber
Mathematica, 89 byte
Mathematica Khas: fungsi bawaan baik, nama fungsi panjang buruk.
FixedPointList
berlaku argumen pertamanya (fungsi) ke argumen kedua berulang kali sampai jawabannya tidak berubah, daftar semua hasil; hasilnya termasuk input asli dan dua salinan dari output berulang, karenanya-2
pada akhirnya. Built-in MathematicaIntegerName
berisi spasi dan tanda hubung, jadi kita harus menyingkirkannya dengan tangan.Mengganggu,
IntegerName
output berisi karakter "-" (Unicode # 8208) daripada tanda hubung normal; itu sebabnya kiriman ini adalah 89 byte daripada 88. (Dan saya tidak bisa mendahului kode di atas dengan empat spasi dan membuatnya menerima karakter Unicode — bantuan? —jadi kode di atas tidak akan berfungsi dengan tepat jika dipotong dan disisipkan .)sumber
Python 2.7,
344216208 byte:Tidak menggunakan perpustakaan eksternal tidak seperti jawaban Python lainnya. Membawa input through
stdin
dan output kestdout
.Repl.it dengan Semua Kasing Uji!
Penjelasan
Pertama membuat 3 kamus dengan masing-masing memasangkan panjang representasi kata bahasa Inggris dari setiap angka ke angka yang diwakili dalam interval tertutup
[1,9]
di tempat, puluhan, dan ratusan masing-masing. Misalnya, entri pertama dalam kamusd
adalah1:3
seperti1
yang diejaone
dalam bahasa Inggris dan memiliki3
huruf.Kemudian, setiap digit tempat di beberapa input string
x
ditugaskan ke kamus yang sesuai, setelah itu setiap angka di setiap tempat dicocokkan dengan nilainya dalam kamus yang sesuai. Misalnya, misalkan nomor inputnya23
. Di20
tempat puluhan akan dipasangkan dengan kamuse
, di mana ia dicocokkan dengan6
, dan3
di tempat yang akan dipasangkan dengan kamusd
, di mana ia cocok dengan5
. Digit yang cocok ini kemudian ditambahkan bersama-sama untuk mewakili panjang representasi bahasa Inggris dari angka, yang ditugaskanx
sebagai string dan, selamax!='4'
, loop sementara berjalan, bertambahc
dengan1
setiap kali mewakili jumlah langkah yang diambil sejauh ini. Oleh karena itu,23
akan sesuai dengan langkah-langkah total.11
, yang pada gilirannya sesuai dengan6
yang akan beralih ke3
dan kemudian ke5
dan akhirnya ke4
, menghasilkan5
Akhirnya, setelah loop selesai,
c
adalah outputstdout
untuk mewakili "Distance to Four", yang dalam hal ini adalah5
.sumber
Jawa,
556295 byteTerima kasih kepada @KevinCruijssen karena telah menghemat 261 byte
Tidak Disatukan:
sumber
s++
tidak mungkin pada sebuah String-array ..: Ss
.. Btw, Anda dapat golf kode Anda dengan jumlah yang cukup besar seperti ini:int c(int n){int s[]={0,3,3,5,4,4,3,5,5,4,3,6,6,8,8,7,7,9,8,8,6,9,9,11,10,6,5,5,5,7,6,6},c=0,t=(int)Math.pow(10,(int)Math.log10(n)),x=1;while(n>0)if(n/100>0)c+=s[n/100]+7;else{if(n>0&n<25){c+=s[n];break;}else c+=s[(n/10)+22];}n%=t;t/=10;}for(;c!=4;x++,c=s[c]);return x;}