Tantangan ini terinspirasi oleh pertanyaan tentang Mathematica.SE .
Katakanlah Anda memiliki daftar / array bersarang dari beberapa struktur arbitrer (daftar di setiap level tidak harus memiliki panjang yang sama). Untuk kesederhanaan, kami akan menganggap bahwa node adalah bilangan bulat non-negatif atau array kosong. Sebagai contoh
[[[1, 3], 2], [1, 4], 12, [[0, [], 0], [5, [7]]]]
Terkadang lebih mudah untuk meratakan daftar itu untuk melakukan manipulasi node, misalnya
--> [1, 3, 2, 1, 4, 12, 0, 0, 5, 7]
--> [1, 1, 0, 1, 0, 0, 0, 0, 1, 1]
Tetapi pada akhirnya Anda benar-benar ingin mempertahankan struktur aslinya, jadi Anda ingin mengubahnya menjadi
--> [[[1, 1], 0], [1, 0], 0, [[0, [], 0], [1, [1]]]
Tugas Anda adalah melakukan langkah terakhir itu.
Diberikan daftar bersarang dari bilangan bulat non-negatif sewenang-wenang, yang mewakili struktur hasil yang diinginkan, dan daftar datar bilangan bulat non-negatif, yang mewakili nilai yang diinginkan, membentuk kembali daftar datar menjadi bentuk daftar terstruktur. Anda dapat mengasumsikan bahwa kedua daftar berisi jumlah bilangan bulat yang sama.
Seperti biasa Anda tidak harus berurusan dengan input yang tidak valid (mis. Daftar kedua tidak datar, input yang cacat secara sintaksis, tidak memiliki integer sebagai node, dll.). Anda dapat memodifikasi array input dalam kode Anda.
Anda dapat menulis suatu fungsi atau program, mengambil input melalui STDIN, argumen baris perintah atau argumen fungsi, dan Anda dapat mengembalikan hasilnya atau mencetaknya ke STDOUT. Anda dapat menggunakan format string atau daftar yang mudah digunakan untuk merepresentasikan input dan output (selama formatnya tidak ambigu dan inputnya tidak diproses sebelumnya). Juga, format kedua input harus konsisten (jadi Anda tidak dapat mengambil satu input sebagai string dan yang lainnya sebagai daftar, misalnya). Anda dapat mengambil daftar input dalam urutan apa pun, tetapi harap tentukan metode input yang tepat dalam jawaban Anda.
Satu batasan lagi: Anda tidak boleh menggunakan ekspresi reguler. Ini adalah tantangan manipulasi array, bukan tantangan manipulasi string.
Ini adalah kode golf, jadi jawaban tersingkat (dalam byte) menang.
Uji Kasus
Structure Values Result
[[[1,3],2],[1,4],12,[[0,0],[5,[7]]]] [1,1,0,1,0,0,0,0,1,1] [[[1,1],0],[1,0],0,[[0,0],[1,[1]]]]
[[[0,0],0],[0,0],0,[[0,0],[0,[0]]]] [1,1,0,1,0,0,0,0,1,1] [[[1,1],0],[1,0],0,[[0,0],[1,[1]]]]
[] [] []
[[]] [] [[]]
[0,1,2,3] [5,1,0,5] [5,1,0,5]
[[[[[0]]]]] [123] [[[[[123]]]]]
[0,[1,[]],[[]],[2,3],[]] [1,6,1,8] [1,[6,[]],[[]],[1,8],[]]
sumber
Jawaban:
CJam,
18 1613 byteMengambil input melalui STDIN dalam format yang sama dengan jawaban CJam sebelumnya:
dan output string hasil ke STDOUT
Saya hanya memperlakukan baris pertama sebagai string, mengubah semua karakter digit ke baris baru, membagi satu atau lebih kejadian baris baru, meletakkan baris kedua sebagai array di stack, membungkus array dan zip bersama dua array (baris). Pencetakan otomatis dan karena baris pertama diperlakukan sebagai string, ia tetap menggunakan tanda kurung.
Perluasan kode
Terima kasih kepada @ user23013 untuk menghemat 3 byte.
Cobalah online di sini
sumber
/La-
:%
.%
itu untuk split juga, dan itu terbagi di beberapa kejadian juga!JavaScript, ES6, 44 byte
Ini menciptakan fungsi
f
yang bisa disebut sepertiyaitu array bersarang dan array nilai sebagai argumen input. Output dari fungsi adalah array bersarang yang dikonversi.
Pertanyaan ini adalah pertanyaan yang sangat bagus untuk rekursi, itulah sebabnya jawabannya adalah fungsi rekursi yang rapi dan manis. Saya membuat fungsi
f
yang mengubah argumen pertama menggunakanmap
metode ini. Untuk setiap elemen, jika elemen adalah array, ia memanggilf
lagi, jika tidak, untuk bilangan bulat, ia mendapatkan item ke- i dan mengembalikannya, menambah nilaii
. Nilaii
diturunkan dalam setiap panggilan rekursif, sehingga menjaga urutan yang benar.Deteksi array vs integer sekali lagi dilakukan menggunakan
map
metode ini. Untuk variabel array,map
adalah fungsi yang valid, sedangkan untuk variabel integer, tidak ada properti atau fungsi yang disebutmap
didefinisikan untuk variabel.Ini berfungsi di peramban Firefox terbaru (karena ES6).
sumber
.map
kode. Apakah ada cara untuk memperpendeknya? Bagaimanapun, kode yang bagus!map
terkait dengan konteks, sehingga peta pertama menjadi milika
sementara peta berikutnya milik masing-masingx
dalam iterasi. Tidak ada cara lain yang lebih singkat untuk merujukmap
, juga tidak membedakan array dari bilangan bulatJavaScript, ES6, 41 byte
Saya sangat terkesan dengan jawaban Pengoptimal , itu dilakukan dengan sangat cerdik dan saya belajar banyak. Namun saat melihatnya saya menemukan cara untuk memperpendeknya sedikit dan memperbaiki bug kecil:
Saya mengambil
i
variabel dan menggantinya denganshift()
. Ini membuatnya sedikit lebih pendek dan memperbaiki masalah dengan fakta yangi
diteruskan oleh nilai dan bukan oleh referensi, penyihir menyebabkan beberapa angka dari array terakhir untuk diulang dan beberapa di akhir tidak digunakan. Sekali lagi, jawaban Pengoptimal dipikirkan dengan sangat baik, lebih baik daripada yang bisa saya lakukan, saya hanya memperbaikinya sedikit.sumber
Dyalog APL, 14 karakter
Ini adalah no-brainer:
(∊a)←b
.Biasanya,
∊a
berartia
diratakan, tetapi ketika itu terjadi di sisi kiri penugasan, itu tepat apa masalah ini meminta. Untuk memenuhi persyaratan fungsi, diperlukan beberapa coretan tambahan:{a←⍺⋄(∊a)←⍵⋄a}
(kurung kurawal untuk lambda;⍺
dan⍵
untuk argumen kiri dan kanan;⋄
untuk pemisah pernyataan).Tes di tryapl.org. Perhatikan bahwa dalam APL vektor numerik kosong dilambangkan dengan
⍬
("zilde"). Vektor satu elemen dibangun dengan(,A)
karena(A)
akan berarti skalar. Dalam output, hal ini:mewakili vektor numerik kosong. Di
0
tengah menunjukkan "elemen prototipe" yang bukan merupakan elemen dari array.sumber
(,1)
dan(1)
atau mengapa bit terakhir hanya disajikan sebagai[1|1]
ganti[1|[1]]
?]box on
) tidak membedakan di antara mereka. Ada fungsi lain di Dyalog (display
daridfns.dws
) yang membuat perbedaan, tetapi sayangnya tryapl membatasi pemuatan ruang kerja tambahan (yaitu perpustakaan). :(∊{0=⍴⍴⍵:⍕⍵ ⋄ '['(∇¨⍵)']'}a
. Atau ini:∊{0=⍴⍴⍵:⍕⍵ ⋄ '['(1↓,'|',[1.5]∇¨⍵)']'}a
jika Anda bersikeras pada pemisah|
,.]display a
di tryapl. Ini memberikan informasi lengkap tentang struktur. Maaf, saya tidak menyadarinya pada awalnya.Python, 51
Contoh:
sumber
Python 2, 50
Ini adalah masalah yang sangat indah. Ketika saya terus mengerjakannya, saya terus menyadari bahwa bit kode saya tidak perlu, dan logikanya runtuh menjadi ekspresi sederhana. Sebagian besar golf dalam menemukan algoritma yang tepat.
s
adalah struktur danv
daftar datar daftar. Idenya adalah untuk memeriksa apakahs
bilangan bulat dengans<[]
(Python 2 memperlakukan angka lebih kecil dari daftar). Jika ya, cukup ambil dan kembalikan elemen pertamav
, hapus dariv
. Jika tidak, kembalilah ke sublists daris
.Ini
pop
adalah bagian dari imperative magic dalam kode gaya yang sangat fungsional. Karena semuav
menunjuk ke instance yang sama, memunculkan elemen dari satu menghapusnya dariv
dalam seluruh pohon eksekusi, sehingga setiap angkav
hanya digunakan satu kali. Pemahaman daftar[f(x,v)for x in s]
membuat pohon panggilan yang diperluas kedalaman-pertama dan kiri-ke-kanan, menyebabkan elemen-elemen yangv
ditempatkan dalam urutan yang benar.Saya menulis ini secara independen dari jawaban grc , tetapi ternyata sama untuk memindahkan satu
[
(dan nama variabel). Langkah ini menyimpan char karena jarak. Braket bergerak berarti menangani kasus simpul segera dalam fungsi, bukan sebagai bagian dari pemahaman daftar, yang belum saya pertimbangkan.Kita bisa menyimpan char untuk 49 jika kita meregangkan persyaratan input untuk mengambil nilai dari STDIN dan struktur sebagai argumen fungsi. Ini memungkinkan kita menggunakan
map
.sumber
Ruby, 39
Perulangan hingga elemen dalam daftar adalah bilangan bulat.
Karena memanggil Integer.map memberikan pengecualian,
ia pergi ke bagian penyelamatan, yang "muncul / geser" elemen 1 dari daftar ke-2.
Regex soln ... sedikit lebih lama:
Cobalah dengan beberapa test case
sumber
CJam,
43 37 3533 byteYang ini adalah konversi langsung dari jawaban JS saya . Agak panjang, sebagian besar diambil oleh deteksi tipe.
Mengambil dua array input pada dua baris seperti STDIN
dan output ke STDOUT suka
Cobalah online di sini
sumber
Haskell,
113104 bytes (86 + 18 dari deklarasi tipe data)Haskell tidak memiliki datatype array bawaan, jadi saya harus roll sendiri. Untuk alasan ini, program hanya berisi pencocokan pola dan rekursi struktural eksplisit. Kasing tes terakhir berbunyi
dan mengevaluasi ke
sumber
Mathematica, 41 byte
Ini adalah fungsi tanpa nama yang mengambil struktur sebagai argumen pertama dan daftar nilai sebagai argumen kedua (dan mengembalikan daftar).
Ini adalah versi golf dari jawaban yang diterima pada pertanyaan yang menginspirasi tantangan ini. Saya memposting ini sendiri, dan tidak akan menerima jawaban ini (haruskah itu benar-benar tetap terpendek, yang saya ragu). Ini untuk mencegah orang lain dari memenangkan tantangan dengan menyalin jawaban pada dasarnya.
Bagaimana itu bekerja:
Listable
fungsi murni. Fungsi yang dapat didaftarkan secara otomatis diterapkan pada elemen argumen daftar (secara rekursif) alih-alih daftar itu sendiri, sehingga memanggilf
daftar terstruktur pada dasarnya akan mengembalikan daftar struktur yang sama dengan setiap bilangan bulati
diganti olehf[i]
.m
dan penghitung dii
.f
(terlepas dari argumennya), kami mengembalikan elemen berikutnyam
.sumber
Rebol -
87 6660Tidak Disatukan:
Contoh:
sumber
C #,
225 + 13 = 239185 + 35 = 220172 + 35 = 207 byteMembutuhkan ini:
Terima
object[]
s sebagai argumen.Kode tidak dikunci:
sumber
using o=System.Object
dan mengganti semua contohobject
dengan sederhanao
. msdn.microsoft.com/en-us/library/sf0df423.aspxClone
dangkal. Jika modifikasi input diperbolehkan, Anda tidak perlu mengkloning sama sekali. Jika tidak diizinkan, Anda perlu kloning yang tepat.Python 2, 64 byte
Saya mendengar Anda suka daftar di daftar jadi saya menempatkan fungsi dalam fungsi.
Sunting: Melihat jawaban grc sekarang saya menyadari bahwa itu sama sekali tidak perlu. Baiklah...
sumber
SWI-Prolog 82
Contoh dijalankan:
Yang terakhir
[]
dalam kueri adalah untuk memeriksa jumlah elemen yang tidak cocok, yang tampaknya tidak diperlukan dalam pertanyaan ini.sumber
is_list
) diperlukan?Erlang,
11693 BytesMenggunakan dua fungsi tidak murni
f
dang
.f
memanipulasi kamus proses dengan mengaturn
ke daftar datar dan memetakan setiap elemen dari daftar bersarangg(X)
.g
kemudian aturn
ke ekor daftar datar setiap kali menemukan nilai non-daftar dan mengembalikan kepala daftar datar.sumber
Perl 5, 49 byte
Argumen pertama adalah struktur template, kedua adalah nilai-nilai.
Program Tes
sumber
Powershell: 115
array input adalah $ i, pemetaan adalah $ m, output adalah $ o
$ h adalah sebuah string yang berisi fungsi rekursif, dan Anda dapat mengeksekusi kode yang terkandung dalam sebuah string dengan. $ h ... Dan itu akan menjadi 30 byte lebih pendek jika PowerShell tidak bersikeras meratakan array nilai tunggal untuk skalar, dan sebuah array dengan nilai nol tunggal ke nol
dan penampil struktur array yang berguna untuk memverifikasi hasil
sunting: 149
simpan sebagai unflatten.ps1:
edit: 136, pembuatan array inline output dan write-output
panggil dengan. \ unflatten.ps1 [array input] [array pemetaan]
output ditulis ke pipeline- jadi jalankan ini terlebih dahulu:
dan jalankan dengan
sumber
C #, (40 + 123) = 163 byte OR (67 + 81) = 148 byte
C # menderita pengetikan statis dan ruang nama yang panjang di sini.
Metode array
Menggunakan pernyataan:
Kode:
Metode tumpukan (menggunakan struktur tumpukan bukannya array)
Menggunakan pernyataan:
Kode:
Upaya pertama, kode golf pertama di sini.
sumber