Di APL, Anda dapat menulis fungsi diam-diam, yang disebut kereta . Cara mereka bekerja tidak relevan untuk tantangan ini. Berikut adalah berbagai cara mereka dapat dikelompokkan, menggunakan ⍴
fungsinya:
⍴ -> ⍴
⍴⍴ -> ⍴⍴
⍴⍴⍴ -> ⍴⍴⍴
⍴⍴⍴⍴ -> ⍴(⍴⍴⍴)
⍴⍴⍴⍴⍴ -> ⍴⍴(⍴⍴⍴)
⍴⍴⍴⍴⍴⍴ -> ⍴(⍴⍴(⍴⍴⍴))
...
Urutannya tetap sama. Prosedurnya adalah selama ada lebih dari 3 fungsi, 3 fungsi terakhir dikelompokkan menjadi satu fungsi. Jika kita bertemu kereta bersarang, kita kurung itu terlebih dahulu, sebelum melanjutkan. Berikut adalah prosedur yang diterapkan untuk ⍴⍴⍴⍴⍴⍴
:
Step 0: ⍴⍴⍴⍴⍴⍴
There are strictly more than 3 functions, repeat.
Step 1: ⍴⍴⍴(⍴⍴⍴)
There are strictly more than 3 functions, repeat.
Step 2: ⍴(⍴⍴(⍴⍴⍴))
There are 3 or less functions, we're done.
Berikut adalah prosedur yang sama diterapkan untuk ⍴⍴⍴(⍴⍴)⍴(⍴⍴⍴⍴(⍴⍴⍴))⍴⍴
:
Step 0: ⍴⍴⍴(⍴⍴)⍴(⍴⍴⍴⍴(⍴⍴⍴))⍴⍴
There are strictly more than 3 functions, repeat.
We have met a nested train, applying procedure to that first:
Step 0: ⍴⍴⍴⍴(⍴⍴⍴)
There are strictly more than 3 functions, repeat.
We have met a nested train, applying procedure to that first:
Step 0: ⍴⍴⍴
There are 3 or less functions, we're done.
Step 1: ⍴⍴(⍴⍴(⍴⍴⍴))
There are 3 or less functions, we're done.
Step 1: ⍴⍴⍴(⍴⍴)⍴((⍴⍴(⍴⍴(⍴⍴⍴)))⍴⍴)
There are strictly more than 3 functions, repeat.
We have met a nested train, applying procedure to that first:
Step 0: ⍴⍴
There are 3 or less functions, we're done.
Step 2: ⍴⍴⍴((⍴⍴)⍴((⍴⍴(⍴⍴(⍴⍴⍴)))⍴⍴))
There are strictly more than 3 functions, repeat.
Step 3: ⍴(⍴⍴((⍴⍴)⍴((⍴⍴(⍴⍴(⍴⍴⍴)))⍴⍴)))
There are 3 functions or less, we're done.
Memasukkan
Untuk tantangan ini, input akan disederhanakan. Ini artinya Anda dapat memilih 2 karakter berbeda untuk membuka dan menutup tanda kurung dan 1 karakter untuk fungsi, berbeda dari yang dipilih untuk tanda kurung. Karakter yang Anda pilih harus konsisten. Input tidak akan kosong, dan tidak akan mengandung tanda kurung tanpa konten (yaitu ()
).
Keluaran
Sekali lagi, Anda dapat memilih 3 karakter yang berbeda, 2 untuk tanda kurung dan 1 untuk fungsi. Perhatikan bahwa mereka tidak harus sama dengan yang dipilih untuk input, tetapi mereka harus konsisten.
Aturan
- Jika ada tanda kurung yang hanya menyertakan satu fungsi di dalamnya dalam input, Anda harus menghapusnya di output. Output Anda mungkin tidak mengandung tanda kurung yang tidak dibutuhkan (yaitu, hanya melampirkan satu fungsi, atau melampirkan seluruh output).
- Anda tidak perlu menerapkan algoritme yang digunakan di sini, selama solusi Anda valid untuk tantangan ini.
- Input dan output adalah string dalam format yang dijelaskan di bagian Input dan Output. Input akan memiliki setidaknya satu karakter.
- Dilarang menggunakan celah standar .
- Ini kode-golf , jadi jawaban tersingkat menang. Namun, tidak akan ada jawaban yang diterima, karena ini adalah kompetisi per-bahasa, dan untuk mendorong penjawab dalam bahasa-bahasa di mana tugas ini akan menghasilkan kode yang lebih panjang dibandingkan dengan kode yang ditulis dalam bahasa lain.
Uji kasus
Karakter yang digunakan di sini adalah ()⍴
, Anda harus menggantinya dengan karakter yang Anda pilih.
⍴ -> ⍴
⍴ -> ⍴
⍴⍴ -> ⍴⍴
⍴⍴⍴ -> ⍴⍴⍴
⍴⍴⍴⍴ -> ⍴(⍴⍴⍴)
⍴⍴⍴⍴⍴⍴⍴⍴⍴⍴⍴⍴⍴⍴⍴ -> ⍴⍴(⍴⍴(⍴⍴(⍴⍴(⍴⍴(⍴⍴(⍴⍴⍴))))))
⍴⍴⍴⍴⍴(⍴⍴⍴)⍴⍴(⍴(⍴⍴⍴)⍴⍴⍴)⍴⍴⍴ -> ⍴(⍴⍴(⍴⍴((⍴⍴⍴)⍴(⍴(⍴(⍴⍴⍴)(⍴⍴⍴))(⍴⍴⍴)))))
(⍴⍴⍴)(⍴⍴⍴)(⍴⍴⍴) -> (⍴⍴⍴)(⍴⍴⍴)(⍴⍴⍴)
(⍴⍴⍴)(⍴⍴⍴)⍴⍴⍴ -> (⍴⍴⍴)(⍴⍴⍴)(⍴⍴⍴)
⍴⍴(⍴)⍴⍴ -> ⍴⍴(⍴⍴⍴)
((⍴⍴)) -> ⍴⍴
⍴⍴((⍴⍴))⍴⍴ -> ⍴⍴((⍴⍴)⍴⍴)
Tantangan ini telah diposting di Sandbox. Jika Anda memiliki hak istimewa yang diperlukan, Anda dapat melihat posting sandbox di sini .
sumber
Jawaban:
APL (Dyalog Classic) ,
71686563 byteCobalah online!
Karakter saya memilih untuk I / O yang
'('
,')'
, dan'⍬'
.Solusi ini sendiri merupakan kereta APL.
⍎
mem-parsing input seolah-olah itu array bersarang - pohon dengan vektor numerik kosong (⍬
) sebagai daun.The dfn (yaitu lambda -
{ }
) melintasi pohon secara rekursif dan mengubahnya menjadi string dengan tanda kurung yang benar. Argumen kiri⍺
mengontrol apakah tanda kurung harus ditambahkan ke level saat ini jika perlu.DFN menangani kasus-kasus berikut berdasarkan argumen yang benar:
jika sudah berupa string (
⍵≡⍕⍵
), kembalikanjika itu
⍬
, kembalikan char'⍬'
jika itu singleton, gali lebih dalam (
∇
adalah simbol untuk panggilan rekursif)jika panjangnya ≤3, kambuh untuk masing-masing item dan mengelilinginya
()
jika perlujika tidak, rekur ulang untuk 3-tail, tambahkan semua kecuali 3-tail, dan rekur ulang lagi
sumber
Python 2 ,
224208204 byte-16 byte terima kasih kepada Tn. Xcoder -4 byte terima kasih kepada ovs
Cobalah online! atau Coba semua test case
Kode dapat dibagi dalam 3 langkah utama:
Mengubah input menjadi daftar bersarang dan mengganti
(p)->p
. Fungsi tunggalp
akan diganti oleh daftar kosong.Fungsi rekursif untuk menerapkan aturan "3 atau kurang" pada daftar saat ini dan menyebut dirinya di semua-sublists.
Banyak pengganti untuk memformat ke format output yang diinginkan
sumber
((pp))
(ataup((pp))p
).CJam , 56 byte
Mengalahkan APL!
Cobalah online!
Ini bekerja (saya pikir) dan saya tidak tahu mengapa ...
Karakter input adalah
][T
untuk()⍴
, dan karakter output adalah][0
untuk()⍴
(ya, ini berarti mereka terbalik dari apa yang Anda harapkan; misalnya, Anda mungkin masukTTT]TT[T]TTTT]TTT[[TT
).Tinjauan Tingkat Tinggi
Program bekerja dengan input mundur, karena lebih nyaman. Untuk mem-parsing input, kami memanfaatkan parser CJam - membalikkan dan mengeksekusi input memberikan bentuk input parsing (mundur).
Kami kemudian mendefinisikan prosedur
K
.K
melakukan sebagian besar pekerjaan untuk pengiriman kami, dan berfungsi sebagai berikut:K
kepada mereka. Hasilnya harus berupa array lain, dan jika array ini hanya terdiri dari satu elemen saja, bongkar itu (ini menghilangkan tanda kurung yang berlebihan).Dengan menerapkan
K
pada input, kita mendapatkan bentuk input yang dipasangkan dengan benar (satu-satunya hal yang perlu diperhatikan adalah bahwa kita benar-benar membungkus input dalam daftar tunggal dan membukanya setelah itu; alasan untuk ini adalah bahwa kita ingin potongan yang membongkar singletons untuk diterapkan pada program tingkat atas, dan bukan hanya sub-arraynya). Setelah itu, kami hanya menerapkan beberapa pemformatan minimal untuk mendapatkan hasil kami.Beberapa penjelasan untuk bit golf
Golf yang paling saya banggakan gunakan
,
untuk melakukan pemeriksaan antara bilangan bulat dan array.,
menghasilkan kisaran [0..n) . Karena satu-satunya bilangan bulat yang akan kita temui adalah0
, ini selalu memberi kita daftar kosong[]
, yaitu falsey.,
perlu panjangnya. Karena semua array yang kita temui akan kosong, ini selalu memberi kita bilangan bulat positif, yang benar.Golf lain yang mungkin menarik adalah metode yang saya gunakan untuk mengelompokkan tiga elemen pertama dari array; itu agak mirip dengan kiriman saya "Turing golf interpreter code language lengkap" . CJam tidak memiliki cara pendek untuk memecah array menjadi dua bagian (Anda dapat mencoba mengiris bagian pertama dan kemudian bagian lainnya sambil mempertahankan array asli dan indeks pada tumpukan, tetapi itu tidak berfungsi dengan baik) , jadi yang saya lakukan adalah menggunakan
3/
, yang mengelompokkan array menjadi blok 3. Saya kemudian dapat menghapus elemen pertama(
, membungkus array dua kaliaa
, dan kemudian menambahkan kembali ke awal daftar\+
. Alasan kita membungkus array dua kali adalah kita harus melepas sebuah layer dengan:~
, karena kita baru saja mengelompokkan array yang lain menjadi beberapa bagian juga.sumber
JavaScript (ES6),
149146 bytePenggunaannya
()p
, meskipun Anda menggunakan huruf yang berbeda, Anda bisa mengubahp
bagian akhir.sumber