Daftar kosong adalah daftar yang pada level mana pun tidak berisi objek yang tidak ada dalam daftar. Atau jika Anda lebih suka definisi rekursif
Daftar kosong tidak valid
Daftar yang hanya berisi daftar kosong lainnya tidak berlaku
Semua daftar kosong memiliki kedalaman yang terbatas.
Berikut ini beberapa contoh daftar kosong (menggunakan sintaksis python):
[]
[[]]
[[],[]]
[[[]]]
[[[]],[]]
[[],[[]]]
Berikut adalah beberapa contoh hal-hal yang bukan daftar batal:
["a"]
[[...]]
[1]
2
[[],([],[])]
Tugas
Tulis dua fungsi terpisah (atau program jika Anda mau). Satu harus mengambil bilangan bulat positif (Anda juga dapat memasukkan nol jika Anda mau) sebagai argumen dan mengembalikan daftar kosong yang lain harus mengambil daftar kosong dan mengembalikannya bilangan bulat. Dua fungsi ini harus selalu menjadi invers satu sama lain. Itu adalah jika Anda melewatkan output f
ke g
Anda harus mendapatkan input asli f
sebagai hasil g
. Ini berarti pemetaan harus 1: 1, yaitu untuk setiap bilangan bulat, mungkin hanya ada tepat satu daftar kosong yang g
memberikan bilangan bulat itu dan untuk setiap daftar batal harus ada tepat satu bilangan bulat yang f
memberikan daftar batal itu.
Anda pada dasarnya menciptakan sebuah Bijection
Anda dapat memilih untuk menggunakan representasi string dari daftar kosong (dengan atau tanpa koma dan spasi) daripada jenis daftar asli bahasa Anda.
Mencetak gol
Skor Anda akan menjadi panjang dari dua fungsi Anda bersama-sama. Ini adalah kode-golf sehingga Anda harus berusaha meminimalkan jumlah ini.
Jawaban:
Pyth, 27 + 29 = 56 byte
f
:Suite uji
g
:Suite uji
Sistem ini sangat sederhana: Saya menghasilkan semua daftar yang mungkin dengan tidak lebih dari jumlah tertentu
[
. Kemudian, saya mengurutkannya sedemikian rupa sehingga daftar yang belum saya buat akan mendekati akhir. Ini semua dilakukan oleh fungsiy
, identik di kedua program. Itu ditulis sebagaiKemudian, saya mengindeks ke dalam daftar ini untuk
f
, dan mencari melalui itug
.Jumlah daftar yang saya hasilkan dipilih untuk menjadi cukup besar sehingga saya telah menghasilkan semua daftar yang mungkin muncul pada atau sebelum lokasi yang diinginkan dalam daftar diurutkan tak terhingga.
Program memungkinkan / mengembalikan 0 sebagai opsi.
sumber
Python 2 , 96 byte
Cobalah online! untuk menguji bijection.
Membawa daftar batal ke bilangan bulat non-negatif. 42 byte
Membawa bilangan bulat tidak negatif ke daftar batal 54 byte Upaya yang lebih rekursif memberi panjang yang sama.
sumber
Java 7, 725 byte
f(int)
( 325 byte ):g(String)
( 75 + 325 byte ):Karena metode
g
menggunakan metodef
untuk menghitung hasilnya dengan mengulangi daftar kosong yang mungkin sampai menemukan yang sama dengan yang diinput, bytef
dihitung dua kali (karena kedua metode harus dapat berjalan tanpa yang lain untuk tantangan ini).Penjelasan:
Secara umum, metode
f
hanya mengulangi semua representasi String biner dari bilangan bulat, dan menambah penghitung setiap kali ditemukan valid. String biner yang valid untuk tantangan ini mematuhi aturan berikut: Mereka mulai dengan a1
, dan diakhiri dengan a0
; mereka memiliki jumlah 1s dan 0s yang sama; dan setiap kali Anda menghapus pertama1
dan0
dan memvalidasi apa yang tersisa lagi, dua aturan ini masih berlaku. Setelah penghitung sama dengan input, itu mengkonversi biner-String ke daftar string-kosong, dengan mengganti semua1
dengan[
dan semua0
dengan]
.Adapun metode
g
: Kita mulai dengan"[]"
(mewakili void-list0
), dan kemudian melanjutkan menggunakan metodef
sambil meningkatkan integer, sampai cocok dengan input-String.Contoh input & output kasus:
Coba di sini. (CATATAN: Cukup lambat untuk beberapa kasus uji terakhir. Akan memakan waktu sekitar 10-15 detik untuk semuanya).
sumber
[][]
bukan daftar. Mungkin saya salah paham bagaimana Jawa melakukan apapun. Menambahkan[...]
semua dari mereka dan memiliki 0 peta untuk[]
melakukan trik.K (ngn / k) , 49 byte
Cobalah online!
menggunakan rumus dari contoh di Bijection: daftar mirip pohon - bilangan asli
sumber
JavaScript (Node.js) , 82 byte
Cobalah online!
Gagasan utama
sumber
Python 3 - masuk / abs, 73 byte
Cobalah online!
Implementasi lurus ke depan, mendukung angka negatif.
Integer
i
dikodekan[sign(i), abs(i)]
, di manasign(i)=[] if i > 0 else [[]]
danabs(i)=[[]] * i
, yaitu daftar daftar kosong dengan panjang abs (i).Python 3 - biner, 126 byte
Ini adalah versi yang lebih rumit (dan lebih lama ...), di mana nilai absolut dikodekan dalam representasi daftar biner.
Cobalah online!
sumber
Stax , total 33 byte
Program-program ini adalah kebalikan dari satu sama lain. Mereka mengonversi ke dan dari semua daftar kosong dan semua bilangan bulat non-negatif, sehingga termasuk 0. Ini sepertinya merupakan fungsi yang terkenal dari beberapa jenis aljabar yang saya tidak tahu. Untuk membungkus kepala saya, saya pertama kali mengimplementasikan program sebagai fungsi dalam python.
Program stax memiliki perilaku yang sama.
Integer non-negatif → Daftar kosong, 15 byte
Jalankan dan debug itu
Daftar kosong → Bilangan bulat non-negatif, 18 byte
Jalankan dan debug itu
sumber