Masalah ini cukup mudah dilakukan dengan brute force. Bahkan, itu akan cukup cepat untuk memaksa juga. Tapi di mana kesenangannya?
Masalah
Menghasilkan daftar semua pasangan nomor 5 digit unik yang dijumlahkan 121212
. Namun, setiap angka desimal harus muncul tepat satu kali dalam salah satu angka. Jadi pasangan yang valid adalah (98167, 23045)
. Tetapi pasangan yang tidak valid akan (23456, 97756)
karena 7, 5, 6
diulang lebih dari satu kali, dan 1, 8, 0
tidak digunakan sama sekali. Tepatnya ada 192 pasangan unik.
Aturan
Efisiensi: Anda dapat dengan paksa memaksakan ini. Tapi itu sepele untuk dilakukan. Jadi alih-alih, tantangan sebenarnya di sini adalah menemukan cara untuk secara efisien menghasilkan daftar angka.
Persyaratan Kode Sumber: Tidak dapat menyimpan daftar nomor (atau bagian mana pun dari itu). Urutan nomor harus dibuat dengan cepat.
Selamat bersenang-senang!
sumber
Jawaban:
JavaScript
Diinangi di: http://ebusiness.hopto.org/findpairs.htm
Realisasi matematis: Jika Anda memiliki satu pasangan, 15 pasangan lainnya dapat dengan sepele dihasilkan dengan menukar angka di antara kedua angka tersebut, oleh karena itu saya hanya mencari angka-angka di mana angka yang pertama lebih besar dari angka yang kedua, dan kemudian cukup mengeluarkan semua permutasi.
Saya mulai dari angka paling tidak signifikan dan menghasilkan urutan sebagai traversal pohon, untuk setiap langkah menyatakan bahwa hasil antara benar dan tidak ada digit yang dihabiskan dua kali. Dengan metode ini fungsi hanya perlu dipanggil 50 kali secara total. Di mesin saya, Chrome menghasilkan hasil runtime yang biasanya 2 ms.
sumber
C ++
http://www.ideone.com/Lr84g
sumber
10!/2
) dan kemudian memeriksa apakah itu dapat diringkas ke 121212. Tidak buruk sama sekali untuk menjalankan pertama. Tapi saya masih penasaran apakah kita bisa menjadi lebih efisien ...(51430, 69872)
adalah pasangan yang valid. Anda dapat melakukan pra-simpan daftar digit (0123456789
) dan jumlah (121212
).Python 2.
Ini cukup efisien karena ia membangun angka-angka (loop paling dalam dieksekusi total 4570 kali) dan cukup pendek karena saya bermain golf sedikit (201 karakter), tapi saya tidak begitu yakin saya ingin menjelaskan ini :)
Nilai yang dikembalikan cukup aneh, meskipun: panggilan
w
dengan tuple kosong, dan Anda mendapatkan iterator 10-tupel. 10 tupel ini adalah digit dari dua angka, sayangnya mundur dan bergantian , yaitu tupelmewakili angka 51430 dan 69782.
Uji:
Ini adalah versi yang tidak dikoleksi:
sumber
C
Ini melintasi semua pasangan nomor 5-digit yang berjumlah 121212 (artinya 39393 iterasi, atau ~ 1/46 dari iterasi yang digunakan oleh jawaban fR0DDY ). Untuk setiap pasangan, ini membentuk topeng bit dari angka di setiap angka, kemudian melihat apakah mereka ATAU hingga 0b1111111111.
sumber
Javascript (481)
http://jsfiddle.net/XAYr3/4/
Ide dasar: menghasilkan kombinasi angka yang valid yang dapat digunakan di kolom paling kanan. Misalnya, (0,2), (3,9), (4,8), (5,7). Untuk setiap kombinasi, temukan pasangan yang bekerja untuk digit berikutnya-dari-kanan, secara berulang, tanpa menggandakan digit pada pasangan pertama. Perulangan hingga sepasang angka 5-digit telah dihasilkan. Gabungkan semua hasil itu menjadi satu larik, dan daftarnya adalah 192 elemen. Ini saya percaya harus memerlukan tentang iterasi paling sedikit, tetapi semua alokasi / deallokasi array membuatnya secara keseluruhan agak tidak efisien secara praktis.
Tes penghitungan saya menunjukkan bahwa fungsi
f
disebut 310 kali, loop dalami
dieksekusi total 501 kali (di semua panggilan kef
), dan loop dalam-dalamj
dieksekusi total 768 kali (di semua segalanya).sumber
Python, 171 karakter
Kode mempertahankan invarian yang
x
,y
memilikic
angka dan bahwa semua yang tidak terpakai angka yang di setd
.Rutin
R
disebut total 841 kali, yang cukup efisien.sumber
C ++
http://www.ideone.com/Lr84g
sumber