Berikut adalah manusia salju seni ASCII sederhana :
_===_
(.,.)
( : )
( : )
Mari kita membuatnya menjadi teman. Ini akan menjadi pola umum bagi orang-orang salju seni ASCII kami:
HHHHH
HHHHH
X(LNR)Y
X(TTT)Y
(BBB)
Ruang utama dan tanda kurung selalu sama untuk semua orang salju. Huruf yang berbeda mewakili bagian dari pola yang dapat diubah secara individual. Setiap bagian memiliki tepat empat preset untuk karakter ASCII yang dapat mengisinya. Dengan mencampur dan mencocokkan preset ini untuk semua delapan bagian, kita dapat membuat berbagai orang salju.
Semua Preset
(Perhatikan bahwa spasi diletakkan pada garis yang kosong sehingga bentuk bagian selalu benar.)
H untuk Hat
Topi jerami
_===_
Topi Meksiko
___ .....
Fez
_ /_\
-
___ (_*_)
N untuk Hidung / Mulut
Normal
,
Dot
.
Baris
_
Tidak ada
L adalah untuk Mata Kiri
Dot
.
Dot yang lebih besar
o
Dot Terbesar
O
Tutup
-
R adalah untuk Mata Kanan
(Daftar yang sama dengan mata kiri.)
X untuk Lengan Kiri
Lengan Normal
<
Lengan ke atas
\
Lengan ke bawah
/
Tidak ada
Y untuk Arm Kanan
Lengan Normal
>
Lengan ke atas
/
Lengan ke bawah
\
Tidak ada
T untuk Torso
Tombol
:
Rompi
] [
Senjata ke dalam
> <
Tidak ada
B untuk Base
Tombol
:
Kaki
" "
Datar
___
Tidak ada
Tantangan
Tulis sebuah program yang menggunakan string delapan karakter (melalui stdin atau baris perintah) dalam format HNLRXYTB
, di mana setiap huruf adalah angka dari 1 hingga 4 yang menunjukkan preset yang akan digunakan untuk bagian yang sesuai dari snowperson tersebut. Cetak orang salju penuh ke stdout.
Misalnya, inputnya 11114411
adalah manusia salju di bagian atas halaman. (Pertama 1
: ia memiliki topi jerami, kedua 1
: hidungnya normal, dll.)
Contoh lain, orang salju untuk input 33232124
:
_
/_\
\(o_O)
(] [)>
( )
Detail
Jumlah dan kombinasi spasi terkemuka / trailing dan baris baru terkemuka / tertinggal diperbolehkan selama ...
- orang salju memiliki semua bagian mereka diatur dengan benar sehubungan satu sama lain, dan
- tidak ada lebih dari 64 karakter spasi putih total (pola umum hanya 7 × 5, jadi Anda mungkin tidak akan mencapai batas ini).
Anda tidak perlu mencetak baris / kolom dari pola jika hanya berisi spasi kosong. mis. garis kosong dari topi jerami tidak diperlukan.
Anda harus menggunakan pemesanan suku cadang seperti yang diberikan di atas.
Alih-alih sebuah program, Anda dapat menulis fungsi yang menggunakan string digit sebagai argumen. Keluaran harus dicetak secara normal atau dikembalikan sebagai string.
- Anda dapat memperlakukan input sebagai bilangan bulat, bukan string jika lebih disukai.
Mencetak gol
Kode terpendek dalam byte menang.
Pertanyaan bonus: Manakah dari 65536 orang salju yang berbeda yang menjadi favorit Anda?
Jawaban:
CJam,
135134132130126125 byteUntuk membuat file di mesin Anda, jalankan
xxd -r > snowman.cjam
, rekatkan hexdump reversibel dari atas, tekan Enterdan akhirnya Ctrl+ D.Atau, Anda dapat mencoba kode online menggunakan juru bahasa CJam .
Bonus
Manusia salju favorit saya adalah Olaf:
Musim dingin adalah waktu yang tepat untuk tinggal dan berpelukan, tetapi tempatkan aku di musim panas dan aku akan menjadi ... manusia salju yang bahagia!
Ide
String hex
mengkodekan pilihan yang mungkin untuk semua bagian manusia salju, termasuk yang tetap. Mari kita sebut string ini P .
Untuk mendekodekannya, kita mengonversi P (di sini diperlakukan sebagai array bilangan bulat) dari basis 256 ke basis 20 dan mengganti masing-masing bilangan bulat yang dihasilkan dengan karakter yang sesuai dari string M :
Ini menghasilkan string T :
Baris pertama mengkodekan semua pilihan topi, yang terakhir adalah semua bagian tubuh tetap. Baris lainnya berisi 28 bagian tubuh variabel.
Kami membagi T pada umpan garis dan membagi string dari array yang dihasilkan menjadi empat bagian dengan panjang yang sama. Kemudian, kita membaca input dari STDIN, mendorong array dari digit-nya di basis 10 dan memilih elemen yang sesuai dari string split. Kami mengambil keuntungan dari fakta bahwa array membungkus dalam CJam, sehingga elemen pada indeks 4 dari array panjang 4 sebenarnya adalah elemen pertama. String yang dibagi terakhir tidak sesuai dengan input apa pun, sehingga akan dipilih seluruhnya.
Kami menangani topi dengan menggeser elemen pertama dari array yang dihasilkan. Indeks dalam M dari karakter pertama, dibaca sebagai angka dasar 4, mengungkapkan jumlah spasi dan garis bawah pada baris pertama topi. Kami mencetak karakter tersebut, umpan baris, spasi, dan sisa dari string yang digeser. Kemudian, kami mendorong umpan baris tambahan di bagian bawah tumpukan.
Untuk bagian tubuh, kami menggabungkan string yang sesuai dengan mereka semua. Mari kita sebut string ini S . Untuk merakit bagian-bagian tubuh, kita melakukan transliterasi: kita mengambil setiap karakter dari string M , menghitung indeks di sort (M) dan menggantinya dengan karakter yang sesuai dari S . Kami mengambil keuntungan dari kenyataan bahwa operator transliterasi secara otomatis mengisi S untuk mencocokkan panjang sortir (M) dengan mengulangi karakter terakhir S sebanyak yang diperlukan.
Akhirnya, kami membagi string yang dihasilkan menjadi substring dengan panjang 7 dan menempatkan umpan baris di antara setiap pasangan substring.
Kode
Misalkan variabel
M
danP
mengandung string M dan P .sumber
JavaScript ES6,
210208202 byteIni adalah fungsi anonim; Anda menggunakannya dengan mengeksekusi
([function code])('42232124')
. Bagian paling menjengkelkan dari ini adalah lengan, yang mengambil 2 baris, jadi saya harus memasukkan kode untuk bagian atas dan bawah.Cuplikan Stack di bawah ini memiliki kode komentar ungolf, un-ES6, ified. Dan Anda dapat menggunakannya untuk dengan mudah menguji kode dan mencoba berbagai kombinasi. Sunting: Saya terlalu bersenang-senang dengan ini. Saya telah menambahkan beberapa fitur baru, termasuk cara untuk menghasilkan manusia salju acak.
Terima kasih kepada Yair Rand karena telah menghemat enam byte.
sumber
1 1
->11
) dan menambahkan||' '
di akhir.CJam, 164 byte
Menghasilkan manusia salju dari kiri ke kanan, dari atas ke bawah. Ini menghilangkan kebutuhan untuk segala jenis string yang bergabung atau memposisikan ulang operasi, karena saya hanya meninggalkan setiap bagian manusia salju di tumpukan. Dan kemudian, karena dump stack otomatis di akhir program:
♫ CJam ingin membangun manusia salju! ♫
Cobalah online.
Bonus
Berpikir di luar kotak!
32443333
memberikan pengantin pria salju (wo). Anda harus mencoba sedikit untuk melihatnya, tetapi ada lengan dalam, fez + lengan ke bawah = jilbab, dan kepala sebenarnya ada di fez / kerudung. Bentuk umumnya besar adalah gaun bergelombang, dan "mata" dan "hidung" terlipat dalam gaun itu.Pilihan "mata" lainnya agak agak bersifat cabul ...
sumber
Python,
276289 byteKode ini memiliki 8 byte tambahan (
\
* 4) untuk keterbacaan.Membangun manusia salju sedikit demi sedikit.
Bonus
F("44444432")
memberikan "beruang Rusia mengantuk":sumber
Python 2,
354280241261 bytePanggilan
s('33232124')
memberi:Tapi favorit saya adalah
44242123
dan41341144
:sumber
s('33232124')
fez garis miring tidak ditarik. Faktanya bagian bawah topi hilang dalam banyak kasus. Juga,0
bukan salah satu opsi.CJam,
150145 byteBasis mengonversi semua hal!
SE mangles unprintables, sehingga di sini adalah salinan di Pastebin. Pastikan Anda menyalin bagian "Data Tempel RAW", bukan bagian di samping nomor baris. Anda dapat mencobanya secara online , tetapi permalink mungkin tidak berfungsi di beberapa browser.
Penjelasan
Bagian
"b8li'U9gN;|"125:Kb8bp
menghasilkan arrayyang memetakan setiap digit input ke tempat digit digunakan. Apa pun yang umum untuk semua input (mis. Spasi dan terkemuka
()
) secara sewenang-wenang diberi 0, kecuali yang pertama ditugaskan 1 sehingga konversi dasar dapat bekerja.l:~f=
kemudian konversi setiap digit ke int dan memetakan sesuai, misalnya untuk14441133
kita dapatkan"G.HMtNY7VM=BM@$^$dX8a665V"KbFb"=_./ <[(*-oO,\":"f=
memberi stringsetelah itu kita menduplikasi, mengganti
/<[(
dengan\>])
dan menambahkan untuk memberikan string yang panjang. Kemudian kami membagi string menjadi kelompok-kelompok 4 dan memetakan sesuai dengan array lain"r pL|P3{cR`@L1iT"Kb21b
, sehingga mendapatkan array dengan panjang-4 string yang menggambarkan semua opsi yang mungkin pada setiap sel (misalnya_=./
semua opsi yang mungkin untuk karakter kedua pada baris kedua, mulai dari Topi Rusia).Akhirnya kami memetakan opsi ke input sesuai
.=
, dibagi menjadi baris dengan panjang 77/
dan riffle di beberapa baris baruN*
.Tes berjalan
sumber
TI-BASIC, 397 byte
Penting: Jika Anda ingin menguji ini, unduh dari sini dan kirim file itu ke kalkulator Anda. Jangan tidak mencoba untuk menyalin kode di bawah ini ke dalam program editor TI-Connect CE atau SourceCoder 3 atau sesuatu untuk membangun dan mengirimkannya ke kalkulator; dalam kasus TI-Connect, itu akan mengatakan itu memiliki token yang tidak valid. SC3 menggunakan backslash sebagai pembatas komentar (
//
memulai komentar di SC3;,/\/
meskipun, akan diekspor sebagai//
) dan sehingga tidak akan mengekspor lengan dan topi dan dengan benar, menyebabkan program untuk menampilkan bagian tubuh yang salah dan melemparkan GALAT: DOMAIN setiap saat. Hal menyenangkan!Penting # 2: Saya terlalu malas untuk memperbaiki unduhan saat ini, jadi ketika Anda mentransfernya ke calc, ubah
7
baris ketiga dari bawah ke bawahX+6
. Kode di bawah ini diperbaiki jika Anda perlu membandingkan.Bonus: Saya sangat suka
12341214
.Beberapa catatan:
[2ND] → [0]CATALOG → [3]θ → scroll down, it's between ﹢ (small plus) and · (interpunct)
) sebagai kebalikan dari suatu periode sehingga mata tidak sejajar dengan koma, karena itu terlihat aneh sekali.sumber
length(Ans
seharusnyalength(Str9
; kedua, sudahkah Anda mencoba menggabungkan Str3 hingga Str6 menjadi satu string?C,
280 272264 byteHanya sebagian golf pada saat ini, tetapi ini adalah tantangan yang menyenangkan.
(Dengan beberapa tambahan untuk keterbacaan.) Saya berharap
define
harus pergi dengan bermain golf lebih lanjut.Versi yang lebih mudah dibaca adalah
sumber
C, 212 byte
Versi yang dapat dibaca:
Saya mengambil ide dari jawaban oleh Reto Koradi . Ada beberapa peningkatan yang menyenangkan yang saya lakukan, yang mungkin menjamin posting jawaban yang terpisah:
\"
(-3)t[i++]
oleh*t++
(-4)while
olehfor
; dihapus{}
(-4)\0
(-9)t[...],t+=4
menjadi(...)[t+=4]
untuk menghilangkan operator koma (-1)Kenapa semua masalah itu? Untuk membagikan yang favorit saya, hantu salju:
sumber
d
dalam parens di belakangmain
JavaScript, 489 (tanpa baris dan tab baru)
jalankan bersama
node snowman.js 33232124
sumber
parseInt
panggilan, karena pengurangan secara otomatis mencoba untuk memberikan operan string ke angka. Juga, Anda dapat menyingkirkanfunction
pembungkus dan hanya memimpin dengani=process.argv[2]
, kecuali jika Anda menggunakannya untuk rekursi atau pelingkupan variabel. Selain itu, Anda dapat menyingkirkans
sepenuhnya dan lakukan sajaconsole.log([ ... ].join('\n'))
.,
karakter, tetapi memungkinkan Anda untuk menghapus lebih dari 50. Akhirnya, satu optimasi yang sangat rewel akan menggunakanq=j[4]-1
alih-alihq=j[4]==1
(dan kemudian membalik penggunaan Anda dariq
dan!q
). Hal ini akan menyebabkanq
menjadi0
(nilai falsey) saatj[4]
ini1
, dan sebaliknya nilai nol truthy. Ini adalah kebalikan dari nilai true / false Anda saat ini, jadi Anda cukup beralihq
dan!q
.Pyth, 203 byte
Lol. Cobalah secara online: Pyth Compiler / Executor
Penjelasan
Pertama saya mendefinisikan fungsi pembantu
g
, yang mengambil daftar dan char sebagai input, mengubah char menjadi nilai ASCII dan mengambil elemen koresponden (pembungkus modular).Hal-hal lain hanyalah mencetak baris demi baris. Misalnya, baris pertama adalah:
Btw. Saya bereksperimen sedikit dengan
.F"{:^7}"
, yang memusatkan string. Dengan menggunakannya, saya bisa menyimpan beberapa spasi dalam kode saya, tetapi pada akhirnya tidak menyimpan byte.sumber
R,
436437 byteInilah percobaan pertama saya pada kode-golf , menggunakan R yang bukan yang terpendek namun tetap menyenangkan. Setidaknya saya mengalahkan JavaScript (untuk saat ini) ...
Pengujian:
Saya benar-benar berjuang dengan
X
danY
menjadi multiline tetapi dengan hal-hal di antaranya, akhirnya memisahkan setiap baris dalam (X
,S
) dan (Y
,U
).function
dan konversi dari string ke integer juga sangat verbose.Edit 436 => 437
Harus memperbaiki ruang kosong yang hilang yang diperhatikan oleh @OganM
Saya bisa mengurangi menjadi 428 menggantikan garis istirahat antara variabel dengan
;
, tetapi kode "satu baris " terlihat sangat buruk dan tidak dapat dibaca saya tidak akan serakah itu.sumber
Haskell,
361306289 bytePemakaian:
Cara kerjanya: mengindeks setiap elemen daftar
[hat options, left upper arm options, left eye options, ..., base options]
dengan nomor input yang sesuai dan menggabungkannya menjadi satu daftar. Saya telah membagi lengan kiri dan kanan menjadi bagian atas dan bawah, sehingga saya dapat membuat garis manusia salju demi baris.Favorit saya adalah klasik
11112211
.Sunting: beralih dari daftar string ke string untuk bagian-bagian (topi, mata, ...). Membutuhkan parameter kedua, panjang substring yang akan diambil.
Sunting II: substring umum yang diekstraksi
sumber
C,
233230 byteDengan baris baru dan spasi putih untuk keterbacaan yang lebih baik:
Semuanya cukup kuat. Ini menggunakan tabel yang berisi satu entri untuk masing-masing 35 (5 baris dengan panjang 7) karakter. Setiap entri dalam tabel adalah:
,
(
,)
. Panjang entri tabel adalah 1 karakter.Kode kemudian melompati 35 karakter, dan mencari nilai dalam tabel.
sumber
R 414 Bytes
Versi Molx yang sedikit dimodifikasi
Hanya menggabungkan variabel-variabel yang terpisah menjadi satu. Shawing dari beberapa ruang yang digunakan untuk
X=c(
rutin.sumber
CJam,
200191 byteIni pasti bisa bermain golf banyak. (Khususnya jika saya basis encode). Tapi ini untuk pemula:
Input masuk ke STDIN. Misalnya, input
23232223
memberi:Cobalah online di sini
sumber
Haskell, 333 byte
Kiriman pertama saya! Buat manusia salju dari atas ke bawah, kiri ke kanan. Saya membagi lengan menjadi dua fungsi untuk masing-masing lengan, bagian di sebelah kepala dan bagian di sebelah tubuh.
Fungsi s mengambil daftar bilangan bulat dan menyatukan output dari fungsi-fungsi yang menghasilkan bagian-bagian tubuh yang diberi sublist input yang benar.
Itu bergantung pada fungsinya
yang mengembalikan elemen ke-n dari daftar yang diberikan. Ini memungkinkan daftar topi dalam, dan juga hal-hal seperti
semua fungsi ini menggunakan reduksi beta sehingga argumennya diteruskan sebagai indeks ke fungsi y.
Keluaran:
sumber
Python 3,
349336254251 byteSangat banyak untuk melakukan tesis saya.
Berikut isi file snowman.py :
Dan inilah cara saya menyulap manusia salju favorit saya:
Penjelasan
sumber
[int(i)]
danfor
. Demikian pula Anda dapat menghapus ruang di baris 7 antaraf(int(i))
danfor
. Juga, dalamprint()
pernyataan Anda, Anda tidak perlu mencetak ruang terakhir - ini bukan bagian dari manusia salju. Akhirnya, ubahprint()
panggilan Anda menjadi satu barisprint("{}\n{}({}{}{}){}\n{}({}){}\n ({})".format(*c))
. Masing-masing harus menghemat 1 byte, menghemat total 4 byte :)n
, Anda dapat menentukan atribut fungsif
. Jadi, Anda dapat mengganti baris 5-6 dengan:def f(m):f.n+=1;return l[4*m+int(b[f.n])-1]
<newline>f.n=-1
. Ini mengurangi 3 byte lagi.PowerShell , 199 byte
Terinspirasi oleh Reto Koradi dan anatolyg .
Cobalah online!
Catatan: Baris 3 memiliki 2 ruang jejak, baris 4 memiliki ruang jejak.
Favorit saya adalah
44444444
"penjaga Rusia mengantuk":sumber
JavaScript (ES6), 247
Tidak sebagus iklan @ NinjaBearMonkey's :(
Uji dalam cuplikan (dengan Firefox)
sumber
05AB1E ,
137135128122 byte-6 byte terima kasih kepada @Grimy .
Cobalah secara online atau verifikasi beberapa kasus uji lagi .
Penjelasan:
Kami pertama kali membuat templat-string:
Yang terlihat seperti ini:
Lalu saya lewati digit input:
Dan lakukan hal berikut:
Dorong indeks (0-diindeks)
N
dari daftar:Dorong semua bagian yang mungkin sebagai daftar daftar karakter:
Gunakan loop index
N
untuk mendapatkan daftar karakter dari bagian yang sedang kami kerjakan:Kemudian pisahkan daftar karakter menjadi empat bagian yang sama, dan gunakan input-digit
y
(yang 1-diindeks) untuk mengindeks ke dalamnya. (CATATAN: Karena 05AB1E diindeks 0, tetapi inputnya adalah 1-diindeks, akan logis untuk mengurangi digit dengan 1 sebelum pengindeksan. Namun, karena 05AB1E memiliki pembungkus otomatis (mis. Pengindeksan3
dalam daftar[1,3,5]
akan menghasilkan1
), saya cukup memutar bagian sekali sehingga bagian dengan nr 4 dalam deskripsi tantangan, ada di bagian depan daftar.)Dan kemudian ganti indeks terindeks 0 dari loop yang kita dorong pada awalnya, satu per satu dengan bagian-karakter:
Dan pada akhirnya hasilnya adalah output secara implisit.
Lihat tip tambang 05AB1E ini (bagian Bagaimana cara mengkompres bilangan bulat besar? Dan Cara mengompresi daftar bilangan bulat? ) Untuk memahami cara kerja bagian kompresi.
Adapun favorit saya, itu masih 'kelinci salju' yang sama seperti 1,5 tahun yang lalu ketika saya memposting solusi Java saya :
sumber
0
antara matanya. :)Java 8,
548545432401399 byteCoba di sini.
Penjelasan:
Kesukaanku:
Saya tidak tahu mengapa, tetapi terlihat agak lucu. Seperti kelinci dengan topi Rusia, bukannya telinga.
sumber
F #, 369 byte
Cobalah online!
Karena
g
menggunakan accessor array, saya perlu secara eksplisit menentukan jenis dalam definisi fungsi sebagaistring
, yang mengapa definisi fungsi memiliki(g:string)
.Selain itu, biasanya array
strings
diakses oleh indeks. Topi, lengan kiri dan kanan yang akan berada di garis yang terpisah dibagi menjadi array atas dan bawah yang terpisah. Thei
Fungsi perubahan nomor dalam argumeng
ke dalam indeks array. Dan surat itub
menggantikan string satu spasi dalam array.Tantangan besar! Manusia salju favorit saya mungkin
242244113
:aku mengawasi kamu
sumber
PHP, 378 byte
Cobalah online!
Saya suka Tuan Owl yang bijak
31333342
sumber
Python 2.7, 257 byte (saya pikir)
di mana 'i' adalah input sebagai string (mis. "13243213")
sumber
i
untukinput()
untuk total 262 byteDart , 307 byte
Cobalah online!
sumber
Zsh, 247 byte
coba online !!
fav snowman:
sumber