Alice adalah pekerja magang di perusahaan yang menggunakan Brainfuck sebagai bahasa utama untuk pengembangan sisi klien dan server. Alice baru saja menulis kode pertamanya dan dia sedikit gugup saat dia bersiap-siap untuk tinjauan kode pertamanya.
Alice ingin membuat kodenya diformat dengan benar dan terlihat bagus, tetapi dia tidak punya waktu untuk membaca panduan gaya kode perusahaan setebal 328 halaman, jadi dia memutuskan untuk memformatnya sebagai kotak yang sempurna . Sayangnya, panjang kode mungkin tidak cukup untuk membentuk persegi, jadi dia memutuskan untuk meninggalkan celah persegi di tengah. Kesenjangan harus dipusatkan dengan sempurna dan sedekat mungkin dengan kotak .
Contohnya
++++++ +++++ +++++ +++++ +++++ +++++
++++++ +++++ +++++ + ++ ++ ++ +++++
++++++ ++ ++ + + + ++ + +
++++++ +++++ +++++ +++++ ++ ++ +++++
++++++ +++++ +++++ +++++ +++++ +++++
Perfect OK Acceptable Unacceptable No way! Nope.
Tulis program atau fungsi untuk membantu Alice. Diberikan kode Alice sebagai string input, output kode diformat dengan benar seperti yang dijelaskan di bawah jika memungkinkan. Jika memformat tidak mungkin, keluarkan emoji menangis :~(
.
Ini adalah kode-golf sehingga jawaban diberi skor dalam byte dengan tujuan lebih sedikit.
Kendala
- Program atau fungsi Anda harus mengambil string tunggal sebagai input dan output satu atau lebih baris teks (atau mengembalikan string multi-baris atau array string, jika Anda mengimplementasikan suatu fungsi).
- String input dapat berisi karakter ASCII termasuk spasi putih.
- Semua spasi putih dalam input harus diabaikan. Mereka tidak harus menghitung panjang kode dan mereka tidak boleh digunakan dalam output.
- String input berisi setidaknya satu karakter non-spasi putih.
- Kode yang diformat harus memiliki karakter bukan spasi yang sama dalam urutan yang sama seperti dalam kode input.
- Kode yang diformat harus berupa kuadrat sempurna, yaitu semua garis harus memiliki panjang yang sama, dan jumlah garis harus sama dengan panjang garis.
- Kode yang diformat mungkin mengandung celah di tengah.
- Hanya karakter spasi (kode ASCII 32) yang dapat digunakan dalam jeda.
- Celah (jika ada) harus persegi panjang.
- Setiap baris kode yang diformat harus mengandung setidaknya satu karakter non-spasi, yaitu lebar celah harus benar-benar kurang dari lebar kuadrat (celah 5x1 tidak dapat diterima untuk 5x5 kuadrat).
- Celah harus horisontal, yaitu lebar celah harus lebih besar atau sama dengan tinggi celah.
- Celah harus terpusat sempurna.
- Konsekuensinya, lebar celah dan paritas tinggi harus sama dengan paritas lebar persegi (misalnya untuk 5x5, celah persegi bisa 1x1, 3x1, atau 3x3).
- Jika memungkinkan, kuadrat keluaran tanpa celah sama sekali.
- Dalam hal beberapa solusi, pilih satu dengan gap yang paling dekat dengan kuadrat, yaitu perbedaan antara lebar celah dan tinggi celah minimal (misalnya: gap 10x10 lebih disukai daripada 8x6, dan 8x6 lebih disukai daripada 6x2).
- Jika masih ada seri, pilih solusi dengan area gap minimal (misalnya gap 2x2 lebih disukai daripada 4x4).
- Jika tidak mungkin memformat kode sama sekali, output
:~(
. - Baris baru setelah baris terakhir adalah opsional.
- [Baru] Anda dapat dengan aman berasumsi bahwa karakter apa pun dengan kode di bawah 33 adalah spasi. Saya harap ini akan membantu Anda untuk bermain golf.
Tes
Input Output Code length Comment
+++++++++ +++ 9 Alice is lucky,
+++ her code perfectly fits a square.
+++
++++++++ +++ 8 Though code length isn't enough for a square,
+ + a small gap fixes it.
+++
++++++ :~( 6 No luck, code cannot be formatted.
Hello, Hell 12 Input may contain any ASCII characters,
World! o , but whitespaces in input should be ignored.
W o
rld!
+++++ + +++++ +++++ 22 Gap is not required to be a square,
+++++ + +++++ +++++ it can be a rectangle.
+ +
+++++
+++++
+++ + +++ ++++++++ 28 There exists another solution:
+++ + +++ + + 6x6 square with 4x2 gap,
+++ + +++ + + but in Alice's opinion square gap
+++ + +++ + + makes code more readable.
+ +
+ +
+ +
++++++++
Tes rumit
This must be Thism 24 7x7 with 5x5 gap looks good,
5x5 with 1x1 ustbe but 5x5 with 1x1 gap is better,
gap. 5x 5w because gap area is smaller.
ith1x
1gap.
+++ +++ +++ :~( 18 In case you tried 5x5 square
+++ +++ +++ with 7x1 gap ;)
Sumber daya
Untuk menghemat ruang, Anda dapat menemukan kode sampel dan kasus uji tambahan di tio.run
[Baru] Anda dapat melihat tabel solusi yang diterima untuk input hingga 100 karakter . Saya menukar lebar dan tinggi karena sepertinya terlihat lebih intuitif.
Terinspirasi oleh: Seperempat teks
Perubahan
Menambahkan 2 tes, memperbaiki bug dalam kode sampel.
Menambahkan tabel solusi hingga 100, menambahkan klarifikasi ruang-putih.
Jawaban:
C (gcc) , 354 byte
Cobalah online!
sumber
isspace(x)
denganx<33
.JavaScript (ES6),
284 ... 274270 byteDisimpan 4 byte berkat @Shaggy
Mengembalikan array string.
Cobalah online!
sumber
This must be 5x5 with 1x1 gap.
(24 karakter)[\s\n]
begitu\s
?++w>x-2
w++>=x-2
w++>=x
\s
Stax , 80 byte
Jalankan dan debug itu
Bagaimana cara kerjanya?
Membongkar, tidak diserang, dan berkomentar sepertinya ini.
Jalankan yang ini
sumber
Arang , 120 byte
Cobalah online!Tautan adalah untuk mengucapkan versi kode. Penjelasan:
Lepaskan spasi dari input, lalu balikkan dan pisahkan menjadi karakter, sehingga kita dapat mengulangi karakter dengan lebih mudah nanti.
Mulai dengan ukuran nol, yang menunjukkan tidak ada hasil yang ditemukan (belum).
Periksa semua panjang sisi hingga panjang tali. (Melempar divisi tentu saja akan membuat kode lebih cepat.)
Jika hasilnya ternyata kotak yang sempurna maka simpan ukuran kotak dan juga tetapkan itu sebagai ukuran batas.
Lingkarkan di atas ketinggian dan lebar batas yang mungkin (lebar batas tidak lebih besar dari tinggi batas, membuat tinggi celah tidak lebih besar dari lebar celah.)
Jika ukuran batas adalah panjang yang diinginkan dan kami belum memiliki solusi atau belum sebesar solusi ini, perbarui solusi dengan ukuran persegi dan batas ini.
Jika kita punya solusi ...
Gambarlah persegi panjang karakter sewenang-wenang dari ukuran persegi yang diberikan.
Jika batasnya cukup kecil untuk meninggalkan celah, maka hapus celah itu. (Perintah menggambar akan menggambar ke atas dan ke kiri untuk nilai negatif dan sama sekali tidak menyukai nilai nol.)
Ganti semua (sisa) karakter dengan karakter dari input.
Jika tidak, output
:~(
.sumber
Jelly ,
9185 byteCobalah online!
Tautan monadik yang menggunakan string input sebagai argumennya dan mengembalikan string baik dengan output yang diformat atau
:~(
.sumber
Python 2,
287281279 byteCobalah online!
Menggunakan perbandingan daftar leksikografis Python dengan menggunakan nilai yang sama untuk memilih solusi dan mencetaknya. Saya cukup yakin
1042 atau lebih byte masih bisa dicukur.Penjelasan
Hapus spasi putih dengan memisahkan dengan spasi putih dan bergabung dengan
""
, lalu konversikan input ke daftar untuk nanti. Juga inisialisasil
dengan panjang kode aktual danp
daftar kemungkinan yang valid.Lingkari semua kemungkinan ukuran celah dari
0*0
hinggal*l
. Hitung panjang tepi kotak denganl
karakter kode danx*y
spasi sebagais
.Periksa apakah kondisi berikut cocok:
s % 1 == 0
, yaitu kuadrat sempurna akan terbentukx < s-1 > y
, yaitux
dany
paling banyaks-2
dan muat di dalam kotaks % 2 == x % 2 == y % 2
, yaitu keduanyax
dany
cocok dengan paritas tepi dan dapat dipusatkanx < 1
, yaitux == 0
, abaikan semua kecuali persyaratan kuadrat yang sempurnaJika kondisinya cocok, tambahkan item berikut dalam tuple
p
untuk menemukan yang optimal:abs(x-y)/2
; pertama-tama temukan perbedaan minimalx
dany
untuk mendapatkan celah paling persegi. Ini selalu jadi kami membagi 2.int(s)
; selanjutnya temukan panjang sisi minimal. Karenas
merupakan bilangan bulat dan bertambah sebagai area gapx*y
, ini mengurutkan berdasarkan area gap.-x
; selanjutnya temukan lebar maksimal untuk memilih celah horisontal. Ini muncul setelah area karena bagaimana ia dikembangkan, tetapi area itu sama untukx*y
dany*x
jadi itu berfungsi.Jika kami menemukan tata letak yang valid, temukan tata letak yang optimal seperti dijelaskan di atas. Hitung batas horizontal
b
dan inisialisasi nomor barisY
ke 0.Jika nomor garis
Y
berada di dalam celah (batas vertikalb+d
, dengand
dari tuple), tambahkan nilai jarak lebar celah setelah batas horizontal masukc
. (Modifikasic
adalah mengapa kita membutuhkannya menjadi daftar.) Kemudian cetaklah garis bujur sangkar dan hapus daric
. Ulangis
kali, menambah nomor baris.Jika tidak ada tata letak yang ditemukan, gagal.
sumber
"some\ntext"
sebagai pembatas. (input()
mengevaluasi jalur input sebagai kode Python.) Jika ini tidak dapat diterima, beri tahu saya. Panjang 22 juga bekerja untuk saya.Pyth ,
9998 byteCobalah online!
Ini menggunakan algoritma yang sama dengan jawaban Python saya, tetapi banyak detail diubah secara signifikan menjadi lebih pendek di Pyth.
Pyth menunjukkan umurnya di sini, karena umurnya belum diperbarui dan hanya menggunakan karakter ASCII yang dapat dicetak (untuk kode, bukan data), menghabiskan banyak ruang.
Menariknya, jika Pyth menggunakan kemasan base-256 yang sama dengan Stax, program ini bisa ⌈98 log 256 95⌉ = 81 byte panjang, tepat di sebelah Stax (80 byte) dan Jelly (85 byte). Saya pikir ini dengan baik menunjukkan seberapa dekat bahasa golf bahkan dengan paradigma mereka yang sangat berbeda.
Penjelasan (hanya sedikit kurang terbaca dari kode)
#
membungkus segala sesuatu dalamwhile True:
yang menekan pesan dan berhenti karena kesalahan.JscQ)
c
hop masukan (Q
) di spasi putih,s
ums bagian bersama-sama dan menyimpan hasilnyaJ
.^UJ2
membuat daftar indeks (U
) dariJ
dan mengambil2
kekuatan Kartesius (^
), menghasilkan semua pasangan[h,w]
dengan0<=h<len(J)
dan0<=w<len(J)
.+L@+lJ*Fd
: untuk semua (L
) pasangan tersebutd
, tambahkan (+
) akar kuadrat (@
...2
) dari (l
ength ofJ
plus (+
) produk (*F
) dari pasangand
) ke sisi kiri pasangan, membuat triplet[side length, gap height, gap width]
.f!|%hT1&eT|t{%R2TgeStThT
:f
ilter untuk kembar tiga diT
mana!|
):hT
) modulo 1 (%
...1
) adalah nol&
):eT
) bukan nol|
):R
) modulo 2 (%
…2
), dengan duplikat ({
) dan unik pertama (t
) dihapus, adalah kosongeS
) tinggi celah dan lebar celah (tT
) adalahg
reater-atau-sama dengan panjang sisi (hT
)S
mengurutkan kembar tiga secara leksikografis (dengan panjang sisi, kemudian dengan tinggi celah).oaFtN
kemudiano
menaiki kembar tiga oleha
perbedaan bsolute antara tinggi celah dan lebar celah (tN
).Pada titik ini, jika kami tidak memiliki solusi yang valid,
|
evaluasi argumen keduanya\n":~("
, yang mencetak dan mengembalikan:~(
.h
mengambil solusi optimal (atau":"
jika tidak ada) dan disimpan dalamK
. Kemudianh
mengambil sisi panjangnya (atau":"
jika tidak ada),s
melemparkannya ke integer (atau gagal dan berhenti jika tidak ada) dan disimpan (=
) diQ
.Masing-masing (
m
)[gap height, gap width]
(tK
) kemudian dikurangi (-
) dari panjang sisi (Q
) dan hasilnya dibagi 2 (/
...2
). HasilnyaA
ditandatangani keG
danH
.Akhirnya, kita memasuki
W
lingkaran hile.Z
mulai dari 0 dan setiap iterasi kita tambahkan tetapi gunakan nilai lama (~hZ
, pikirkanZ++
dalam C).W
) nilai lama ada di ({
)r
angeG
to (panjang sisi -G
) (-QG
), tetapkan (=
)J
sebagai berikut:c
hopJ
at position (]
)H
danj
oin bagian dengan lebareK
kali celah (*
) spasi (d
) spasi ( ). Jika nilainya tidak dalam kisaran, kembalilah sajaJ
. Jika hasil ini kosong, hentikan loop.>
)Q
karakter pertama dariJ
dan tetapkan (~
) hasilnya untukJ
. Dari nilai lamaJ
, ambil (<
)Q
karakter pertama dan cetak.Akhirnya,
#
loop dimulai lagi, kesalahan dan berhenti karenacQ)
denganQ
berisi angka tidak valid.sumber
05AB1E ,
9589 byteBeberapa byte di sana-sini pasti bisa bermain golf.
Tiga langkah pertama dari program ini terinspirasi oleh jawaban Stax dari @recursive , jadi pastikan untuk meningkatkannya!
Cobalah secara online atau verifikasi semua kasus uji .
Penjelasan:
Langkah 1: Hapus semua spasi putih:
Langkah 2: Buat semua kembar tiga yang mungkin[ a , b , c ] dimana Sebuah adalah dimensi yang dihasilkan a × a persegi, dan b × c adalah ukuran celahnya. Kami melakukan ini dengan membuat semua kembar tiga yang mungkin menggunakan bilangan bulat di kisaran[ 0 , a ] . Dan kemudian kami menyaring ini di mana semua hal berikut adalah benar untuk triplet:
Sebagai contoh:L = 28 akan menghasilkan kembar tiga
[[6,2,4],[6,4,2],[8,6,6]]
.Langkah 3: Periksa apakah masih ada anak kembar tiga yang tersisa. Jika tidak, hasilkan( a b s ( b - c ) , b × c ) .
":~("
; jika ya, tentukan yang mana yang akan digunakan dengan menyortir dan hanya meninggalkan yang pertama. Kami melakukan ini dengan menyortir tupelSebagai contoh: kembar tiga
[[6,2,4],[6,4,2],[8,6,6]]
akan disortir[[8,6,6],[6,2,4],[6,4,2]]
, setelah itu hanya[8,6,6]
tersisa.Langkah 4: Buat daftar tentang bagaimana kita harus membagi string untuk memasukkan spasi. Ini dilakukan seperti ini:
Diberikan[ a , b , c ] , buat daftar dengan:
Sebagai contoh: triplet
[7,3,5]
akan menghasilkan daftar[15,2,2,35]
.Langkah 5: Dan akhirnya kami membagi string berdasarkan daftar ini, bergabung kembali bersamac jumlah ruang, membaginya menjadi beberapa bagian c , dan bergabunglah bersama-sama dengan baris baru. Sebagai contoh:
Stringc = 5 jumlah ruang untuk a = 7 untuk ini:
"Alongtesttoseeifitworksasintended."
membagi menurut daftar[15,2,2,35]
akan menghasilkan:["Alongtesttoseei","fi","tw","orksasintended."]
. Ini kemudian bergabung dengan"Alongtesttoseei fi tw orksasintended."
. Dan kemudian dipecah menjadi beberapa bagian ukuran["Alongte","sttosee","i f","i t","w o","rksasin","tended."]
. Yang kemudian bergabung dengan baris baru ke keluaran.sumber