Inilah teka-teki pemrograman untuk Anda:
Diberikan daftar pasangan string dan angka yang sesuai, misalnya [[A,37],[B,27],[C,21],[D,11],[E,10],[F,9],[G,3],[H,2]]
,, menampilkan daftar lain yang hanya memiliki string dengan cara berikut:
Jumlah total dari string apa pun harus sama persis dengan angka terkait dalam data input.
Tidak ada string yang harus diulang berdekatan dalam urutan, dan setiap string harus muncul dalam daftar output.
Pemilihan string selanjutnya harus dilakukan secara acak selama mereka tidak melanggar dua aturan di atas. Setiap solusi harus memiliki probabilitas yang tidak nol untuk dipilih.
Jika tidak ada kombinasi yang memungkinkan, hasilnya harus adil
0
.
Daftar input dapat diberikan dalam urutan apa pun (diurutkan atau tidak disortir), dan string dalam daftar mungkin panjang.
Output sampel untuk input sampel di atas 1
[A,B,A,B,A,B,A,B,A,B,A,B,A,B,A,B,A,B,A,B,A,B,A,B,A,B,A,B,A,B,A,B,A,B,A,B,A,B,A,B,A,B,A,B,A,B,A,B,A,B,A,B,A,B,A,C,A,C,A,C,A,C,A,C,A,C,A,C,A,C,A,C,A,C,D,C,D,C,D,C,D,C,D,C,D,C,D,C,D,C,D,C,D,C,D,C,E,F,E,F,E,F,E,F,E,F,E,F,E,F,E,F,E,F,E,G,H,G,H,G]
Masukkan sampel 2:
[[A,6],[B,1],[C,1]]
Output untuk input kedua:
0
karena tidak ada daftar yang mungkin berdasarkan aturan.
Masukan sampel 3:
[[AC,3],[BD,2]]
output yang valid: [AC,BD,AC,BD,AC]
keluaran tidak valid: [AC,BD,AC,AC,BD]
Jika klarifikasi lebih lanjut diperlukan, tolong, jangan ragu untuk memberi tahu saya di komentar dan saya akan segera bertindak sesuai.
Ini adalah kode-golf , jadi kode terpendek dalam byte untuk setiap bahasa akan menang!
Jawaban:
Jelly , 11 byte
Cobalah online!
sumber
Œṙ
tidak vectorize itu akan bekerja tanpa'
Jeli , 17 byte
Cobalah online!
sumber
["A", 100], ["B", 3]
tidak menghasilkan apa-apa itu macet saya pikir.Œ!
akan memiliki 99029007164861804075467152545817733490901658221144924830052805546998766658416222832141441073883538492653516385977292093222882134415149891584000000000000O(n!)
singkat tapi kecepatannya tidak masalah. Jangan mencobanya dengan apa pun di mana jumlahnya bertambah hingga sekitar 6-8 atau lebih: PŒṙ
membantu["AT", 3], ["B", 3]
dan dapatkanTBATATBAB
sebagai output yang salahPython 2 ,
114189185174 bytesCobalah online!
Aduh! Jauh lebih sulit dengan aturan 3 ... :). Masih berusaha menghindari
O(n!)
pendekatan, sehingga dapat menangani semua kasus uji sebelum kematian panas alam semesta ...Algoritma: anggap jumlah total jumlah string adalah
t
. Jika string memiliki jumlahn
dengan2*n>t+1
, maka tidak mungkin untuk memenuhi kendala. Oleh karena itu, jika string (tidak termasuk orang yang dipilih sebelumnya) memiliki countn
dengan2*n=t+1
, maka kita harus memilih string yang berikutnya. Jika tidak, kita dapat memilih secara acak string apa pun yang bukan string yang dipilih sebelumnya.sumber
R ,
148141 byteCobalah online! (Saya sudah menyalin
combinat::permn
dan memanggilnya dicombinatXXpermn
sana.)Solusi Brute force O (n!).
Penggunaan
permn
daricombinat
paket untuk menghasilkan semua kemungkinan pemesanan. Kemudian periksa untuk melihat apakah ada yang mengikuti aturan, dan mengambil salah satu dari mereka secara acak.sumber
n<-sum(n|1)
byte lebih pendek saya percaya. Tetapi kekhasansample
dengan input panjang-satu cukup frustasi di sini.JavaScript, 112 byte
Pass pertama di ini, lebih banyak golf untuk (mudah-mudahan) mengikuti.
Cobalah online
sumber
J,
6053 byte-7 Terima kasih kepada FrownyFrog
asli
ungolfed
Saran untuk penyambutan selamat datang.
Cobalah online!
sumber
[:*/2~:/\|:
dua lebih pendekJavaScript (ES6), 160 byte
Cobalah online!
sumber
Arang , 38 byte
Cobalah online! Tautan adalah untuk mengucapkan versi kode. Penjelasan:
Ulangi sementara setidaknya ada satu hitungan bukan nol.
Temukan hitungan yang membentuk lebih dari setengah sisanya.
Jika tidak ada, maka ambil saja hitungan non-nol yang difilter sebelumnya.
Memfilter string yang keluar terakhir kali.
Tetapkan elemen acak dari non-kosong pertama dari dua daftar di atas ke string keluaran terakhir. Perhatikan bahwa jika kombinasi mustahil dimasukkan, program akan macet pada saat ini.
Cetak string.
Kurangi jumlahnya.
sumber
["h4x0r", 1337]
dimasukkan sebagai string.Ruby , 85 byte
Pendekatan brute force (terima kasih kepada Jonah atas idenya).
Cobalah online!
Ruby ,
108 10096 byteSebelumnya, pendekatan Bogosort
Cobalah online!
sumber
Karat 633 byte
Apa yang membuat ini sedikit berbeda dari yang lain adalah bahwa itu dimulai dengan ide untuk mengatur ulang string dengan mensimulasikan sistem fisik. Setiap string pertama kali diduplikasi sesuai jumlah kali. Kemudian setiap string individu diperlakukan sebagai Partikel dalam ruang. Dua partikel dengan nilai string yang sama "saling tolak", sementara dua partikel dengan nilai yang berbeda saling menarik. Sebagai contoh jika kita mulai dengan AAAAAAABBBBCC, As akan saling mencabut, menjauh satu sama lain, memungkinkan B untuk bergerak di antara mereka. Seiring waktu, ini mencapai campuran partikel yang bagus. Setelah setiap iterasi dari 'gerakan partikel', program memeriksa bahwa tidak ada partikel yang sama berbatasan, kemudian berhenti dan mencetak keadaan sistem, yang hanya daftar string dalam urutan, karena mereka muncul dalam ruang 1 dimensi.
Sekarang, ketika benar-benar menerapkan sistem fisik itu, ia mulai menggunakan teknik demo / game PC kuno, untuk menyimpan setiap posisi dan kecepatan partikel sebagai angka, kemudian melalui iterasi untuk memperbarui posisi dan kecepatan. Pada setiap iterasi, kami menambahkan kecepatan ke posisi (gerakan), dan menambahkan akselerasi ke kecepatan (perubahan laju gerakan), dan menghitung akselerasi (menemukan gaya pada partikel). Untuk menyederhanakan, sistem tidak menghitung kekuatan pada setiap partikel berdasarkan pada semua partikel lain - hanya memeriksa partikel yang berdekatan. Ada juga efek 'redaman' sehingga partikel tidak akan berakselerasi terlalu banyak dan terbang hingga tak terbatas (kecepatan berkurang oleh x persentase setiap langkah, misalnya).
Namun, melalui proses bermain golf, semua ini ditebang dan disederhanakan secara drastis. Sekarang, alih-alih dua partikel yang sama saling tolak, mereka hanya 'berteleportasi'. Partikel yang berbeda hanya 'bergeser' sedikit untuk mencegah stagnasi dalam sistem. Sebagai contoh jika A di sebelah A ia akan teleport. Jika A di sebelah B hanya sedikit bergeser. Kemudian memeriksa apakah kondisi terpenuhi (tidak seperti partikel yang berdekatan) dan mencetak string secara berurutan, berdasarkan posisi mereka dalam ruang 1-d. Ini hampir lebih seperti algoritma penyortiran daripada simulasi - sekali lagi, orang bisa melihat algoritma penyortiran sebagai bentuk simulasi 'drifting' berdasarkan 'massa'. Saya ngelantur.
Bagaimanapun, ini adalah salah satu program Rust pertama saya jadi saya menyerah setelah beberapa jam bermain golf, meskipun mungkin masih ada peluang di sana. Agak sulit bagi saya. Bunyinya string input dari input standar. Jika diinginkan, itu bisa diganti dengan "let mut s =" [[A, 3], [B, 2]] ". Tetapi sekarang saya melakukan 'echo [[A, 3], [B, 2]] | kargo berjalan 'di baris perintah.
Perhitungan berhenti sedikit masalah. Bagaimana cara mendeteksi jika keadaan sistem yang valid tidak akan pernah tercapai? Rencana pertama adalah untuk mendeteksi apakah keadaan 'saat ini' pernah mengulangi keadaan lama, misalnya jika ACCC berubah menjadi CACC tetapi kemudian kembali ke ACCC, kita tahu program tidak akan pernah berakhir, karena itu hanya pseudo-acak. Maka harus menyerah dan mencetak 0 jika itu terjadi. Namun ini tampaknya seperti sejumlah besar kode Rust, jadi alih-alih saya hanya memutuskan bahwa jika melewati banyak iterasi, mungkin macet dan tidak akan pernah mencapai kondisi mapan, sehingga mencetak 0 dan berhenti. Berapa banyak? Jumlah partikel kuadrat.
Kode:
sumber
regex
peti.JavaScript (Node.js) , 249 byte
Cobalah online!
sumber
Java (JDK 10) , 191 byte
Cobalah online!
Ini tidak pernah kembali jika tidak ada solusi.
sumber