Pengantar:
Saya mengumpulkan teka-teki berliku. Sebagian besar teka-teki berliku diproduksi dan dijual oleh perusahaan Cina. Sebagian besar perusahaan terkenal meminta izin dari perancang puzzle untuk menghasilkan desain mereka dan bekerja bersama menuju suatu produk di pasar. Dalam hal ini, perancang puzzle tentu saja sangat senang dan bangga bahwa salah satu teka-teki mereka menghantam pasar.
Namun ada juga perusahaan China yang membuat puzzle knock-off. Tiruan-tiruan ini adalah desain yang digunakan tanpa izin dari pencipta asli, atau merupakan salinan dengan kualitas lebih rendah dan lebih murah dari teka-teki yang sudah ada.
Tantangan:
Kita akan menentukan orisinalitas angka yang 'dirilis' dalam urutan tertentu (dari kiri ke kanan † ).
Diberikan daftar bilangan bulat, kelompokkan dan hasilkan menurut orisinalitasnya.
Bagaimana keaslian angka ditentukan?
- Apakah angka merupakan duplikat tepat dari angka sebelumnya? Grup (paling tidak orisinal), di mana grup tertinggal, setelah semua grup lainnya.
- Apakah angka merupakan duplikat dari angka sebelumnya, tetapi sebaliknya negatif (yaitu angka asli adalah , tetapi sekarang ; atau sebaliknya)? Kelompok .
- Bisakah nilai absolut dari angka tersebut dibentuk dengan menggabungkan satu atau lebih angka absolut sebelumnya, dan bukankah itu bagian dari kelompok yang disebutkan sebelumnya atau ? Grup , di mana adalah jumlah angka berbeda yang digunakan dalam rangkaian (dan ).
- Apakah jumlahnya tidak cocok dengan salah satu grup di atas, sehingga sejauh ini benar-benar unik? Grup (paling orisinal), yang memimpin sebelum semua grup lain.
Ini mungkin terdengar agak kabur, jadi di sini contoh langkah demi langkah :
Input-daftar: [34,9,4,-34,19,-199,34,-213,94,1934499,213,3,21,-2134,44449,44]
34
adalah angka pertama, yang selalu asli dan di grup . Output sejauh ini:[[34]]
9
juga asli:[[34,9]]
4
juga asli:[[34,9,4]]
-34
adalah negatif dari angka sebelumnya34
, jadi itu dalam grup :[[34,9,4],[-34]]
19
asli:[[34,9,4,19],[-34]]
-199
dapat dibentuk oleh dua angka sebelumnya19
dan9
, jadi itu dalam grup :[[34,9,4,19],[-199],[-34]]
34
adalah salinan persis dari nomor sebelumnya, jadi itu dalam grup :[[34,9,4,19],[-199],[-34],[34]]
-213
asli:[[34,9,4,19,-213],[-199],[-34],[34]]
94
dapat dibentuk oleh dua angka sebelumnya9
dan4
, jadi itu dalam grup :[[34,9,4,19,-213],[-199,94],[-34],[34]]
1934499
dapat dibentuk oleh empat angka sebelumnya19
,34
,4
, dan dua kali9
, sehingga dalam kelompok :[[34,9,4,19,-213],[19499],[-199,94],[-34],[34]]
213
adalah negatif dari angka sebelumnya-213
, jadi itu dalam grup :[[34,9,4,19,-213],[1934499],[-199,94],[-34,213],[34]]
3
asli:[[34,9,4,19,-213,3],[1934499],[-199,94],[-34,213],[34]]
21
asli:[[34,9,4,19,-213,3,21],[1934499],[-199,94],[-34,213],[34]]
-2134
dapat dibentuk oleh dua angka sebelumnya213
dan4
(atau tiga nomor sebelumnya21
,3
dan4
, tetapi kita selalu menggunakan paling sedikit concatenating nomor untuk menentukan orisinalitas), sehingga dalam kelompok :[[34,9,4,19,-213,3,21],[1934499],[-199,94,-2134],[-34,213],[34]]
44449
dapat dibentuk oleh dua angka sebelumnya empat kali4
dan9
, jadi itu dalam grup :[[34,9,4,19,-213,3,21],[1934499],[-199,94,-2134,44449],[-34,213],[34]]
44
dapat dibentuk oleh satu angka sebelumnya4
, diulang dua kali, jadi dalam grup :[[34,9,4,19,-213,3,21],[1934499],[-199,94,-2134,44449],[44],[-34,213],[34]]
Jadi untuk input [34,9,4,-34,19,-199,34,-213,94,1934499,213,3,21,-2134,44449,44]
outputnya [[34,9,4,19,-213,3,21],[1934499],[-199,94,-2134,44449],[44],[-34,213],[34]]
.
Aturan tantangan:
- I / O fleksibel. Anda dapat memasukkan sebagai daftar / larik / aliran bilangan bulat atau string, masukan satu per satu melalui STDIN, dll. Keluaran dapat berupa peta dengan grup sebagai kunci, daftar bersarang sebagai contoh dan uji kasus dalam tantangan ini, dicetak baris baru dipisahkan, dll.
- Anda diizinkan untuk mengambil daftar input dalam urutan terbalik (mungkin berguna untuk bahasa berbasis stack). † Dalam hal ini dari kiri ke kanan tentu saja dari kanan ke kiri.
- Seperti yang anda lihat di contoh untuk integer
-2134
, kami selalu kelompok angka yang merupakan gabungan dari nomor lain dengan sesedikit mungkin (yang dibentuk oleh213
dan4
- dua nomor, dan bukan dengan21
,3
, dan4
- tiga angka). - Seperti yang Anda lihat pada contoh untuk bilangan bulat
1934499
, Anda dapat menggunakan angka sebelumnya (9
dalam kasus ini) beberapa kali (mirip dengan44449
menggunakan empat4
dan9
dalam contoh). Namun mereka hanya dihitung satu kali untuk menentukan grup. - Anda tidak diizinkan memiliki daftar dalam kosong di output untuk grup kosong. Jadi, test case
[1,58,85,-8,5,8585,5885,518]
mungkin tidak menghasilkan[[1,58,85,8,5],[518],[5885],[8585],[],[]]
sebaliknya, di mana grup kosong adalah dan , dan contoh di atas mungkin tidak menghasilkan sebaliknya, di mana grup kosong adalah .X - 3[[34,9,4,19,-213,3,21],[1934499],[],[-199,94,-2134,44449],[44],[-34,213],[34]]
- Urutan grup ketat (kecuali Anda menggunakan peta, karena grup kemudian dapat dikurangkan dari tombol), tetapi urutan angka dalam grup dapat dalam urutan apa pun. Jadi
[34,9,4,19,-213,3,21]
untuk grup pada contoh di atas juga bisa atau .[21,3,-213,19,4,9,34]
[-213,4,34,19,9,21,3]
- Anda dijamin bahwa tidak akan pernah ada angka yang dapat dibentuk oleh lebih dari sembilan angka sebelumnya. Jadi, Anda tidak akan pernah memiliki grup , dan jumlah grup terbesar yang mungkin adalah 12:
- Anda dapat mengasumsikan bilangan bulat akan maksimal 32 bit, jadi dalam jangkauan
[−2147483648,2147483647]
.
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 pun'. - 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.
Kasus uji:
Input: [34,9,4,-34,19,-199,34,-213,94,1934499,213,3,21,-2134,44449,44]
Output: [[34,9,4,19,-213,3,21],[1934499],[-199,94,-2134,44449],[44],[-34,213],[34]]
Input: [17,21,3,-317,317,2,3,117,14,-4,-232,-43,317]
Output: [[17,21,3,2,117,14,-4],[-317,-232,-43],[317],[3,317]]
Input: [2,4,8,10,12,-12,-102,488,10824]
Output: [[2,4,8,10,12],[10824],[-102,488],[-12]]
Input: [0,100,-100,10000,-100,1001000]
Output: [[0,100],[10000,1001000],[-100],[-100]]
Input: [1,58,85,-8,5,8585,5885,518]
Output: [[1,58,85,-8,5],[518],[5885],[8585]]
Input: [4,-4,44,5,54]
Output: [[4,5],[54],[44],[-4]]
sumber
X + 1
apakah grup khusus untuk salinan yang tepat, danX
apakah grup untuk nomor lain yang dapat dibentuk dari salinan nomor tunggal, seperti negasinya?[1, 1111111111]
Jawaban:
Jelly ,
3633 byteCobalah online!
Saya yakin ini bisa bermain golf lebih banyak. Beberapa inspirasi diambil dari jawaban 05AB1E Grimy , jadi pastikan untuk mengungguli yang juga!
sumber
Python 3 ,
565564524523500437399394393389385372 byteImplementasi brute-force menggunakan
itertools
; tidak semua uji berjalan dalam batas 60 detik pada TIO.Cobalah online!
Terima kasih kepada ArBo untuk golf 101 byte, ke Galen Ivanov untuk golf 19 byte, ke ElPedro untuk golf 5 byte, untuk movatica untuk golf 17 byte, ke Black Owl Kai untuk golf 2 byte, untuk squid untuk golf 2 byte dan untuk Kevin Cruijssen untuk bermain golf 1 byte.
Penjelasan:
Python 2 ,
406379374373372368355 bytePendekatan yang sama, tetapi lebih pendek karena beberapa trik golf, Python 3 tidak mendukung lagi. Terima kasih kepada ArBo untuk backport dan untuk golf 28 byte, untuk ElPedro untuk golf 5 byte, untuk movatica untuk golf 17 byte, dan untuk squid untuk golf 1 byte lebih.
Cobalah online!
sumber
str(abs(x))
(atau abs (x) dengan backticks di Python 2) ke pemanggilan fungsi dan mengubah x dalam definisi fungsi menjadi y menghapus y = str (abs (x)). Maaf, saat ini TIO tidak bisa berfungsi.len
mencukur byte lain, bukan?any()
panggilan di dalam , sehingga membuatnya menjadi generator normal, yang berfungsi dengan baik dan menghemat 4 byte lagi :)(x in sum(l,[]))
alih-alihany(x in s for s in l)
untuk keduanyax
dan-x
menyimpan 13 byte lebih banyak!Python 2 ,
235234232246245244241240238237236 byteCobalah online!
-1 byte berkat komentar Squid pada jawaban Python lainnya
Jawaban ini tidak memiliki harapan untuk menyelesaikan apa pun kecuali yang paling sepele dari kasus uji. Dalam link TIO,
s*11
telah digantikan olehs*2
, mengorbankan kebenaran dalam beberapa kasus untuk cepat er waktu eksekusi, tetapi sejauh yang saya bisa melihat, versi dalam posting ini selalu menghasilkan jawaban yang benar, dalam teori.Penjelasan
sumber
int
bahkan dalam versi 64-bit).05AB1E ,
4341383527 byteCobalah online!
Penjelasan:
Karena nomor grup bukan bagian dari output, kami bebas menggunakan nomor apa pun yang kami inginkan, selama urutannya benar. Ini menggunakan 0 untuk angka asli, 2 ^ -N untuk grup XN, 1 untuk grup X, 2 untuk grup X + 1.
sumber
Python 2, 195 byte
Kasing uji paling lambat tidak bisa selesai di TIO , tetapi hanya butuh sekitar 10 detik di mesin saya.
Ini dapat disingkat 2 byte pada LP64 Python builds dengan mengganti
'%s-%%s'%a%n
dengan`a`+'-'+`n`
.sumber
JavaScript (Node.js) ,
211205 byteCobalah online!
Menggunakan asumsi bahwa paling banyak ada 12 kelompok.
JavaScript (Node.js) ,
267226221218211 byteCobalah online!
... atau 193 byte jika mengembalikan kamus tidak masalah:
Cobalah online!
Dalam hal ini, kunci
-Infinity
berarti Grup 1 dan kunci lainnya berarti GrupX+key
.sumber