Tantangan
Tulis fungsi atau program yang mengambil angka desimal positif, sebut saja A , dan hasilkan dua angka positif, B dan C , sehingga:
- A == B bitxor C
- B dan C tidak boleh mengandung digit 0, 3 atau 7 dalam representasi desimalnya.
Contohnya
>>> decompose(3)
1, 2
>>> decompose(7)
1, 6
>>> decompose(718)
121, 695
>>> decompose(99997)
2, 99999
>>> decompose(4294967296)
4294968218, 922
>>> decompose(5296080632396965608312971217160142474083606142654386510789497504098664630388377556711796340247136376)
6291484486961499292662848846261496489294168969458648464915998254691295448225881546425551225669515922,
1191982455588299219648819556299554251659915414942295896926425126251962564256469862862114191986258666
Karena dekomposisi tidak unik, fungsi / program Anda tidak perlu menampilkan hasil yang sama persis dengan contoh yang diberikan ini.
Aturan yang sangat rinci
Pengajuan harus dalam bentuk fungsi atau program yang lengkap .
import
pernyataan memang diperhitungkan dalam skor akhir.Anda dapat mengasumsikan input A selalu mengandung setidaknya digit 0, 3 atau 7.
Anda dapat menganggap bahwa dekomposisi selalu ada.
Anda dapat menggunakan BigInt jika mereka adalah bagian dari perpustakaan standar bahasa, atau dapat diinstal melalui manajer paket de jure bahasa .
Fungsinya harus cepat. Seharusnya tidak lebih dari 20 detik untuk berjalan di komputer yang cukup modern saat memasukkan nomor 100-digit, dan tidak lebih dari 2 detik saat memasukkan nomor 10-digit.
Fungsi / program harus mendukung input hingga setidaknya 100 digit .
- Jika fungsi / program hanya dapat mendukung bilangan bulat hingga N <100 digit, akan ada penalti sebesar + 10 × (100 / N - 1) byte ke skor akhir. Ini untuk mendorong pegolf untuk mendukung nomor yang lebih luas walaupun impor mungkin dilakukan secara verbal.
Tidak ada batasan pada presentasi input / output selama mereka jelas dalam representasi desimal.
- Fungsi ini dapat menginput dan mengeluarkan string / BigInts jika tipe integer bawaan tidak cukup.
- Input mungkin berasal dari parameter fungsi, argumen baris perintah atau STDIN.
- Fungsi dapat mengembalikan hasilnya, atau hanya mencetak hasilnya langsung ke STDOUT.
- Namun, limpahan yang dimasukkan pada input / output tidak diizinkan.
- Perkiraan jawaban tidak ditoleransi, input / output harus tepat.
Mencetak gol
Ini adalah kode-golf . Solusi terpendek dalam byte menang.
Ada penalti jika program hanya dapat mendukung angka kurang dari 100 digit:
- 64-bit integers (19 digit) = +42 byte
- Bilangan bulat 63-bit (18 digit) = +45 byte
- Bilangan bulat 53-bit (15 digit) = +56 byte
- 31/32-bit integer (9 digit) = +101 byte
Jawaban:
CJam, 70 byte
Cobalah online.
Pilih bilangan bulat secara acak hingga menemukan kecocokan. Ini hampir tidak sesuai dengan batas 20 detik untuk integer 64-bit (menggunakan interpreter Java), jadi saya telah menambahkan 42 ke jumlah byte yang sebenarnya.
Contoh dijalankan
sumber
Common Lisp,
240224183173169 byteCommon Lisp agak verbose untuk bermain golf. Namun, ini menguraikan angka 100 digit dalam waktu kurang dari satu detik, dan bilangan bulat 200 digit dalam waktu kurang dari sepuluh detik, jadi tidak perlu penalti. Algoritma bersifat deterministik.
Umpan garis antara fungsi-fungsi ini hanya untuk keperluan tipografi. Uji coba dengan input referensi 100 digit:
Sebagai bonus, saya menyertakan versi kode yang secara bertahap membangun solusi dari atas ke bawah. Ia dapat mengatur angka 1000 digit dalam waktu kurang dari sepuluh detik, tetapi tidak dapat bersaing dalam golf karena kode tambahan.
sumber
Python 2, 103 + 42 = 145 byte
Python secara alami mendukung bigints, tetapi program ini jauh melebihi 20 detik untuk angka 100 digit. Namun, itu terurai integer 64-bit dalam waktu sekitar 2 detik.
sumber
while
loop untuk terus mencoba nilai acak - Anda bisa memanggil fungsi itu lagi. Tanpa perlu struktur pengendalian, maka Anda dapat runtuh fungsi kelambda
dan ternary a:from random import* d=lambda a,b=0:set(`b`+`a^b`)&set(\'037\')and d(a,randint(1,a))or(b,a^b)
. Meskipun Anda mungkin lebih baik tidak menggunakan fungsi.Python 3 (132 byte)
(Ini hanya untuk merangsang solusi yang lebih baik. Ini adalah solusi saya ketika menyelesaikan masalah asli dalam film ASCII.)
Meskipun perilaku bitwise xor dalam sistem desimal cukup rumit, ada satu pengamatan utama: memodifikasi digit rendah tidak akan mempengaruhi digit tinggi . Oleh karena itu, kita dapat bekerja dari atas ke bawah: cobalah untuk membuat digit atas bebas dari 0, 3, 7, dan kemudian bekerja pada digit berikutnya, hingga seluruh angka dikerjakan. Ini memungkinkan kita untuk berjalan dalam waktu linier, kemudian memproses angka seribu digit dapat diselesaikan dalam waktu kurang dari 1 detik. (Solusi Common Lisp juga menggunakan teknik yang sama saya percaya.)
sumber
997^8 == 1005
,. Saya pikir ada kernel ide di sini, tetapi tidak jelas.{1,2,4,5,6,8,9}
, akan ada beberapa dari mereka yang tidak akan mempengaruhi angka tinggi. (mis997^2 == 999
.).while
Lingkaran dalam melakukan kelelahan untuk menemukan pilihan yang membuat angka tinggi tetap valid.