2019 telah datang dan mungkin semua orang telah memperhatikan keanehan dari angka ini: itu sebenarnya disusun oleh dua sub-angka (20 dan 19) yang mewakili urutan angka-angka menurun berurutan.
Tantangan
Diberi nomor x
, kembalikan panjang urutan maksimum berturut-turut, angka menurun yang dapat dibentuk dengan mengambil sub-angka x
.
Catatan:
- sub-angka tidak boleh mengandung angka nol di depan (mis.
1009
tidak bisa dibagi menjadi10
,09
) - berturut-turut dan menurun berarti bahwa angka dalam urutan harus sama dengan angka sebelumnya -1, atau (mis. tidak dapat dibagi menjadi karena dan tidak berturut-turut, )
52
5,2
5
2
2 ≠ 5 - 1
- urutan harus diperoleh dengan menggunakan jumlah penuh, misalnya dalam
7321
Anda tidak bisa membuang7
dan mendapatkan urutan3
,2
,1
- hanya satu urutan dapat diperoleh dari angka, misalnya
3211098
tidak dapat dibagi menjadi dua urutan3
,2
,1
dan10
,9
,8
Memasukkan
- Angka integer (
>= 0
): bisa berupa angka, atau string, atau daftar digit
Keluaran
- Sebuah bilangan bulat tunggal yang diberikan jumlah maksimum dari pengurangan sub-angka (perhatikan bahwa batas bawah dari angka ini adalah
1
, yaitu angka yang disusun dengan sendirinya dalam urutan panjang satu yang menurun)
Contoh:
2019 --> 20,19 --> output : 2
201200199198 --> 201,200,199,198 --> output : 4
3246 --> 3246 --> output : 1
87654 --> 8,7,6,5,4 --> output : 5
123456 --> 123456 --> output : 1
1009998 --> 100,99,98 --> output : 3
100908 --> 100908 --> output : 1
1110987 --> 11,10,9,8,7 --> output : 5
210 --> 2,1,0 --> output : 3
1 --> 1 --> output : 1
0 --> 0 --> output : 1
312 --> 312 --> output : 1
191 --> 191 --> output : 1
Aturan umum:
- Ini adalah kode-golf , jadi jawaban tersingkat dalam byte menang.
Jangan biarkan bahasa kode-golf mencegah Anda memposting jawaban dengan bahasa non-codegolf. Cobalah untuk memberikan jawaban sesingkat mungkin untuk bahasa pemrograman 'apa saja'. - Aturan standar berlaku untuk jawaban Anda dengan aturan I / O default , sehingga Anda diizinkan untuk menggunakan STDIN / STDOUT, fungsi / metode dengan parameter yang tepat dan tipe pengembalian, program penuh. Panggilanmu.
- Celah default tidak diperbolehkan.
- Jika memungkinkan, silakan tambahkan tautan dengan tes untuk kode Anda (yaitu TIO ).
- Juga, menambahkan penjelasan untuk jawaban Anda sangat dianjurkan.
210 -> 2,1,0
salah (sama dengan0 -> 0
)? Tugas mengatakan " sub-angka tidak boleh mengandung angka nol di depan ", apakah nol kasus khusus?212019
. Sepertinya saya tidak membaca semua aturan.Jawaban:
Jelly ,
159 bytePerbaikan bug berkat Dennis
Cobalah online! (bahkanO ( N2)
321
membutuhkan setengah menit karena kode setidaknya)Bagaimana?
sumber
JavaScript (ES6), 56 byte
Port jawaban Python ArBo secara signifikan lebih pendek. Namun, itu gagal pada beberapa kasus uji karena terlalu banyak rekursi.
Cobalah online!
JavaScript (ES6), 66 byte
Mengambil input sebagai string.
Cobalah online!
Berkomentar
sumber
Perl 6 ,
43 4140 byte-1 byte terima kasih kepada nwellnhof
Cobalah online!
Solusi berbasis Regex. Saya mencoba menemukan cara yang lebih baik untuk mencocokkan dari daftar yang menurun, tetapi Perl 6 tidak melakukan partisi dengan baik
Penjelasan:
sumber
Python 3 ,
232228187181180150149 byte-1 terima kasih kepada @ Jonathan Frech
Cobalah online!
Kode ungolfed awal:
sumber
s+1 for
bisas+1for
,(t(n[:j])-t(n[j:j+i])==1)*t(n[0])
mungkin bisat(n[:j])-t(n[j:j+i])==1>=t(n[0])
.if
.Python 2 ,
787473 byteCobalah online!
-1 byte terima kasih kepada Arnauld
Mengambil input sebagai string. Program agak cepat berjalan ke batas kedalaman rekursi Python, tetapi dapat menyelesaikan sebagian besar kasus uji.
Bagaimana itu bekerja
sumber
a+c+1
dapat disingkat menjadia-~c
.05AB1E , 10 byte
Sangat lambat, jadi TIO di bawah ini hanya berfungsi untuk test case di bawah 750 ..
Cobalah online .
Penjelasan:
sumber
n!
ken lg n
hanya tidak layak.Pyth, 16 byte
Coba online di sini , atau verifikasi semua uji sekaligus di sini .
sumber
Jelly , 11 byte
Cobalah online!
Bagaimana itu bekerja
sumber
Arang , 26 byte
Cobalah online! Tautan adalah untuk mengucapkan versi kode. Penjelasan:
Loop
i
dari 0 hingga panjang input.Loop
k
dari 0 hingga panjang input.Hitung
k
angka pertama dalam urutan menurun mulai dari angka yang diberikan olehi
digit pertama input, gabungkan mereka, dan kumpulkan setiap string yang dihasilkan dalam daftar kosong yang telah ditentukan.Temukan posisi salinan yang cocok pertama dari input dan kurangi itu modulo 1 lebih dari panjang input.
Contoh: Untuk input dari
2019
string berikut dihasilkan:2019
kemudian ditemukan pada indeks 12, yang direduksi modulo 5 untuk memberikan 2, jawaban yang diinginkan.sumber
Haskell, 87 byte
Input adalah daftar digit.
Cobalah online!
Function
#
membangun daftar semua kemungkinan split dengan melihat keduanyaa
ke semua pemisahan yang dikembalikan oleh panggilan rekursif dengan sisa input (x<-b#c
), tetapi hanya jika nomor berikutnya bukan nol (b>0
) (atau itu adalah nomor terakhir dalam input (c==[]
)) dana
merupakan yang lebih besar dari yang pertama jumlah masing-masing split sebelumnyax
(a==x!!0+1
).dan
b
dari daftar input ke nomor saat inia
dan melanjutkan dengan sisa input ((10*a+b)#c
)Kasing dasar adalah ketika daftar input kosong (mis. Tidak cocok dengan pola
(b:c)
). Rekursi dimulai dengan angka saat inia
menjadi0
((0#)
), yang tidak pernah mengenai cabang pertama (prabayara
ke semua pemisahan sebelumnya), karena angka itu tidak akan pernah lebih besar dari jumlah perpecahan mana pun.Ambil panjang setiap perpecahan dan temukan maksimum (
maximum.map length
).Varian dengan juga 87 byte:
yang pada dasarnya bekerja dengan cara yang sama, tetapi alih-alih menjaga seluruh perpecahan dalam daftar, itu hanya membuat sepasang
(r,x)
panjang perpecahanr
dan angka pertama dalam perpecahanx
.sumber
Python 3 ,
302282271 byte-10 byte berkat tipnya oleh @ElPedro.
Mengambil input sebagai string. Pada dasarnya, dibutuhkan irisan angka yang lebih besar dari kiri, dan melihat apakah untuk irisan nomor itu urutan dapat dibentuk menggunakan semua angka.
Cobalah online!
sumber
range
3 kali, Anda dapat menentukan diR=range
luar kedua fungsi dan kemudian menggunakanR(whatever)
alih-alihrange(whatever)
menyimpan 4 byte.Japt , 27 byte
Cobalah online! atau Periksa sebagian besar kasus uji
Ini tidak menghasilkan skor yang baik, tetapi menggunakan metode yang unik dan mungkin ada ruang untuk bermain golf lebih banyak. Ini juga berkinerja cukup baik sehingga semua test case selain
201200199198
menghindari penghentian waktu.Penjelasan:
sumber
21201
karena mereka tidak memaksakan bahwa urutan akhir menyelaraskan dengan benar (dari versi asli saya, baris "berakhir dengan koma"). Ini atau ini karya alternatif.210
karena tidak ada pembatas setelah 0. Berikut ini adalah byte tetap 28 yang berfungsi.Haskell, 65 byte
Input adalah sebuah string.
Cobalah online!
Sangat berbeda dengan jawaban saya yang lain . Suatu kekuatan kasar sederhana yang mencoba semua daftar angka-angka menurun berurutan sampai menemukan satu yang sama dengan daftar input.
Jika kita membatasi jumlah input ke 64-bit bilangan bulat, kita dapat menghemat 6 byte dengan perulangan
y
melalui[1..19]
, karena terbesar 64-bit integer memiliki 19 digit dan tidak perlu untuk daftar uji dengan unsur-unsur yang lebih.Haskell, 59 byte
Cobalah online!
sumber
Python 2 , 95 byte
Solusi lain yang lambat dan kasar.
Cobalah online!
sumber
Dyalog APL, 138 byte
Sedikit suap, tetapi bekerja cepat untuk jumlah besar juga Jika Anda mencobanya secara online , awali dfn dengan
⎕←
dan berikan input di sebelah kanan sebagai daftar angka.Penjelasan
Pertama, dfn bagian dalam di sebelah kanan yang secara rekonstruk menyusun daftar cara yang mungkin untuk mem-partisi (dengan
⊂
) daftar digit. Misalnya1 0 1 0 ⊂ 2 0 1 9
mengembalikan vektor bersarang(2 0)(1 9)
.Kami menggunakan
1,
untuk menambahkan kolom 1s di awal dan berakhir dengan matriks partisi yang valid untuk ⍵.Sekarang fungsi kereta di sebelah kiri di parens. Karena
⍨
argumen kiri ke kereta adalah deretan matriks partisi dan argumen yang tepat adalah input pengguna. Kereta adalah tumpukan garpu dengan puncak sebagai tine paling kiri.Jika partisi menciptakan urutan angka menurun, kereta mengembalikan panjang urutan. Kalau tidak nol.
⍤1⊢
menerapkan fungsi kereta antara input pengguna dan setiap baris dari matriks partisi, mengembalikan nilai untuk setiap baris matriks.⊢
Diperlukan untuk mendua antara operan⍤
dan argumen ke fungsi turunan dari⍤
.⌈/
menemukan maksimum.Bisa menemukan algoritma yang lebih pendek tetapi saya ingin mencoba cara ini yang paling langsung dan deklaratif yang bisa saya pikirkan.
sumber
TSQL, 169 byte
Catatan: ini hanya dapat dieksekusi ketika input dapat dikonversi ke integer.
Sql rekursif digunakan untuk perulangan.
Golf:
Tidak Disatukan:
Cobalah
sumber
R , 101 byte
Cobalah online!
Lebih dari 2 minggu telah berlalu tanpa jawaban R, jadi saya memutuskan untuk memposting sendiri :)
Kode ini cukup cepat karena menggunakan pendekatan brute force "terbatas"
Kode dan penjelasan yang belum dibuka:
sumber