Dengan bilangan bulat positif k > 1
dan bilangan bulat non-negatif i
, buat k
-tupel (atau k
vektor -dimensi) dari bilangan bulat non-negatif. Untuk setiap k
, peta dari ℕ ke ℕ k , harus bijective . Artinya, setiap inputi
harus menghasilkan tuple yang berbeda, dan setiap tuple yang mungkin harus dihasilkan oleh beberapa input i
.
Anda dapat menulis suatu program atau fungsi, mengambil input melalui STDIN (atau alternatif terdekat), argumen baris perintah atau argumen fungsi dan mengeluarkan hasilnya melalui STDOUT (atau alternatif terdekat), nilai pengembalian fungsi atau parameter fungsi (keluar).
Anda dapat menggunakan format daftar datar yang nyaman, tidak ambigu, untuk output.
Solusi Anda seharusnya tidak memaksakan batasan buatan k
dani
tetapi Anda dapat mengasumsikan bahwa mereka sesuai dengan ukuran bilangan bulat asli bahasa Anda. Paling tidak, Anda harus mendukung nilai hingga 255
, meskipun, ukuran bilangan bulat asli Anda lebih kecil dari itu.
Bagaimanapun 1 < k < 32
, kode Anda akan menghasilkan hasil dalam hitungan detik (tentu saja, jika jawaban Anda tidak mendukung sebesar itu karena aturan sebelumnya, batasnya disesuaikan). Ini seharusnya tidak menjadi masalah: mungkin untuk menyelesaikan tantangan ini sehingga bisa bekerja hingga 128 dalam beberapa detik, tetapi ada batasnya untuk menghindari jawaban yang sebenarnya beralih dari kei < 231
i
0
i
untuk menemukan hasilnya.
Harap sertakan dalam jawaban Anda deskripsi pemetaan yang Anda pilih dan alasan mengapa itu bersifat obyektif (ini tidak perlu menjadi bukti formal).
Ini adalah kode golf, jawaban terpendek (dalam byte) menang.
Tantangan Terkait
sumber
q~2bW%1$Te]/zWf%2fbp
(urutan input berlawanan)CJam, 18 byte
Ini menggunakan formula yang lebih bodoh.
Coba di sini .
Penjelasan
Singkatnya, ini memetakan bilangan bulat positif ke:
sumber
Python 2, 62
Kode ini jelek dan golf, tetapi idenya sangat sederhana.
Kemas
k
ekspansi biner menjadi satu dengan membaca setiapk
digit dengan offset berbeda. Misalnya, dengank=3
, input357
memetakan ke(3,0,7)
:Mengaitkan angka-angka kembali bersama-sama membalikkannya, jadi itu adalah sebuah kebohongan. Dengan demikian, anggap ekspansi biner memiliki angka nol terdepan dalam jumlah tak terbatas.
sumber
J,
382827 byteIni adalah kata kerja diam-diam dan diad yang menggunakan i dan k sebagai argumen kiri dan kanan. Cobalah online dengan J.js .
Ide
Kami mendefinisikan peta f: N → N k oleh f (i): = (α 1 , ... α k-1 , p 1 α k ... p 2 α k + 1 ... - 1) , di mana ⟨p n ⟩ adalah urutan bilangan prima dan i + 1 = p 1 α 1 p 2 α 2 ... .
Dengan Teorema Aritmatika Fundamental, peta g: N → N ω didefinisikan oleh g (i): = (α 1 , α 2 , ...) (eksponen faktorisasi utama i + 1 ) adalah kata sifat.
Karena f (i) = (g 1 (i), ... g k-1 (i), g -1 (g k (i), g k + 1 (i), ...)) , peta f bersifat bijektif sebagai baik.
Kode
sumber
Python 2, 72
Fungsi ini
q
bekerja pada angka-angka biner dengan mengambil setiap bit detik mulai dari akhir. Sebagai hasilnya,q(z), q(z>>1)
berikan dua angka yang digit binernya diselingiz
. Misalnya, 594 dibagi menjadi 12 dan 17.Ini adalah peninggalan karena kita dapat menyatukan kembali angka-angka untuk memulihkan nomor aslinya.
Fungsi
g
ini menerapkank-1
waktu penambangan ini , berkembang dari satu elemen ke sepasang menjadi tiga ... ke-k
ganda. Setiap kali, elemen terakhir diperluas menjadi dua elemen. Ini dilakukan secara rekursif dengan memetakan input ke suatu pasangan melalui bijection, mengambil elemen pertama dari pasangan untuk entri pertama dari output, dan menerapkan fungsi secara rekursif dengank-1
elemen kedua untuk menghasilkan entri yang tersisa.sumber