Diberikan nilai x menemukan nilai numerik terkecil lebih besar dari y yang mampu dikalikan dan dibagi dengan x sambil mempertahankan semua digit asli.
- Angka-angka baru tidak kehilangan digit.
- Angka-angka baru tidak mendapatkan angka.
Sebagai contoh:
Input: x = 2, y = 250000
- Asli: 285714
- Divisi: 142857
- Perkalian: 571428
Ini benar karena 285714 lebih besar dari y ; kemudian ketika dibagi dengan x hasil di 142857 dan ketika dikalikan dengan x hasil di 571428 . Di kedua tes semua digit asli dari 285714 hadir dan tidak ada digit tambahan telah ditambahkan.
Aturan
- X harus 2 atau 3 karena sesuatu yang lebih tinggi membutuhkan waktu terlalu lama untuk dihitung.
- Y harus bilangan bulat lebih besar dari nol .
- Kode terpendek menang.
Uji Kasus
Ini adalah kasus uji saya yang paling umum karena merupakan yang tercepat untuk diuji.
- x = 2, y = 250000 = 285714
- x = 2, y = 290000 = 2589714
- x = 2, y = 3000000 = 20978514
- x = 3, y = 31000000 = 31046895
- x = 3, y = 290000000 = 301046895
Klarifikasi
- Jenis pembagian tidak masalah. Jika Anda bisa mendapatkan 2,05, 0,25, dan 5,20 entah bagaimana maka jangan ragu.
Semoga beruntung untuk kalian semua!
Jawaban:
Sekam , 14 byte
Cobalah online!
Penjelasan
sumber
-
yang salah.Brachylog v2, 15 byte
Cobalah online!
Mengambil input dalam formulir
[x,y]
.Penjelasan
Komentar
Kelemahan Brachylog dalam menggunakan kembali beberapa nilai beberapa kali muncul di sini; Program ini hampir semuanya plumbing dan algoritmanya sangat sedikit.
Dengan demikian, mungkin tampak lebih mudah untuk secara sederhana meng-hardcode nilai y (ada komentar pada pertanyaan ini dengan hipotesis bahwa 2 adalah satu-satunya nilai yang mungkin). Namun, sebenarnya ada solusi untuk y = 3, artinya sayangnya, pipa ledeng harus menangani nilai y juga. Yang terkecil yang saya sadari adalah sebagai berikut:
(Teknik yang saya gunakan untuk menemukan angka ini tidak sepenuhnya umum, jadi ada kemungkinan bahwa ada solusi yang lebih kecil menggunakan beberapa pendekatan lain.)
Anda tidak akan memverifikasi dengan program ini . Brachylog's
p
ditulis dengan cara yang sangat umum yang tidak memiliki optimisasi untuk kasus-kasus khusus (seperti kasus di mana input dan output sudah diketahui, artinya Anda dapat melakukan verifikasi di O ( n log n ) melalui penyortiran, bukan daripada O ( n !) untuk pendekatan brute-force yang saya curigai gunakan). Sebagai akibatnya, dibutuhkan waktu yang sangat lama untuk memverifikasi bahwa 105263157894736842 adalah permutasi 315789473684210526 (Saya telah membiarkannya berjalan selama beberapa menit sekarang tanpa kemajuan yang jelas).(EDIT: Saya memeriksa sumber Brachylog untuk alasannya. Ternyata jika Anda menggunakan
p
dua bilangan bulat yang diketahui, algoritme yang digunakan menghasilkan semua kemungkinan permutasi bilangan bulat yang dimaksud hingga menemukan yang sama dengan bilangan bulat keluaran, sebagai algoritme adalah "input → indigits, permute indigits → outdigits, outdigits → output". Algoritme yang lebih efisien adalah dengan mengatur hubungan outdigits / output terlebih dahulu , sehingga penelusuran ulang dalam permutasi dapat mempertimbangkan angka mana yang tersedia.)sumber
p
tidak berjalanpermutation/2
dengan dua daftar yang diketahui, bahkan ketika diberi dua bilangan bulat yang dikenal sebagai argumen; itu menghasilkan semua permutasi integer pertama (menggunakanpermutation/2
dengan satu daftar yang diketahui) dan kemudian membandingkannya dengan integer kedua.Perl 6 , 56
54byteCobalah online!
Alternatif yang menarik, menghitung n * x k untuk k = -1,0,1:
sumber
Bersihkan , 92 byte
Cobalah online!
Cukup mudah. Penjelasan datang sebentar.
sumber
q, 65 byte
Pisahkan angka pada basis 10, urutkan setiap kenaikan, dan periksa apakah sama. Jika tidak, tambahkan y dan lanjutkan lagi
sumber
JavaScript (ES6),
767369 byteDisimpan 3 byte dengan menggunakan
eval()
, seperti yang disarankan oleh @ShieruAsakotoMengambil input sebagai
(x)(y)
.Cobalah online!
Versi rekursif akan menjadi 62 byte , tetapi tidak cocok di sini karena banyaknya iterasi yang diperlukan.
Bagaimana?
Contoh:
Ketika menambahkan dua array bersama-sama, masing-masing dari mereka secara implisit dipaksa ke string yang dipisahkan koma. Digit terakhir dari array pertama akan langsung digabungkan dengan digit pertama dari array kedua tanpa koma di antara mereka, yang membuat format ini tidak ambigu.
Contoh:
Tapi:
Berkomentar
sumber
x=>F=y=>(g=x=>r=[...x+''].sort()+'')(y*x)!=g(y)|r!=g(y/x)?F(y+1):y
Dapat menyebabkan stack overflow jika Anda jauh dari solusi.eval
:x=>y=>eval("for(;(g=x=>r=[...x+''].sort()+'')(y*x)!=g(y)|r!=g(y/x);y++);y")
eval()
idenya. Upaya pertama saya memang rekursif, tetapi saya menyerah karena tingginya jumlah iterasi yang diperlukan.Haskell,
7674 byteDua byte dicukur berkat komentar Lynn
sumber
f
bisaf x y=[n|n<-[y+1..],all(==s n)[s$n*x,s$n/x]]!!0
tetapi kemudian mendefinisikan jawaban Anda sebagai operator menghemat dua byte:x!y=…
dan kemudian jawaban Anda adalah(!)
:)Japt, 24 byte
Solusi yang cukup naif selama beberapa bir; Saya yakin ada cara yang lebih baik.
Cobalah
sumber
315789473684210526
adalah solusi pertama untukx=3
, Javascript atau Japt tidak dapat menghitung dengan benar karena tidak cocok dalam presisi ganda.Python 2 , 69 byte
Cobalah online!
sumber
f=lambda x,y,S=sorted:y*(S(`y`)==S(`y*x`)==S(`y/x`))or f(x,y+1)
harus bekerja, tetapi itu mencapai batas rekursi cukup cepat, dan saya tidak tahu apa aturan PPCG katakan tentang itu.Jelly ,
1413 byte-1 terima kasih kepada Erik the Outgolfer (`` menggunakan make_digits, jadi
D
tidak diperlukan)+2 memperbaiki bug (sekali lagi terima kasih kepada Erik the Outgolfer karena menunjukkan masalah yang tidak ada sama sekali)
Program lengkap mencetak hasilnya (sebagai tautan diadik daftar panjang 1 dihasilkan).
Cobalah online!
Bagaimana?
Perhatikan bahwa ketika pembagian tidak tepat instruksi desimal implisit (setara dengan a
D
) diterapkan sebelum pengurutan menghasilkan bagian fraksionalmisalnya:
1800÷3D
->[6,0,0]
while
1801÷3D
->[6.0,0.0,0.33333333333337123]
sumber
D
.>=
saya benar-benar merindukan itu! Tidak tahuṢ
ada make_digits ditetapkan di atasnya - terima kasih. Akan harus memperbaiki & memperbarui nanti ...Mathematica,
8274 byte-8 byte berkat tsh
Fungsi yang mengambil argumen sebagai
[x,y]
. Secara efektif, pencarian brute force yang memeriksa apakah daftar angka yang diurutkany
,y/x
danxy
sama.Cobalah online!
sumber
x=3
, tapi saya tidak yakin itu benar untukx=2
.v = a[1]*10^p[1] + a[2]*10^p[2] + ... + a[n]*10^p[n]
,u = a[1] * 10^q[1] + ... + a[n] * 10^q[n]
. Danu-v = a[1]*(10^p[1]-10^q[1]) + ... + a[n]*(10^p[n]-10^q[n])
Karena10^x-10^y=0 (mod 9)
selalu berlaku.u-v=0 (mod 9)
selalu berlaku. Jika ada jawaban yang salahw
, karenaw*x-w=0 (mod 9)
, danw-floor(w/x)=0 (mod 9)
: kita punyafloor(w/x)=0 (mod 9)
. jikafloor(w/x)*x <> w
,,w-floor(w/x)*x>=9
tetapi ini bertentangan dengan fakta bahwaw-floor(w/x)*x<x
sementara x bisa 2 atau 3.w=0 (mod 9)
berikut adalah dariw*x-w=0 (mod 9)
karenax-1
tidak dapat dibagi oleh 3.IntegerQ
tes, itu menghasilkan beberapa kesalahan ketika mencoba melakukanIntegerDigits
pada pecahan, tetapi Mathematica masih melewati mereka dan menghasilkan jawaban yang benar. Saya tidak yakin apakah kesalahan yang dimasukkan selama perhitungan akan diizinkan, bahkan jika jawaban akhirnya benar.APL (NARS), 490 karakter, 980 byte
uji
Saya pikir masalahnya sebagai ra angka mudah yang dapat bervariasi sehingga seseorang memiliki 3 angka r, r * x, r * x * x dalam cara r mulai nilai yang r * x dekat y (di mana x dan y adalah input masalah menggunakan huruf yang sama dengan posting utama). Saya menggunakan pengamatan bahwa jika digit pertama r adalah d daripada di r harus muncul digit d * x dan d * x * x juga, untuk membuat r (atau lebih baik r * x) satu solusi.
sumber
05AB1E , 16 byte
Cobalah online. (CATATAN: Solusi yang sangat tidak efisien, jadi gunakan input yang dekat dengan hasilnya. Ini berfungsi untuk input yang lebih besar juga secara lokal, tetapi pada TIO akan habis setelah 60 detik.)
Penjelasan:
sumber