Pada membingungkan SE ada apa yang disebut "masalah batang korek api" di mana matematika ditulis dalam batang korek api dan Anda diizinkan untuk memindahkan sejumlah tertentu dari mereka untuk mendapatkan properti tertentu.
Dalam pertanyaan ini, kami hanya akan mempertimbangkan bilangan bulat yang direpresentasikan dalam format tampilan 7-segmen. Berikut ini semua 10 digit dalam format itu:
__ __ __ __ __ __ __ __
| | | __| __| |__| |__ |__ | |__| |__|
|__| | |__ __| | __| |__| | |__| __|
Setiap segmen layar adalah satu "korek api" yang dapat dipindahkan secara independen dari sisa nomor tersebut. Batang korek api tidak dapat dibagi dan dihancurkan, yang tidak dapat dipatahkan atau dihilangkan dengan cara apa pun.
Teka-teki yang umum adalah mengambil nomor yang diberikan pada basis 10 dan mencoba membuat jumlah sebanyak mungkin dalam jumlah gerakan tertentu. Suatu gerakan dianggap sebagai satu gerakan batang korek api dari slot yang ditempati ke slot yang tidak diduduki lainnya. Anda benar-benar diizinkan untuk membuat angka baru di kedua sisi nomor, misalnya 0 dapat dibuat menjadi 77 memberi 3 gerakan
__ __ __ __ __ __ __
| | | | | | | | |
|__| , __| , | , | |
Namun Anda tidak boleh membuat satu slot menjadi 2 atau membuat slot baru di antara yang sudah ada, misalnya mengubah 4 menjadi 11 di tengah angka atau memasukkan angka baru di antara yang ada. Setiap gerakan tidak perlu membuat angka yang tepat, tetapi hasil akhir harus menjadi angka yang tepat di layar basis tujuh tujuh. Anda tidak perlu menggunakan setiap gerakan jika tidak ingin. Tidak seperti membingungkan, ini adalah [tag: pertanyaan berakhir] Anda tidak boleh menggunakan operator apa pun (perkalian, eksponensial, dll.) Atau konstanta matematika (Pi, nomor Graham, dll.) Dalam jawaban Anda.
Tugas
Tulis program atau fungsi yang mengambil angka dan sejumlah gerakan sebagai input dan mengembalikan angka terbesar yang dapat dibuat dengan banyak gerakan pada angka asli.
Ini adalah pertanyaan kode-golf sehingga jawaban akan dinilai dalam byte, dengan lebih sedikit byte lebih baik.
Uji Kasus
n, moves -> max
0, 1 -> 9
0, 3 -> 77
0, 4 -> 111
8, 3 -> 74
220, 1 -> 320
220, 2 -> 520
220, 3 -> 7227
220, 4 -> 22111
220, 5 -> 32111
747, 1 -> 747
747, 2 -> 7171
747, 3 -> 7711
sumber
919, 2 -> 991
Jawaban:
JavaScript (ES6),
297286279267 byteMengambil input dalam sintaks currying
(s)(k)
, di mana s adalah array karakter digit dan k adalah jumlah gerakan (integer).Uji kasus
Tampilkan cuplikan kode
Bagaimana?
Bentuk data dan fungsi pembantu
Array b menggambarkan bentuk digit sebagai bilangan bulat 7-bit, di mana setiap bit adalah segmen:
Misalnya, bentuk "7" adalah 0b0100101 = 37.
Fungsi helper B () mengembalikan angka 1 dalam representasi biner dari angka yang diberikan:
Langkah 1
Kami pertama menghitung jumlah korek api yang digunakan dalam nomor input:
Langkah 2
Kami meneruskan nilai ini ke fungsi rekursif g () , yang mengisi daftar r dengan semua angka yang dapat dibangun dengan tepat jumlah korek api ini:
Misalnya, g (5) akan dimuat
[ '17', '2', '3', '5', '71' ]
ke r .Langkah # 3
Kita sekarang harus memilih angka M tertinggi dalam r yang sebenarnya dapat diperoleh dari nomor input, dalam jumlah gerakan yang diizinkan k .
Karena setiap angka n dalam r menggunakan tepat sama banyak korek api sebagai jumlah input s , jumlah gerakan yang diperlukan untuk mengubah s menjadi n sama dengan setengah jumlah perbedaan segmen antara masing-masing digit mereka.
Jumlah perbedaan segmen antara dua digit x dan y diberikan oleh angka 1 dalam representasi biner dari b [x] XOR b [y] .
Akhirnya, penting untuk dicatat bahwa kita perlu mencoba beberapa kemungkinan penyejajaran digit, karena digit pertama s belum tentu dipetakan ke digit pertama n . Pergeseran di antara digit diberikan oleh variabel j dalam kode.
sumber
Mathematica, 188
197200203170174byteCATATAN: Kode masih agak bermasalah. Saya sedang mengerjakannya.
+30 byte untuk bug
Karakter antara
%
dano
seharusnya0x7F
tetapi SE tidak akan mengizinkannya. Anda bisa mengklik tautan pastebin untuk menyalin kode asli.Kode membutuhkan banyak waktu ketika ada lebih dari 6-7 batang. (Anda dapat mengubah nilai awal dari
i
ke jumlah yang lebih kecil untuk mengujinya)Penjelasan
g
adalah fungsi pembantu mengubah digit menjadi daftar representasi tongkat (menurut sini ), seperti{1, 0, 1, 1, 1, 0, 1, 0, 1, 0, 1, 1, 1, 0, 1, 0, 1, 1, 1, 0, 1, 1, 1}
untuk220
.h
adalah fungsi pembantu untuk menangani padding kiri dan padding kanan antara dua angka.f
beralih dari10^Tr@g@#
(batas atas) untuk1
mencari bilangan bulat yang representasi tongkatnya memiliki jumlah yang sama1 -> 0
dan0 -> 1
dibandingkan dengan angka asli dan jumlahnya lebih kecil atau sama dengan argumen kedua.sumber