Tugas ini adalah bagian dari Push Puzzle Pemrograman Premier Periodik Pertama .
Anda mendapatkan hierarki item dalam format berikut:
2
Hat
1
Gloves
yang perlu dimasukkan ke dalam kotak, seperti:
.------------.
| Hat |
| .--------. |
| | Gloves | |
| '--------' |
'------------'
Dalam format input angka mulai kotak dengan item sebanyak yang ditentukan angka. Kotak pertama memiliki dua item di dalamnya (Topi dan kotak yang berisi Sarung Tangan), yang kedua hanya berisi satu barang - sarung tangan.
Seperti yang bisa dilihat, kotak bisa hidup di dalam kotak juga. Dan mereka selalu bulat ... semacam (sudut runcing adalah bahaya luka dan kami tidak ingin itu).
Di bawah ini ada detail jahat bagi mereka yang ingin memanfaatkan setiap sedikit kelonggaran memberikan spesifikasi. Pikiran Anda, tidak membaca spesifikasi bukan alasan untuk mengirimkan solusi yang salah. Ada skrip uji dan beberapa uji kasus di bagian paling akhir.
Spesifikasi
Kotak dibangun dari karakter berikut:
|
(U + 007C) digunakan untuk membangun tepi vertikal.-
(U + 002D) digunakan untuk membangun tepi horizontal.'
(U + 0027) adalah sudut-sudut bawah bulat..
(U + 002E) adalah sudut atas bulat.
Karenanya sebuah kotak terlihat seperti ini:
.--. | | '--'
Perhatikan bahwa sementara Unicode juga memiliki sudut bulat dan karakter menggambar kotak yang tepat, tugas ini hanya ada di ASCII. Seperti halnya saya mencintai Unicode, saya menyadari bahwa ada bahasa dan lingkungan di luar sana yang tidak tiba pada dekade kedua hingga terakhir.
Kotak dapat berisi urutan item yang berupa teks atau item lainnya. Masing-masing item dalam kotak dirender dari atas ke bawah. Urutan A, B, C dengan demikian menerjemahkan sebagai berikut:
.---. | A | | B | | C | '---'
Ini tentu saja berlaku untuk kotak bersarang juga, yang merupakan item seperti teks. Jadi urutan A, B, Kotak (C, Kotak (D, E)), F akan merender sebagai berikut:
.-----------. | A | | B | | .-------. | | | C | | | | .---. | | | | | D | | | | | | E | | | | | '---' | | | '-------' | | F | '-----------'
Kotak menyesuaikan ukurannya dengan konten dan kotak bersarang selalu melampaui ukuran induknya. Selalu ada spasi sebelum dan sesudah konten, sehingga baik teks maupun kotak bersarang tidak terlalu dekat dengan tepi kotak luar. Singkatnya, yang berikut ini salah:
.---. |Box| '---'
Dan yang berikut ini benar:
.-----. | Box | '-----'
Terlihat jauh lebih baik, juga :-)
Item teks (lihat Input di bawah) harus direproduksi dengan tepat.
Selalu ada satu kotak tingkat atas (lih. XML). Namun, satu kotak dapat berisi beberapa kotak lainnya.
Memasukkan
Input diberikan pada input standar; untuk pengujian yang lebih mudah, kemungkinan dialihkan dari file.
Input diberikan berdasarkan garis, dengan setiap baris mewakili item teks untuk dimasukkan ke dalam kotak saat ini atau membuka kotak baru.
Setiap baris diakhiri oleh satu baris.
Item teks ditandai oleh garis yang tidak terdiri dari angka (lihat di bawah). Teks menggunakan karakter alfabet, spasi, dan tanda baca (
.,-'"?!()
). Teks tidak akan memulai atau berakhir dengan spasi dan akan selalu memiliki setidaknya satu karakter.Sebuah kotak dimulai dengan satu baris dengan angka di dalamnya. Nomor tersebut memberitahu ukuran kotak, yaitu jumlah item berikut yang dimasukkan ke dalamnya:
2 A B
menghasilkan kotak dengan dua item teks:
.---. | A | | B | '---'
Sebuah kotak akan selalu mengandung setidaknya satu item.
Akhir kotak tidak ditandai secara eksplisit dengan garis; sebagai gantinya kotak ditutup secara implisit setelah jumlah item yang ditentukan dimasukkan ke dalamnya.
Sebuah kotak selalu hanya satu item, terlepas dari berapa banyak item di dalamnya. Misalnya
3 A 4 a b c d B
akan menghasilkan kotak dengan tiga item, yang kedua adalah kotak lain dengan empat item.
Bersarang juga tidak memengaruhi fakta bahwa sebuah kotak hanyalah satu item.
Batas
Level bersarang maksimum adalah lima . Yaitu ada paling banyak lima kotak di dalam satu sama lain. Ini termasuk yang paling luar.
Maksimal sepuluh item per kotak.
Item teks memiliki panjang maksimal 100 karakter.
Keluaran
- Output adalah kotak yang diberikan termasuk semua item yang mengandung dan bersarang sesuai dengan aturan yang diuraikan di atas.
- Keluaran harus diberikan pada keluaran standar dan harus sama persis. Tidak ada spasi putih terdepan atau tambahan yang dibolehkan.
- Setiap baris harus diakhiri dengan satu baris, termasuk yang terakhir.
Kondisi menang
- Kode terpendek menang (yaitu mendapat jawaban yang diterima).
Masukan sampel 1
3
This is some text!
Oh, more text?
Just text for now, as this is a trivial example.
Output sampel 1
.--------------------------------------------------.
| This is some text! |
| Oh, more text? |
| Just text for now, as this is a trivial example. |
'--------------------------------------------------'
Masukan sampel 2
4
Extreme
nesting
3
of
boxes
4
might
lead
to
2
interesting
1
visuals.
Indeed!
Output sampel 2
.--------------------------.
| Extreme |
| nesting |
| .----------------------. |
| | of | |
| | boxes | |
| | .------------------. | |
| | | might | | |
| | | lead | | |
| | | to | | |
| | | .--------------. | | |
| | | | interesting | | | |
| | | | .----------. | | | |
| | | | | visuals. | | | | |
| | | | '----------' | | | |
| | | '--------------' | | |
| | '------------------' | |
| '----------------------' |
| Indeed! |
'--------------------------'
Masukan sampel 3
1
1
1
1
1
Extreme nesting Part Two
Keluaran sampel 3
.------------------------------------------.
| .--------------------------------------. |
| | .----------------------------------. | |
| | | .------------------------------. | | |
| | | | .--------------------------. | | | |
| | | | | Extreme nesting Part Two | | | | |
| | | | '--------------------------' | | | |
| | | '------------------------------' | | |
| | '----------------------------------' | |
| '--------------------------------------' |
'------------------------------------------'
Masukan sampel 4
3
Foo
2
Bar
Baz
2
Gak
1
Another foo?
Keluaran sampel 4
.----------------------.
| Foo |
| .------------------. |
| | Bar | |
| | Baz | |
| '------------------' |
| .------------------. |
| | Gak | |
| | .--------------. | |
| | | Another foo? | | |
| | '--------------' | |
| '------------------' |
'----------------------'
Skrip Tes
Karena mendapatkan perincian yang tepat terkadang sulit pada saat kami ( Ventero dan saya) telah menyiapkan skrip pengujian, Anda dapat menjalankan solusi dengan memeriksa apakah benar. Ini tersedia sebagai skrip PowerShell dan skrip bash . Doa adalah: <test-script> <program invocation>
.
PEMBARUAN: Skrip pengujian telah diperbarui; ada sejumlah kasus uji yang tidak memenuhi batas yang saya tentukan. Skrip uji PowerShell tidak menggunakan perbandingan case-sensitive untuk memeriksa hasilnya. Saya harap semuanya baik-baik saja sekarang. Jumlah kasus uji dikurangi menjadi 156, meskipun yang terakhir sekarang cukup ... besar.
UPDATE 2: Saya mengunggah generator case-test saya . Ditulis dalam C # , menargetkan runtime .NET 2. Ini berjalan pada Mono. Ini dapat membantu orang untuk menguji implementasi mereka. Sebagai kasus terburuk yang pasti diberikan batasan dalam tugas yang dapat Anda coba:
nb.exe 1 10 10 5 100 100 | my invocation
yang hanya akan menghasilkan kotak hingga tingkat terdalam dan memanfaatkan jumlah item maksimum per kotak dan panjang maksimum item teks. Saya tidak memasukkan test case ini ke dalam skrip uji, karena ini cukup besar dan hasilnya lebih besar.
UPDATE 3: Saya memperbarui skrip uji PowerShell yang cenderung melempar kesalahan tergantung pada bagaimana ujung baris ada di skrip dan baris apa yang berakhir dengan solusi yang dicetak. Sekarang harus agnostik untuk keduanya. Maaf lagi atas kebingungannya.
Jawaban:
GolfScript, 125 karakter
Menggunakan pendekatan serupa sebagai solusi Keith .
sumber
Python, 204 karakter
P
mengembalikan daftar tiga kali lipat, masing-masing merupakan awalan baris / akhiran (akhiran kebalikan dari awalan), beberapa teks baris, dan karakter baris mengisi. Setelah menghitung semua tiga kali lipat, mereka dicetak menggunakan jumlah karakter isi yang tepat untuk membuat semua garis sama panjang.Versi tidak disatukan:
sumber
P
itu.Ruby 1.9, 174 karakter
Agak mirip dengan solusi Keith .
sumber
APL (78)
sumber
Python -
355314259 karaktersumber
Ruby 1.9,
229228226223222sumber
C,
390366363 karakterKompilasi dengan
gcc -std=gnu99 -w file.c
Bahkan tidak dekat dengan versi Keith, tapi hei, itu bagus ol 'C
sumber
160/160 passed
(maksud saya serangkaian 100 karakter, yang toh tidak ada)FreeBSD 8.2-RELEASE #5: Sun Feb 27 10:40:25 CET 2011
dengangcc version 4.2.1 20070719 [FreeBSD]
pada x64 di sini. Saya akan mengambil kata-kata Anda untuk 160, lalu :-). Dan seharusnya ada test case dengan 100 karakter, sebenarnya (Tes 143-147).python sangat fungsional, 460 karakter
sumber
|
karakter tidak diberi spasi dengan benar. Ini sangat mirip dengan solusi python sayaHaskell, 297 karakter
Saat bermain golf, metodenya cukup lurus ke depan. Hanya batas memori yang tersedia.
sumber
C # -
1005 859 852782 karakterSaya perlu melihat ini lagi karena saya yakin ini bisa diperbaiki, tapi ini adalah langkah ketiga saya yang
pertama.Tidak Digolkan:
sumber
var a = 1, b = 2, c = 3;
. Tidak bisakah kamu melakukan hal yang sama dalam C?var
pernyataan implisit seperti itu. Anda hanya dapat menggabungkan jika mereka memiliki tipe eksplisit seperti Joey disebutkan menggunakanstring b="",e=""
.PHP,
403388306 karakterTidak Disatukan:
Saya meminjam ide awalan dari Keith (apakah itu diizinkan sama sekali?), Kalau tidak, ini hampir sama dengan aslinya. Masih belum bisa di bawah 300. Terjebak dengan ini. Dan seterusnya.
sumber
PHP,
806769721653619 karakterVersi tidak disatukan:
sumber
<?
pada awalnya untuk menjalankan. Maka Anda tampaknya menggunakan panjang maksimum semua item teks dalam kotak uji sebagai lebar untuk kotak paling dalam. Kode ini hanya melewati 118 kasus uji (diuji di Linux dan FreeBSD). Saya tidak tahu apa yang Anda lakukan pada skrip PowerShell yang tidak akan berjalan, meskipun :-(. Memanggilnya sepertipowershell -noprofile -file test.ps1 php boxes.php
seharusnya bekerja, sebenarnya. Tapi saya tidak punya PHP untuk diuji pada mesin Windows saya.Java -
681668 karakterdasarnya metode yang sama dengan kode Python Keith Randall
Versi tidak disatukan:
sumber
throws
.break;
)char
perbandingan dengan melihat kode ascii lebih lama ... tetapi saya harus bersiap-siap untuk liburanPerl -
200199 karakterAlgoritma yang sama dengan Python Keith Randall (desain yang bagus, Keith), tetapi sedikit lebih ringkas dalam Perl ini.
sumber
$_@_@_
Sepertinya seseorang mengejar tanda dolarF # - 341 karakter
Versi F # dari solusi Keith. Daftar tidak dapat diubah secara default, jadi versi ini memasukkan seluruh fungsi rekursif ke dalam daftar, mengembalikan daftar, dari mana item diekstraksi menggunakan
for..do
loop dan ayield!
. Saya tidak bisa menemukan cara untuk membalikkan awalan secara ringkas, jadi saya hanya menempelkan suffix ke triples.FYI, metode TryParse mengembalikan ganda
(bool,int)
.sumber
Clojure - 480 karakter
Ini adalah program Clojure pertama saya serta upaya golf Clojure pertama saya, jadi, tak perlu dikatakan, ini tidak boleh dianggap sebagai perwakilan dari solusi Clojure secara umum. Saya yakin itu bisa diperpendek secara signifikan, terutama jika metode parsing dan membangun kotak Keith Randall diimplementasikan sekaligus.
sumber
C # -
472 470 426 422398 karaktersumber
goto
! Ngomong-ngomong, Anda bisa menghilangkan tanda kurung di sekitar argumen lambdaz
danv
, membawanya ke 421.Scala - 475 karakter
sumber
C #
1198 1156 1142 689 671634 Karaktersumber
\n
tampaknya cukup pada akhirnya.Pip , 89 byte (tidak bersaing)
(Bahasa lebih baru daripada tantangan. Juga, saya tidak bisa cukup mengungguli APL.)
Kode adalah 87 byte, +2 untuk
-rn
bendera.Cobalah online!
Fungsi
z
memproses item pertama dari daftar input (g
, disalin ke variabel globali
agar tersedia di dalam panggilan fungsi). Jika ini adalah angka n , ia menyebut dirinya secara berulang n kali, menyambungkan daftar garis yang dihasilkan ke sebuah persegi panjang penuh, membungkus setiap baris"| " " |"
, dan menambahkan.---.
dan'---'
baris sebelum mengembalikan daftar baru. Jika ini adalah string, itu hanya mengubahnya menjadi daftar satu item dan mengembalikannya. Hasil akhir dicetak dipisahkan baris-baru (-n
bendera). Detail lebih lanjut tersedia berdasarkan permintaan.sumber
Java (1369 karakter termasuk EOL)
Tidak dapat meninggalkan ini tanpa implementasi Java. Java seharusnya lebih bertele-tele daripada slice Python dan Ruby, jadi saya mencari solusi rekursif yang elegan.
Idenya adalah Pohon (Grafik) objek (string dan kotak), berisi satu sama lain mulai dari kotak "kepala". Saat Anda mem-parsing file input secara linear, Anda menambahkan string dan kotak ke kotak "saat ini" dan saat Anda menambahkan panjang maksimum wadah disesuaikan. Ketika sebuah kontainer mencapai jumlah item yang telah ditentukan yang dapat menahan Anda mundur ke kontainer sebelumnya. Di akhir file input, Anda memiliki wadah "head" yang sudah memiliki "maxLength" yang dihitung, jadi Anda cukup memanggil metode print ().
Benar-benar solusi yang menyenangkan untuk menulis. Saya sangat menyukai pertanyaan itu. Seperti yang saya sebutkan sebelumnya, saya mencari solusi keanggunan bukan pendekatan minimalis, sayangnya Java tidak memiliki cetakan Python "-" * 4 untuk menghasilkan "----" :-)
Ini versi yang tidak dikoleksi:
sumber