Ini terinspirasi oleh masalah matematika yang saya lihat di suatu tempat di internet tetapi tidak ingat di mana (PEMBARUAN: Masalah aslinya ditemukan pada subreddit teka-teki matematika dengan bukti asalkan itu mungkin, juga lihat posting Math SE ini ), meminta bukti jika proses berikut ini memungkinkan untuk setiap pasangan bilangan bulat sewenang-wenang (dari apa yang saya ingat, itu mungkin untuk setiap pasangan yang diberikan):
Diberikan sepasang bilangan bulat, j dan k, gandakan salah satunya dan tambahkan satu ke yang lain, menghasilkan sepasang bilangan bulat baru, yaitu, (j, k) -> (j + 1, k * 2) atau (j * 2, k +1). Kemudian ulangi proses ini dengan bilangan bulat tersebut, dengan tujuan agar pasangan bilangan bulat sama.
Contoh-contoh yang diberikan ini belum tentu optimal tetapi menunjukkan bagaimana proses ini dapat dilakukan pada bilangan bulat apa pun, positif, negatif atau nol:
(2, 5) -> (3, 10) -> (6, 11) -> (12, 12)
(5, 6) -> (6, 12) -> (7, 24) -> (14, 25) -> (28, 26) -> (56, 27) -> (112, 28) -> (113, 56) -> (226, 57) -> (227, 114) -> (228, 228)
(0, 2) -> (1, 4) -> (2, 5) -> (3, 10) -> (6, 11) -> (12, 12)
(-4, 0) -> (-3, 0) -> (-2, 0) -> (-1, 0) -> (0, 0)
(3, -1) -> (6, 0) -> (12, 1) -> (13, 2) -> (14, 4) -> (15, 8) -> (16, 16)
(-4, -3) -> (-8, -2) -> (-16, -1) -> (-32, 0) -> (-31, 0) -> ... -> (0, 0)
Tantangan
Buat program yang diberi dua bilangan bulat, mengeluarkan daftar langkah-langkah yang diperlukan untuk membuat bilangan bulat itu sama dengan secara berulang menambah satu dan menggandakan yang lainnya
Spesifikasi
- Solusi tidak harus optimal tetapi harus diselesaikan dalam jumlah langkah terbatas untuk setiap pasangan yang sewenang-wenang
Input harus berupa dua bilangan bulat
Output dapat berupa output yang masuk akal yang dengan jelas menunjukkan bilangan bulat yang dihasilkan dari setiap langkah, misalnya:
- string dengan dua pembatas yang berbeda (simbol apa saja, spasi putih, dll), satu untuk setiap bilangan bulat dalam satu pasangan dan satu untuk setiap pasangan
- mis. input j, k: 2, 5 -> output: 3,10; 6,11; 12,12
- daftar daftar bilangan bulat
- mis. input j, k: 2, 5 -> output: [[3, 10], [6, 11], [12, 12]]
- string dengan dua pembatas yang berbeda (simbol apa saja, spasi putih, dll), satu untuk setiap bilangan bulat dalam satu pasangan dan satu untuk setiap pasangan
Jika input adalah pasangan angka yang sama, Anda dapat mengeluarkan apa saja asalkan konsisten dengan jawaban nontrivial lainnya
- sebagai contoh
- jika input [2, 5] memiliki output [[3, 10], [6, 11], [12, 12]], yang tidak termasuk pasangan input, maka input [4, 4] seharusnya tidak menghasilkan apa-apa.
- jika input [2, 5] memiliki output [[2, 5], [3, 10], [6, 11], [12, 12]], yang mencakup pasangan input, maka input [4, 4] harus output [[4, 4]].
- sebagai contoh
Metode IO standar berlaku dan lubang standar dilarang
Ini adalah kode golf sehingga jawaban terpendek dalam byte menang
sumber
[(12,12),(6,11),(3,10),(2,5)]
untuk input(2,5)
?Jawaban:
JavaScript (ES6),
1119083 byteCobalah online!
Berkomentar
sumber
Haskell,
7069 byteCobalah online!
BFS sederhana. Melacak langkah-langkah dalam daftar daftar pasangan.
sumber
Python 3 ,
907472 byte-2 byte terima kasih kepada Dennis .
Cobalah online!
Mengambil input sebagai daftar tunggal .
Tidak disatukan
sumber
Pyth, 41 byte
Coba di sini
Penjelasan
Ini adalah pencarian pertama yang cukup luas. Simpan antrian dari urutan yang mungkin (
J
), dan sampai kami mendapatkan pasangan yang cocok, ambil urutan berikutnya, tempelkan pada setiap gerakan yang mungkin, dan letakkan di akhir antrian.Demi singkatnya, kami mendefinisikan fungsi
y
(menggunakan ekspresi lambdaL
) untuk melakukan salah satu gerakan, dan menerapkannya maju dan mundur.sumber
Jelly , 20 byte
Cobalah online!
sumber
[[2,5]]
)05AB1E ,
252220 byteMengambil daftar bersarang ganda sebagai input dan menampilkan daftar bergerigi dengan setiap langkah pada satu kedalaman sarang.
Cobalah online!
Penjelasan
sumber
Retina , 72 byte
Cobalah online! Hanya dua kasus uji karena keterbatasan aritmatika unary. Penjelasan:
Konversikan ke unary.
Sementara input tidak mengandung sepasang angka yang identik ...
... cocokkan dengan pasangan terakhir pada setiap baris ...
... dan mengubah garis menjadi dua garis, satu suffix dengan angka pertama bertambah dan kedua berlipat ganda, yang lainnya suffix dengan angka pertama dua kali lipat dan yang kedua bertambah.
Ikuti terus dengan pasangan yang cocok.
Konversi kembali ke desimal.
8988 byte byte desimal versi aritmatika (bekerja dengan 0 juga):Cobalah online!
sumber
MATL , 24 byte
Waktu berjalan adalah acak, tetapi terbatas dengan probabilitas 1.
Kode ini sangat tidak efisien. Input yang membutuhkan lebih dari 4 atau 5 langkah memiliki kemungkinan besar penghentian waktu dalam juru bahasa online.
Cobalah online!
Penjelasan
sumber
Stax ,
2926 byteJalankan dan debug itu
Ini pencarian pertama yang luas. Tampaknya cukup cepat.
Dibutuhkan sepasang integer yang dibungkus ganda. Outputnya adalah daftar nilai yang dipisahkan oleh spasi. Setiap dua nilai mewakili satu pasangan di jalur menuju solusi.
sumber
Haskell , 95 byte
Cobalah online! Output dalam urutan terbalik, misalnya
h(2,5)
hasil[(12,12),(6,11),(3,10),(2,5)]
.sumber
Merah , 142 byte
Mengambil input sebagai blok bersarang ganda dari pasangan bilangan bulat dalam format Merah
(2, 5)
->2x5
Mengembalikan hasilnya sebagai daftar pasangan merah , misalnya
2x5 3x10 6x11 12x12
. Termasuk pasangan awal.Cobalah online!
Input yang ketat:
Inputnya adalah dua angka, misalnya
2 5
Merah , 214 byte
Cobalah online!
Penjelasan:
sumber