Untuk tantangan ini, selimut seni ASCII akan menjadi blok teks dengan lebar 24 karakter dan tinggi 18 baris, berisi karakter =-<>/\
dalam pola seperti selimut yang simetris secara horizontal dan vertikal.
Contoh selimut:
========================
------------------------
//\\//\\\//\/\\///\\//\\
<<><<>>>>><<>><<<<<>><>>
/\\/\\\\/\/\/\/\////\//\
------------------------
/\/////\\///\\\//\\\\\/\
\///\/\/\\\\////\/\/\\\/
\///\/\/\\\\////\/\/\\\/
/\\\/\/\////\\\\/\/\///\
/\\\/\/\////\\\\/\/\///\
\/\\\\\//\\\///\\/////\/
------------------------
\//\////\/\/\/\/\\\\/\\/
<<><<>>>>><<>><<<<<>><>>
\\//\\///\\/\//\\\//\\//
------------------------
========================
Semua selimut memiliki bentuk yang sama:
- Mereka selalu 24 oleh 18.
- Garis atas (baris 1) dan garis bawah (baris 18)
=
semuanya berada di seberang. - Garis 2, 6, 13 dan 17
-
semuanya ada di seberang. - Baris 4 dan 15 adalah acak yang sama secara horizontal simetris pola
<
dan>
. - Semua baris lainnya (3, 5, 7, 8, 9, 10, 11, 12, 14, 16) diisi dengan
/
dan dengan\
cara yang benar-benar acak sehingga seluruh selimut tetap simetris secara horizontal dan vertikal .
Perhatikan bahwa ketika melipat selimut menjadi dua, baik secara vertikal maupun horizontal, bentuk karakternya benar-benar cocok. Jangan bingung dengan karakter yang cocok. misal jalur 3 dan jalur 16 tidak identik, mereka adalah gambar cermin vertikal.
Tantangan
Tulis program atau fungsi yang akan mencetak atau mengembalikan selimut seni ASCII acak.
Karena banyak garis yang dikodekan dan simetri, satu-satunya keacakan nyata berasal dari 12 karakter pertama pada baris 3, 4, 5, 7, 8, 9:
- 12 karakter pertama pada baris 4 harus bisa sepanjang 12 string karakter
<
dan>
. - 12 karakter pertama pada baris 3, 5, 7, 8, 9 harus bisa sepanjang 12 string karakter
/
dan\
(tidak tergantung satu sama lain). - String acak ini kemudian dicerminkan sesuai untuk membuat seluruh selimut.
Jawaban terpendek dalam byte menang. Tiebreaker adalah posting sebelumnya.
Anda dapat menggunakan generator nomor pseudorandom. (Tidak, Anda tidak perlu membuktikan bahwa ke- 12 string char <>
atau /\
dapat dihasilkan dengan PRNG bahasa Anda.)
Output secara opsional dapat berisi baris tambahan, tetapi tidak ada spasi tambahan atau karakter lain selain yang diperlukan untuk quilt.
Jawaban:
CJam,
61605855545251 byteDipersingkat sedikit dengan bantuan dari Sp3000 dan Pengoptimal.
Uji di sini.
Penjelasan
Seperti biasa dengan tantangan seni ASCII simetris ini, saya menghasilkan satu kuadran dan kemudian mengembangkannya menjadi dua hal dengan melakukan dua operasi mirroring yang sesuai.
Untuk penjelasan ini saya harus mulai dengan fungsi
F
, yang saya definisikan di suatu tempat di sepanjang jalan, karena itu digunakan di tiga tempat untuk tiga hal yang berbeda:Ini mengharapkan integer di bagian atas tumpukan, dan string di bawahnya. Tujuannya adalah membalikkan string dan juga menukar beberapa karakter, untuk mendapatkan mirroring yang tepat. Integer adalah salah satu
1
atau3
dan menunjukkan apakah (1
) tanda kurung dan garis miring harus ditukar atau (3
) hanya tanda kurung yang ditukar. Inilah cara kerjanya:Sekarang untuk sisa kode:
Dua bagian dan baris baru itu kemudian dicetak secara otomatis di akhir program.
sumber
Python 3,
257229192185176149143 byteDengan bantuan dari @xnor, kami akhirnya berhasil menyusul JS!
Output sampel:
Penjelasan
(Sedikit usang, akan diperbarui nanti)
"444046402"
mengkodekan baris, dengan masing-masing digit mengacu pada indeks awal substring 2-char yang relevan dari'--==\/<>'
. Setiap baris individu dibangun keluar-masuk melalui pengacakan berulang dari dua karakter (menggunakansample(...,2)
, karenarandom.shuffle
sayangnya di tempat) dan string bergabung.Contoh yang disederhanakan dari apa yang terlihat seperti ekspansi untuk baris keempat adalah:
yang akan menghasilkan
><>><><<><
:Selimut keseluruhan juga dibangun di dalam-ke luar, karena konstruksi dimulai dengan baris ke-9 / ke-10, yang bekerja ke luar. Untuk melakukan ini kita mulai dengan daftar kosong
L
, yang kita tambahkan baris ke depan dan belakang saat kita pergiThe
n<"5"
kondisi adalah untuk memeriksa apakah kita memiliki baris yang terdiri dari><
, dalam hal ini kita menambahkan sebuah baris identik ke belakang, sebaliknya yang terbalik.Akhirnya,
*_,=
adalah untuk memaksa evaluasimap
sehingga pencetakan terjadi, dan hanya cara yang lebih singkat untuk dilakukanprint("\n".join(L))
.Untuk waktu yang lama saya memiliki fungsi
yang mengambil string dan mengkonversi masing
/\><
-\/<>
masing, tetapi saya akhirnya berhasil menyingkirkannya :)sumber
Python 2, 300 byte
Program ini menggunakan
join, lambda, replace, sample, import
dan fungsi verbose lainnya, sehingga tidak akan memenangkan penghargaan golf apa pun.Kode sebelum pegolf otomatis mengambilnya:
Output sampel:
sumber
APL (
5358)It's not quite as symmetrical as I thought it was, unfortunately. Fix cost me 5 characters and now I'm out of the running.
Explanation:
L←+,3-⌽
: L is a function that returns its argument followed by 3 - the reverse of its argumentL{L?12⍴2}¨⍳9
: generate 9 lines of 12 random values from [1,2] plus their reverse, then the reverse of those 9 lines732451451260688⊤⍨18/8
: generate the list0 2 4 6 4 2 4 4 4 4 4 4 2 4 _7_ 4 2 0
(that's where the damn asymmetricality is)+
: for each line, add the corresponding number to each value↑
: format as matrix'==--/\<><'[
...]
: for each of the numbers in the matrix, select the character from the string at that positionOutput:
sumber
<>
lines are not vertically symmetrical as you use your swap table when making the vertical mirror as well. (Thanks for posting the output btw, makes figuring out if APL works much easier ;p )<
to the end of the string, and incrementing the second line once more, thereby swapping it twice). Didn't even have to scrap the whole thing, though it won't win anymore now. (Perhaps next time I should't post the output :P)PHP,
408,407,402,387, 379 bytesI am not a good golfer, but this problem sounded fun so I gave it a try.
Ungolfed code
The ungolfed version has a little bonus: You can pass it an integer to seed
rand()
and get the same quilt each time for a seed:This results, for example, in this beautiful, hand woven quilt:
Edit: Turns out my first version did not return a correct quilt. So I fixed it. Funny enough, the fix is even shorter.
sumber
['/','<','\\','>','a','b']
can be replaced with['/','<','\\','>',a,b]
(notice the missing quotes arounda
andb
),@$s
can be replaced with$s
, you can storestr_repeat('-',12)
andstr_repeat('=',12)
in global variables/constants,for($b=8;$b>=0;$b--)
can be replaced withfor($b=9;$b--;)
,str_repeat
and repeated functions can be shortened by giving their name to a global variable (e.g.:global$R,$V;$R=str_repeat;$V=strrev;$V($R('=',12))
) and newlines (\n
) may be replaced by a multi-line string.strrev
unchanged, removed 1 space and a few small changes.<>><><
lines) to be the same.JavaScript (ES6) 169
195 201Edit 6 bytes saved thx @nderscore. Beware, the newline inside backquotes is significant and counted.
Edit2 simplified row building, no need of
reverse
andconcat
Run snippet to test (in Firefox)
sumber
z
. Move definition ofQ
inside of theMath.random
call. Replace'\n'
with template string of newline.|0
integer casting is not needed, as the values will be xor-ed later on.for(_ of-z+z)
mean?z
is not numeric so -z is NaN (not a number) NaN converted to string is "NaN" and 3 chars + 9 chars are 12.Ruby,
162155I like this one because it made me learn to abuse backslashes in both string literals and
String#tr
. The code isn't terribly clever otherwise, just compact.sumber
/
ina
andb
. The firsttr
can probably also do without parentheses. Single-character strings like'='
can be written?=
. And.join
can be replaced by*
.join
synonym save me 6 bytes. I can't remove the parentheses inx+x.reverse.tr(a,b)
because+
takes precedence over,
though. I'm also not actually escaping the slashes in my strings - I'm failing to escape one backslash in each. A second\
is necessary inb
because of the waytr
works, though I now realize the first\
ina
is superfluous, so there's another byte.Pyth, 57
59 61Thanks a lot to @Jakube for coming up with these 57 byte versions.
Algorithm very similar to Martin's. (Revised) Explanation to come.
Try it online
Explanation:
sumber
"<>"
with-GK
J"\<>/"K"\/"L+b_mXdK_Kbjbym+d_XdJ_JmsmOk12[\=\-K-JKK\-KKK
or reduceJ"\<>/"K"\/"jbu++HGXHK_Km+d_XdJ_JmsmOk12[KKK\-K-JKK\-\=)Y
J,
5654 bytesUsage:
1 byte thanks to @FUZxxl.
Explanation coming soon.
Try it online here.
sumber
5 1 3 1 5 1 1 1
with(3(2})8$5,3#1)
.Python
295287227 bytesNot that great but I'll post it anyway:
If you want an explanation just ask me.
sumber
=
and-
ind
.Javascript (ES7 Draft)
174168146Some inspiration taken from @edc65
Edit: Thanks to edc65 for some ideas to optimize building of rows.
Demonstration: (Firefox only)
Commented:
sumber
Pharo 4, 236
or formatted normally:
Explanation:
The string
s:='====----/\/\/<><<>'
together with the blockf:=[:c|s at:(s indexOf:c)+i]
are here both for tossing the characters and for reversing the patterns...For i=1, it performs horizontal reversion (
/
<->\
,<
<->>
).For i=3, it performs vertical reversion (
/
<->\
)For i=1 or 2 atRandom, it toss among
/
or\
,<
or>
'=-/</-///'
encodes the character typec
that will feed the blockf
for the 9 first lines.#() , '=-/</-///'
is a concatenation trick for transforming the String into an Array and thus collecting into an Array.The rest is simple concatenation after applying the horizontal/vertical symetry.
sumber
Squeak 4.X, 247
Or formatted:
Explanations:
s:='==--/\<>'.
obviously encodes the four posible pairs.r:=(1<<108)atRandom.
toss 108 bits (in a LargeInteger) for 9 rows*12 columns (we toss the == and -- unecessarily but performance is not our problem).h:=''
is the string where we will concatenate (Schlemiel painter because a Stream would be too costly in characters).(16to:0by:-2),(0to:16by:2)do:[:i|
is iterating on the rows (*2)(11to:0by:-1),(0to:11) do:[:j|
is iterating on the columns28266
is a magic number encoding the pair to be used on first 9 lines.It is the bit pattern
00 01 10 11 10 01 10 10 10
, where 00 encodes '==', 01 '--', 10 '/\' and 11 '<>'.101
is a magic number encoding the horizontal and vertical reversion.It is the bit pattern
0000 0000 0110 1010
, encoding when to reverse (1) or not (0) the first (0) or second (1) character of each pair '==' '--' '/\' and '<>', for the vertical symetry and horizontal symetry.n:=3 bitAnd: 28266>>i
gives the encoding of character pair for row i/2 (0 for '==', 1 for '--', 2 for '/\' and 3 for '<>').(r-1 bitAt: 6*i+j+1)
pick the random bit for row i/2 column j (1 is the rank of lowest bit thus we have a +1, k atRandom toss in interval [1,k] thus we have a -1).(101 bitAt: 3-n*4+m+p)
pick the reversal bit: (3-n)*4 is the offset for the group of 4 bits corresponding to the pair code n, m is the vertical reversion offset (0 for first 9, 2 for last 9 rows), p is the horizontal reversion offset (0 for first 12, 1 for last 12 columns)+1 because low bit rank is 1.bitXor:
performs the reversion (it answer an offset 0 or 1), ands at:2*n+1+bitXor_offset
pick the right character in s.But
(A>>a)+(B>>b) bitAnd: 1
costs less bytes than(A bitAt:a+1)bitXor:(B bitAt:b+1)
thus the bitXor was rewritten and offset +1 on p is gone...h,#[13]
is an ugly squeakism, we can concatenate a String with a ByteArray (containing code for carriage return).sumber