Suatu hari, tim kami pergi ke ruang pelarian. Salah satu teka-teki melibatkan papan enam sakelar mekanis di mana Anda harus menemukan kombinasi yang benar dan mematikan untuk membuka kunci kotak, agak seperti ini:
-v-v-v-
-v-v-v-
Menjadi pengembang, kami memutuskan akan lebih efisien untuk mencoba setiap kombinasi 2 ^ 6 = 64 daripada benar-benar memecahkan teka-teki. Jadi kami menugaskan orang miskin untuk melakukan penghitungan biner:
-v-v-v-
-v-v-v-
-v-v-v-
-v-v-^-
-v-v-v-
-v-^-v-
-v-v-v-
-v-^-^-
dan seterusnya.
Tantangannya
Menulis sebuah program yang, mengingat semua sakelar dalam posisi tidak aktif sebagai string yang diformat seperti di atas, menghasilkan semua kombinasi on dan off dalam urutan apa pun.
Anda dapat menulis program lengkap atau fungsi. Dengan demikian, program Anda dapat menerima input melalui stdin, file, atau sebagai argumen string tunggal, dan mengembalikan atau mencetak hasilnya. Jika dikembalikan, hasilnya mungkin ada dalam daftar / array / etc. daripada string tunggal. Jika outputnya berupa string tunggal, papan harus dipisahkan oleh baris baru (trailing baris baru diizinkan.)
String input akan cocok dengan regex r'((-v)+-)(\n(-v)+-)*'
dan mewakili satu papan dengan semua dimatikan. Ini berarti tidak ada wadah nol, dan sakelar dibariskan ke kiri. Setiap baris mungkin tidak memiliki jumlah sakelar yang sama.
Setiap papan keluaran harus memiliki format yang sama persis dengan input, kecuali bahwa v dapat diganti oleh ^ seperti yang diperlukan. Papan keluaran dapat dipisahkan oleh sejumlah baris baru.
Karena runtime secara alami O (2 ^ n) dalam jumlah switch, kode Anda tidak akan diuji pada lebih dari 10 switch dalam pengaturan apa pun.
Ini adalah kode-golf, jadi kode terpendek dalam jumlah byte menang.
Input dan output sampel
Memasukkan:
-v-
Output yang mungkin:
-v-
-^-
Memasukkan:
-v-
-v-
Output yang mungkin:
-^-
-^-
-^-
-v-
-v-
-^-
-v-
-v-
Karena sangat membosankan untuk memeriksa jawaban Anda untuk jumlah switch yang lebih besar, inilah skrip Python sebagai alat pemeriksaan kewarasan. (Saya telah memasukkan cuplikan yang saat ini dikomentari untuk menghasilkan output yang diharapkan dari file input yang diberikan jika Anda ingin lebih banyak kasus uji.) Sayangnya, ini agak kurang fleksibel dalam hal input dan output daripada spesifikasi, sayangnya; letakkan string input dalam file bernama 'input' dan output yang dipisahkan baris baru (maaf, tidak ada pemformatan daftar) dalam file bernama 'output' di direktori yang sama dan jalankan python3 sanitycheck.py
.
sumber
Jawaban:
Haskell ,
25242317 byteCobalah online!
-1 byte terima kasih kepada @ H.PWiz
-1 byte terima kasih kepada @nimi
Mengembalikan daftar string. TIO memiliki 2 byte tambahan untuk deklarasi fungsi - Saya telah melihat orang lain meninggalkannya ketika mereka menulis fungsi pointfree jadi saya melakukan hal yang sama kecuali diperintahkan sebaliknya.
Jawaban Sebelumnya (25 byte)
Penjelasannya adalah semua untuk jawaban sebelumnya, yang bekerja dengan cara yang hampir sama, kecuali saya sebutkan definisi
g
. Carag
kerjanya saat ini adalah dengan menggunakan perbandingan leksikal untuk menggantikan^v
untukv
dan menjaga segala sesuatu yang lain yang sama.Menariknya, ini berfungsi untuk switchboards yang berubah-ubah:
Penjelasan (Pendek)
Penjelasan (Panjang)
mapM
adalah fungsi yang cukup menakutkan bagi mereka yang tidak terbiasa dengan Haskell. Tetapi tidak sulit untuk memahami dalam konteks ini. Dengan membuatnya aktif padaString
s (yang dalam Haskell adalah daftar karakter), saya telah mengkhususkannya pada definisi untuk daftar. Jadi dalam konteks ini, tipenya adalahIni sebenarnya bahkan lebih khusus dalam penggunaan saya -
a
danb
keduanyaChar
- sehingga kita dapat melihat tipe tanda tangan sebagaiMari kita cepat melihat apa yang
g
dilakukan sebelum menjelaskan caramapM
kerjanya.g
menggunakan pencocokan pola untuk mengonversiChar 'v'
menjadi string"v^"
; semua yang lain dikonversi menjadi string tunggal (ingat, string hanya daftarChar
s, sehingga kita dapat dimasukkan kex
dalam daftar tunggal). Menguji REPL, kami menemukan ini masalahnyaCatatan yang
g
memiliki tipe yang tepat untuk menjadi argumenmapM
(tidak mengejutkan!).Kami akan mengeksplorasi cara
mapM
kerjanya dengan memberikannyag
dan argumennyasebagai input.
mapM
peta pertama dig
atasString
, dan karenag
mengkonversiChar
keStrings
, ini memberi kita daftarStrings
Meskipun ini adalah tipe output yang benar,
mapM
sedikit lebih banyak. Anda dapat menganggapnya sebagai membentuk semuaString
yang dapat Anda buat dari daftar ini jika Anda harus memilih satu karakter dari masing-masingString
di dalamnya (dalam urutan).Jadi untuk elemen pertama, Anda tidak punya pilihan selain memilih
Char '-'
. Untuk elemen kedua, Anda dapat memilih antara'v'
dan'^'
, seterusnya, dan sebagainya.Ini kira-kira setara dengan kode python ini:
Kecuali bahwa karena Haskell memisahkan antara
Char
s danString
s, ketika itu menempatkanChar
s ke dalam daftar, itu tidak perlujoin
mereka.Jadi hasil akhirnya adalah
seperti yang diinginkan.
sumber
mapM
bekerja untuk tantangan ini, pada awalnya saya telah merumuskannyasequence . map g
tetapi itu dapat diekspresikan secara ringkas ketikamapM id . map g
saya melihat saya bisamapM g
=='v'
untuk>'-'
Perl 6 , 32 byte
Cobalah online!
.comb
membagi string menjadi karakter.».&{...}
memetakan karakter sesuai dengan fungsi antara kawat gigi.$_, ('^' if /v/)
menghasilkan daftar alternatif untuk setiap karakter. Hanyav
memiliki alternatif:^
.[X~]
mengurangi daftar itu dengan operator lintas produk rangkaian-stringX~
.sumber
Jelly , 7 byte
Cobalah online!
Output adalah daftar string Jelly.
Penjelasan:
sumber
Perl 5 , 29 byte
Cobalah online!
Kiriman pertama saya!
Biasanya, pegolf Perl 5 mengirimkan program alih-alih fungsi untuk menyelamatkan dari keharusan memasukkan
sub{}
minimal. Tapi mereka harus menambahkansay
,say␠
,say for
atausay for␠
dalam pertukaran.Dengan melakukan pendekatan sub, saya bisa mempersingkat
untuk
Penjelasannya cukup sederhana. Perl 5 memiliki
glob
operator builtin yang menerima pola glob seperti shell yang dapat digunakan untuk menghasilkan daftar nama file (misalnyafoo*.txt
) atau daftar string (misalnya{a,b,c}
). Tangkapannya adalah bahwa baris baru perlu diloloskan, yang telah saya lakukan menggunakanquotemeta
(as\Q
)sumber
K (ngn / k) ,
2725 byteCobalah online!
"^"/"v"\
ganti"v"
dengan"^"
x,'
zip dengan karakter asli(,/,/:\:)/
produk cartesian berakhir?
uniqsumber
APL (Dyalog Classic) ,
21 1715 byteCobalah online!
mirip dengan solusi k saya
mengembalikan array string n-dimensi (n = jumlah sakelar)
dalam bentuk yang lebih mudah dijelaskan:
⊃(∘.,⌿ ⊢ ∪¨ 'v'⎕r'^')
'v'⎕r'^'
gantiv
s dengan^
s⊢ ∪¨
... serikat pekerja dengan masing-masing karakter asli. itu adalah vektor string panjang 1 atau 2∘.,⌿
pengurangan produk kartesius⊃
membukauntuk sampai ke versi yang sepenuhnya golf kita ikuti pola
f⌿ A g¨ B
->A f.g B
:∘.,⌿ ⊢ ∪¨ 'v'⎕r'^'
->⊢ ∘.,.∪ 'v'⎕r'^'
sebagai efek samping tanda kurung tidak lagi diperlukan
sumber
J , 42 byte
Cobalah online!
penjelasan
Biarkan
sebagai contoh input kami.
('v^' {~ 2 #:@i.@^ 1 #. e.&'v')
membuat semua kombo yang mungkin dari sakelar, mengabaikan format input. untuk contoh kita menghasilkan:1 #. e.&'v'
menghitung jumlahv
s pada input.2 #:@i.@^
menimbulkan 2 untuk kekuatan itu, menghasilkan bilangan bulat dari 0 sampai yang nomori.
, dan mengkonversi mereka ke biner#:
'v^' {~
perubahan ke angka biner kev
dan^
]`('v' I.@e.~ [)`[}"1
mengubah input asli, menghasilkan satu salinan untuk setiap baris hasil yang dijelaskan pada langkah sebelumnya (yaitu, semua kemungkinanv
/^
kombo). Dalam setiap salinanv
input asli diganti dengan satu kemungkinan urutanv
/^
.sumber
Java,
202197189191 byteYa, itu adalah bahasa yang relatif verbose, tapi itulah yang saya anggap sebagai golf klasik:
Saya berpikir bahwa cara "sederhana" untuk berurusan dengan jeda baris yang diperlukan untuk mencapai tata letak yang benar adalah dengan benar-benar menggunakan kembali array karakter input asli, dan hanya mengisinya dengan
'v'
s dan'^'
s pada posisi yang sesuai.Pembaruan:
Ternyata tidak menyimpan posisi memungkinkan membuang
int
dan dan deklarasi variabel array (dengan biaya memeriksa setiap posisi array apakah itu berisiv
atau^
dengan cepat), menghemat 5 byte.8 byte lainnya disimpan dengan menghitung batas atas
(1<<numberOfSwitches)
lebih kompak.Menurut aturan yang disebutkan dalam komentar, deklarasi fungsi harus dihitung, jadi sekarang ini lambda ...
sumber
String generate(String s) {...}
) dalam jumlah byte Anda. Berikut adalah versi fixed / lambda untuk 191 byte . Saya melakukan beberapa golf kecil untuk mencukur 3 byte{ function body }
harus relevan, karena tidak masalah apakah Anda memasukkannya ke dalam fungsi yangstatic
atau tidak, dan tentu saja, jika deklarasi menghitung skor, seseorang dapat mengubahnya menjadi ekspresi lambda. Tapi itulah yang dilakukan sekarang, terima kasih telah menunjukkan ini.d=94
). 2. Inisialisasii
saat Anda mendeklarasikannya. 3. Gunakani++<m
alih-alih selisih yang terpisah (perlu memodifikasi konten loop di satu tempat, tetapi ini tidak menambah biaya). 4. Bisakah Anda lolos(i&1<<j++)>0
? 5. Saya tidak berpikir Anda perlu{}
untukfor
loop dalam . 6. Anda dapat menggantinyaa[k]==d||a[k]==u
dengana[k]>45
, saya pikir. 7. Pergi denganj=k=0
. Semua itu harus menghapus 19bytes.{}
yang perlu, tapi saya bisa melihat lagi. Namun, inia[k]>45
mungkin trik yang rapi. Memang, saya hanya menulis ini untuk membuang waktu menunggu pertemuan dimulai (karena itu nama kelas - ini disengaja ;-)) tapi mungkin saya akan melihat lagi - terima kasih dalam hal apapun!J ,
41 4024 byteCobalah online!
sumber
{
. walaupun saya pikir[:>@,@{<@(,'^'$~'v'=])"0
akan sedikit lebih adil karena "Setiap papan keluaran harus memiliki format yang sama persis dengan input" dan input tidak kotak.Python 2 , 87 byte
Cobalah online!
Pendekatan non-regex.
sumber
C (gcc) ,
75 7470 byte-5 byte terima kasih kepada @ceilingcat
Cobalah online!
membutuhkan
s
poin memori agar dapat ditulissumber
Python 3.8 (pra-rilis) ,
129 117 116 110106 byte-10 byte terima kasih kepada @Chas Brown
Cobalah online!
sumber
C (gcc) , 102 byte
Cobalah online!
sumber
K4 , 44 byte
Larutan:
Contoh:
Penjelasan:
Penggantian di tempat
"^"
. Tentukan jumlah kombinasi sakelar (mis. 2 ^ n), hitung dalam biner, ganti sakelar ...sumber
R , 116 byte
Cobalah online!
Berfungsi mengembalikan vektor papan yang dipisahkan baris baru
sumber
"[<-"
!JavaScript, 88 byte
Cobalah online!
sumber
n>>=1
->n/=2
Retina 0.8.2 , 29 byte
Cobalah online! Penjelasan:
Ubah baris baru menjadi
;
s danv
s menjadi#
penanda.Ganti
#
satu per satu dari kiri ke kanan.Ubah setiap baris menjadi dua baris, satu dengan yang
#
diganti dengan av
, satu dengan yang diganti dengan a^
.Ubah
;
kembali menjadi baris baru dan pisahkan hasilnya.sumber
Perl 5
-0
, 51 byteCobalah online!
sumber
-n
akan menghindari kebutuhan untuk$_=<>;
JavaScript (Node.js) ,
80 7368 byteCobalah online!
sumber
Python 3 - build, 203 byte
Cobalah online!
Coba pertama, tidak terlalu kecil tapi berhasil. Tidak ada penggantian string yang elegan di Python ...
Loop Pertama membangun pemetaan garis untuk indeks bit, yaitu untuk setiap baris, indeks bit pertama dalam penghitung bit disimpan. Ini digunakan untuk mengindeks penghitung bit di loop berikutnya.
Loop kedua menjalankan penghitung biner, mengekstrak bit untuk setiap baris dan iterasi dan bergabung dengan mereka. Setelah menggabungkan semuanya, itu diterjemahkan kembali ke format switch peta, menggunakan penggantian string.
Saya kira, ada cara yang lebih elegan dengan menggunakan kembali string input daripada membangunnya lagi dan lagi.
Sunting: terinspirasi oleh jawaban Python 3.8 , berikut adalah versi penggantian yang lebih singkat
Python 3 - ganti, 123 byte
Cobalah online!
sumber
Ruby , 64 byte
Mengembalikan array. Mendapat angka dari1 untuk 2v (dimana v adalah jumlah "v" pada input) dan membalik saklar berdasarkan pada v bit paling signifikan. Ini memungkinkan kita untuk menyimpan byte lebih dari iterasi0 untuk 2v- 1 , karena v bit paling tidak signifikan dalam 2v semuanya nol.
Di Ruby,
i[j]
mengembalikanj
biti
mulai dari bit paling signifikan, alias itu setara dengan(i>>j)&1
.Cobalah online!
sumber
Arang , 28 byte
Cobalah online! Tautan adalah untuk mengucapkan versi kode. Penjelasan:
sumber
PHP , 93 byte
Cobalah online!
Program mandiri, input melalui baris perintah.
Ulangi jumlah kemungkinan permutasi dari string input berdasarkan pada jumlah
v
's. Saat menghitung dalam biner, ganti setiap biner1
dengan a^
dan setiap biner0
denganv
dalam string input.sumber