Dilema Disarium
Disarium didefinisikan sebagai angka yang:
jumlah digitnya yang diberdayakan dengan posisi masing-masing sama dengan angka aslinya
Tugas Anda :
Anda memiliki obsesi aneh dengan angka-angka yang diklasifikasikan sebagai disarium. Kebutuhan untuk mengikuti cara-cara disarium begitu besar dalam diri Anda sehingga Anda menolak untuk membaca halaman-halaman bernomor non-disarium dalam buku apa pun. Anda memiliki dua masalah BESAR :
- Profesor Anda baru saja menugaskan Anda untuk membaca buku teks Anda dari halaman
n
ke halamanm
- Anda memukul kepala Anda dengan sangat keras minggu lalu dan sepertinya tidak dapat mengingat bagaimana secara program menentukan apakah suatu angka dianggap sebagai disarium.
Waktu sangat penting sehingga kode untuk menentukan halaman yang perlu Anda baca harus sesingkat mungkin.
Anda perlu mengidentifikasi semua disarium yang dalam rentang termasuk n
melalui m
.
Contoh disarium :
89 = 8 1 + 9 2
135 = 1 1 + 3 2 + 5 3
518 = 5 1 + 1 2 + 8 3
Ini adalah kode-golf, jadi jumlah byte terkecil yang menang!
Berikut ini adalah urutan lengkap A032799 .
n
danm
? Ada disarium yang sangat besar (12157692622039623539), haruskah jawaban dapat mengidentifikasinya?Jawaban:
Perl 6 ,
4039 byteCobalah online!
Bagaimana itu bekerja
sumber
Python2,
98898884 byteMengerikan. Akan semakin pendek.Mulai terlihat lebih baikInilah upaya rekursif saya (86 byte):
Terima kasih kepada @Rod karena telah menghemat 4 byte!
range
keenumerate
dan seterusnya.sumber
enumerate
, Anda dapat menggunakanint(n)
sebagai gantinyaint(`x`[p])
Perl, 43 byte
Cobalah online!
Regex sangat kuat, kalian.
Penjelasan
Hal pertama yang dilakukan kode adalah membaca dua bilangan bulat sebagai input via
<>
, dan membuat rentang dari yang pertama ke yang kedua..
. Ia kemudian menggunakan standarmap
fungsi untuk iterate melalui kisaran ini, dan berlaku kode berikut untuk setiap nilai:say if$_==eval s/./+$&**$+[0]/gr
. Ini terlihat seperti omong kosong, dan memang begitulah, tapi inilah yang sebenarnya terjadi.map
secara implisit menyimpan nilai saat ini dalam variabel$_
. Banyak fungsi perl dan operasi menggunakan nilai ini ketika tidak ada yang diberikan. Ini termasuk ekspresi reguler, sepertis///
operator substitusi.Ada empat bagian untuk regex substitusi:
=~
digunakan untuk menerapkan regex ke string, tetapi jika operator ini tidak ada, maka regex diterapkan ke variabel implisit$_
, yang berisi nomor kami saat ini melaluimap
fungsi..
. Akibatnya, kami menangkap setiap digit individu.+
diikuti oleh ekspresi matematika, dicampur dengan beberapa variabel Perl ajaib yang membuat semuanya secara signifikan lebih mudah.Variabel skalar khusus
$&
selalu berisi keseluruhan dari penangkapan regex sukses terakhir, yang dalam hal ini adalah satu digit. Variabel array khusus@+
selalu berisi daftar offset postmatch untuk kecocokan sukses terakhir, yaitu indeks teks setelah pertandingan.$+[0]
adalah indeks$_
teks segera berikut$&
. Dalam kasus135
, kami menangkap digit1
, dan indeks135
teks segera setelahnya (yaitu,35
) adalah 1, yang merupakan eksponen kami. Jadi, kami ingin meningkatkan$&
(1) ke kekuatan$+[0]
(1) dan mendapatkan 1. Kami ingin menaikkan 3 ke kekuatan 2 dan mendapatkan 9. Kami ingin menaikkan 5 ke kekuatan 3 dan mendapatkan 125.Jika input tadi
135
, string yang dihasilkan adalah+1**1+3**2+5**3
./g
dan/r
./g
memberitahu juru bahasa untuk melanjutkan penggantian setelah yang pertama ditemukan (kalau tidak kita akan berakhir dengan+1**135
)./r
memberi tahu penerjemah untuk tidak mengubah string asli , dan sebaliknya mengembalikan apa yang akan menjadi string setelah penggantian. Ini penting, karena jika tidak, itu akan ditimpa$_
, dan kita memerlukannya untuk tujuan perbandingan.Setelah seluruh penggantian dilakukan, kita mendapatkan ekspresi matematika, yang dievaluasi dengan
eval
fungsinya.+1**1+3**2+5**3
dievaluasi menjadi1 + 9 + 125 = 135
, yang dibandingkan dengan nomor aslinya135
. Karena keduanya sama, kode mencetak angka.sumber
map$_-eval s/./+$&**$+[0]/gr||say,<>..<>
"@+"
1 byte lebih pendek dari$+[0]
:)JavaScript (ES7),
10591898883798281 byteTerima kasih kepada Arnauld untuk menghemat 20B, dan ETHProduk untuk menghemat 6B!
Pemakaian
Tetapkan fungsi ke variabel, dan berikan minimum dan maksimum sebagai argumen. Contoh:
Keluaran
Golf lebih lanjut
Ini sepertinya golf yang bagus, tapi selalu ada ruang untuk perbaikan ... saya pikir.
sumber
d**(e+1)
ked**-~e
untuk menyimpan dua byte.&
bukan&&
. Satu byte lagi untuk pergi ...JavaScript (Firefox 52+), 68 byte
Fungsi rekursif yang dihasilkan melalui
alert
. Bekerja di Edisi Pengembang Firefox, yang dapat Anda unduh di halaman ini . Versi Firefox sebelumnya tidak mendukung**
operator, dan tidak ada browser lain yang mendukung[for(a of b)c]
sintaksis.Cuplikan tes
Ini menggunakan
.map
alih-alih pemahaman array, danMath.pow
bukannya**
, jadi itu harus bekerja di semua browser yang mendukung ES6.Tampilkan cuplikan kode
sumber
05AB1E , 12 byte
Disimpan 2 byte berkat Emigna
Cobalah online!
sumber
ŸvygLySmOyQ—
harus bekerja selama 12 byte.Python 3, 100 byte
Bukan pendekatan terpendek, tapi yang cukup lucu. Ada banyak sekali disarium; lihat halaman OEIS untuk bukti yang bagus. Ini semuanya.
sumber
R, 100 byte
Fungsi tanpa nama yang mengambil
n
danm
. Seperti biasa dalam R, membelah bilangan bulat menjadi vektor angka numerik itu membosankan dan memakan banyak byte. Ini membuat fungsinya relatif lambat dan hanya berfungsi untuk bilangan bulat 32-bit.sumber
Jelly , 11 byte
Cobalah online!
Kurangi ini dari 16 menjadi 11, dengan bantuan dari @miles!
Penjelasan:
sumber
J
untuk mendapatkan indeks. Cara yang lebih pendek mungkinD*J$S⁼
untuk menggabungkan dua Anda link dalam satuCJam , 23 byte
Cobalah online!
Penjelasan
sumber
05AB1E , 18 byte
Cobalah online!
sumber
Python 2.X, 92 byte
sumber
(i+1)
, tetapi ini tidak menjadi masalah, saat Anda menyingkirkan tanda kurung dengan melakukan-~i
.list('k')
, yang saya tidak punya. Namun, Anda masih dapat menghapus spasi :)Python 2 , 84 byte
Pendekatan program penuh, saat ini sama dengan solusi lambda.
Cobalah online!
sumber
input()
. Sangat bagus! +1.Japt, 15 byte
Uji secara online! Ini adalah kolaborasi antara @obarakon dan saya.
Bagaimana itu bekerja
Dalam versi terbaru dari Japt,
x
menerima fungsi sebagai argumen, yang memungkinkan kita untuk membuat byte lain:Uji secara online!
sumber
Clojure, 107 byte
Menerapkan persamaan sangat lama.
sumber
(.pow(-(int v)48M)
TI-Basic, 85 byte
sumber
int(log(
setiap angka dan kemudian melakukan kekuatan. Mungkin ini lebih pendek, tapi saya ragu.FUNC
mode dan jendela harus diatur untuk memasukkan titik input Anda. Sepertinya tidak cukup portabel untuk saya.FUNC
mode, meskipun saya melihat apa yang Anda katakan tentang resolusi input. Tapi, metode ini cukup umum dalam bermain golf. Anda selalu bisaPrompt X,Y
sebagai gantinya.Haskell, 61 byte
Contoh penggunaan
5 # 600
->[5,6,7,8,9,89,135,175,518,598]
.Periksa setiap nomor
i
dalam kisaran[n..m]
. Digit diekstraksi dengan mengubahi
menjadi string (show
) dan membuat masing-masing karakter menjadi satu elemen string (pure
) yang diubah menjadi integer lagi (read
). Zip elemen-elemen angka dengan dengan[1..]
melalui fungsi^
dan mengambilsum
.sumber
PHP,
929188 byte3 byte disimpan berkat @AlexHowansky
mengambil input dari argumen baris perintah; mencetak koma jejak. Jalankan dengan
-r
.sumber
for([,$n,$m]=$argv;$n<=$m;
"$n"[index]
dan"_$n"[index]
menghasilkan kesalahan parse sementara"89"[index]
dan$s="$n";$s[index]
baik-baik saja.("_$n")[index]
Mathematica, 59 byte
Fungsi tanpa nama mengambil dua argumen integer dan mengembalikan daftar integer.
(d=IntegerDigits@#)^Range@Length@d
menghasilkan daftar digit angka dengan kekuatan yang sesuai;Tr[...]==#
mendeteksi apakah jumlah angka-angka tersebut sama dengan angka aslinya.sumber
MATLAB,
8873 byteJawaban asli:
num2str(n)-'0'
membagi an
menjadi vektor digit-nya, dan1:floor(log10(n))+1
merupakan vektor yang menahan satu ke jumlah digitn
. Terima kasih untuk log golf ke fungsi anonim, menghemat 15 byte.sumber
Haskell ,
82 7675 byteCobalah online!Pemakaian:
5 ! 175
Ini memeriksa setiap angka dalam kisaran
n
untukm
apakah itu nomor disarium dan karenanya cukup lambat untuk besarm
.Versi lebih cepat: (93 byte)
Cobalah online!
sumber
C (gcc) , 136 byte
Header mendefinisikan pow pada TIO karena untuk beberapa alasan tidak otomatis menyertakan pow. Komputer saya melakukannya, jadi saya akan melakukannya.
Cobalah online!
sumber
MATL , 16 byte
Cobalah online!
sumber
Batch, 115 byte
Batch hanya memiliki aritmatika 32-bit yang tidak memiliki cara membandingkan angka disarium terakhir, tetapi jika Anda bersikeras untuk perbandingan string, maka untuk 402 byte:
sumber
Python 2, 100 byte
Saya belum memiliki kesempatan untuk menjalankan ini (melakukan ini di ponsel saya).
sumber
sum
.i
Disarium. Saya tidak tahu apakah ini diperbolehkan, tetapi saya akan mengatakan tidak, karena hasilnya menjadi sangat kosong.Scala,
132129 byte129 edit: Mengubah nama variabel for loop dari
&
menjadii
tiga ruang yang disimpan.Penjelasan
Untuk setiap nilai dalam rentang input:
+""
zipWithIndex
untuk menghasilkan daftar tupel yang mengandung karakter angka dan indeksnyaKomentar
Akhirnya sempat belajar bagaimana
fold
danzipWithIndex
bekerja. Saya tidak senang denganint
konversi, tetapi saya senang dengan ringkasnyafold
danzipWithIndex
.sumber
Oktaf,
88, 87 byteTerima kasih kepada MattWH karena telah menyimpan byte (f (x) -48 vs f (x) - '0')
Untuk berlari:
Penjelasan
sumber
C
175169 byteVersi tidak disatukan:
Dapat dipersingkat dalam beberapa cara, tetapi saya tidak melihatnya saat ini.
@ TuukkaX Terima kasih telah menghemat 6 byte.
sumber
n!=0
dapat diubah menjadin
.Jawa
Penjelasan
sumber
Python 3: 131 Bytes
Setelah membuat kode ini, menjadi jelas bahwa ada sejumlah terbatas disarium, sehingga mungkin lebih layak untuk memeriksa ini secara eksplisit daripada menggunakan begitu banyak pemahaman daftar yang sulit pada input besar untuk solusi ini.
Cobalah online!
sumber