Apakah Anda ingin kode manusia salju?

176

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

  1. Topi jerami

         
    _===_
  2. Topi Meksiko

     ___ 
    .....
    
  3. Fez

      _  
     /_\ 
    
  4. Topi Rusia

     ___ 
    (_*_)
    

N untuk Hidung / Mulut

  1. Normal ,

  2. Dot .

  3. Baris _

  4. Tidak ada

L adalah untuk Mata Kiri

  1. Dot .

  2. Dot yang lebih besar o

  3. Dot Terbesar O

  4. Tutup -

R adalah untuk Mata Kanan

(Daftar yang sama dengan mata kiri.)

X untuk Lengan Kiri

  1. Lengan Normal

     
    <
  2. Lengan ke atas

    \
     
  3. Lengan ke bawah

     
    /
  4. Tidak ada

     
     

Y untuk Arm Kanan

  1. Lengan Normal

     
    >
  2. Lengan ke atas

    /
     
  3. Lengan ke bawah

     
    \
  4. Tidak ada

     
     

T untuk Torso

  1. Tombol :

  2. Rompi ] [

  3. Senjata ke dalam > <

  4. Tidak ada

B untuk Base

  1. Tombol :

  2. Kaki " "

  3. Datar ___

  4. 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 11114411adalah 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?

Hobi Calvin
sumber
19
Saya suka malaikat 14441133 . Atau rakasa empat bersenjata bermata kecil. Pilihan Anda.
Sp3000
14
Apakah itu harus menjadi manusia salju?
54
Tidak harus menjadi manusia salju. (Penafian: Mungkin harus manusia salju)
Joshpbarron
3
Komentar sesekali lucu itu bagus, tetapi untuk diskusi panjang, silakan gunakan obrolan alih-alih komentar. Saya sudah membersihkan ini sedikit.
Martin Ender
36
Pertanyaan yang harus dilakukan selanjutnya: "Lagipula kode itu tidak pernah mengganggu saya"
Calvin's Hobbies

Jawaban:

39

CJam, 135 134 132 130 126 125 byte

0000000: 4e22285b200a5c225f2a295c2d2e2f6f2c3e4f3a3c3d5d225f  N"([ .\"_*)\-./o,>O:<=]"_
0000019: 2422dd7382d6bfab28707190992f240c362ee510262bd07a77  $".s....(pq../$.6...&+.zw
0000032: 08556de9dcdb566c676817c2b87f5ecb8bab145dc2f2f76e07  .Um...Vlgh....^....]...n.
000004b: 22323536624b623224663d4e2f7b5f2c342f2f7d25723a7e2e  "256bKb2$f=N/{_,4//}%r:~.
0000064: 3d2828342423346222205f0a20222e2a6f6f736572372f4e2a  =((4$#4b" _. ".*ooser7/N*

Untuk 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:

$ LANG=en_US cjam snowman.cjam <<< 12222212

 _===_
\(o.o)/
 ( : ) 
 (" ")

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

dd7382d6bfab28707190992f240c362ee510262bd07a7708
556de9dcdb566c676817c2b87f5ecb8bab145dc2f2f76e07

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 :

([ 
"_*)\-./o,>O:<=]

Ini menghasilkan string T :

/(_*_)"_===_/....., /_\ 
 ,._
-.oO
-.oO
   <\  /
   >/  \
    : ] [> <
    : " "___
 ((()

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 Mdan Pmengandung string M dan P .

N        e# Push a linefeed.
M_$      e# Push M and a sorted copy.
P256bKb  e# Push P and convert it from base 256 to base 20.
2$       e# Push a copy of M.
f=       e# Compute T by retrieving the proper chars from M.
N/       e# Split T at linefeeds.
{_,4//}% e# Divide each string into four substrings of equal length.
r:~      e# Read a number from STDIN and push the array of its digits in base 10.
.=       e# Get the corresponding chunks from T.
((       e# Shift out the first string and that string's first character.
4$#      e# Find its index in M.
4b       e# Compute its digits in base 4.
" _
 ".*     e# Repeat the space and underscore that many times in place.
oo       e# Print the result and the shifted string.
s        e# Flatten the remainder of the array. This pushes S.
er       e# Perform transliteration.
7/       e# Split into chunks of length 7.
N*       e# Join using linefeeds.
Dennis
sumber
60

JavaScript ES6, 210 208 202 byte

s=>` 0
8(213)9
4(6)5
 (7)`.replace(/\d/g,p=>`_===_1 ___
 .....1  _
  /_\\1 ___
 (_*_)1,1.1_11.1o101-1.1o101-1<11/11>11\\11 : 1] [1> <1   1 : 1" "1___1   11\\11 11/11 `.split(1)[s[p>7?p-4:p]-1+p*4]||' ')

Ini 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.

var f=function(s){
  return' 0\n8(213)9\n4(6)5\n (7)' // Start with a placeholder string with all the static components
    .replace(/\d/g,function(p){ // Go through each placeholder number to replace it with its value
    // The massive string below holds all the possible body parts, separated by 1 for easy splitting.
    // The two at the end are for the top of the arms
    return'_===_1 ___\n .....1  _\n  /_\\1 ___\n (_*_)1,1.1_11.1o101-1.1o101\
-1<11/11>11\\11 : 1] [1> <1   1 : 1" "1___1   11\\11 11/11 '.split(1)
    [s[p>7?p-4:p]-1 // Get the value from the input string. If the current body part
                    // is the top of the two-line arms (8 or 9), drop it down to 4 or 5
                    // Subtract 1 to account for the 0-indexed array.
     +p*4] // multiply by 4 to skip to the relevant code
     ||' ' // To save bytes in the above string, spaces are empty strings, so replace them here
  })
}

// Code for the interactive version follows
// http://codepen.io/hsl/pen/bdEgej
function updateRadios(){$('input[type="radio"]').each(function(){if($(this).is(":checked")){var t=$(this).data("p"),i=$(this).data("v");input[t]=i}}),inputS=input.join(""),update()}var input=[],inputS=$("#code").val(),update=function(){$("#p").text(f(inputS)),$("#code").val(inputS)};$('input[type="radio"]').change(updateRadios),$("#code").keyup(function(){inputS=$(this).val(),update()}),updateRadios(),$("#random").click(function(){for(var t=0;8>t;t++)$("div:eq("+t+") input:eq("+Math.floor(4*Math.random())+")").prop("checked",!0);updateRadios()});
body{font-family:sans-serif}h2{font-size:18px;font-weight:400}label{display:block}div{display:inline-block;margin:0 10px}#code{width:70px}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script><div><h2>Hat</h2><label><input type="radio" name="p1" data-p="1" data-v="1"> Straw hat</label><label><input type="radio" name="p1" data-p="1" data-v="2"> Mexican hat</label><label><input type="radio" name="p1" data-p="1" data-v="3"> Fez</label><label><input type="radio" name="p1" data-p="1" data-v="4" checked> Russian hat</label></div><div><h2>Nose/mouth</h2><label><input type="radio" name="p2" data-p="2" data-v="1"> Normal</label><label><input type="radio" name="p2" data-p="2" data-v="2" checked> Dot</label><label><input type="radio" name="p2" data-p="2" data-v="3"> Line</label><label><input type="radio" name="p2" data-p="2" data-v="4"> None</label></div><div><h2>Left eye</h2><label><input type="radio" name="p3" data-p="3" data-v="1"> Dot</label><label><input type="radio" name="p3" data-p="3" data-v="2" checked> Bigger dot</label><label><input type="radio" name="p3" data-p="3" data-v="3"> Biggest dot</label><label><input type="radio" name="p3" data-p="3" data-v="4"> Closed</label></div><div><h2>Right eye</h2><label><input type="radio" name="p4" data-p="4" data-v="1"> Dot</label><label><input type="radio" name="p4" data-p="4" data-v="2"> Bigger dot</label><label><input type="radio" name="p4" data-p="4" data-v="3" checked> Biggest dot</label><label><input type="radio" name="p4" data-p="4" data-v="4"> Closed</label></div><div><h2>Left arm</h2><label><input type="radio" name="p5" data-p="5" data-v="1"> Normal</label><label><input type="radio" name="p5" data-p="5" data-v="2" checked> Upwards</label><label><input type="radio" name="p5" data-p="5" data-v="3"> Downwards</label><label><input type="radio" name="p5" data-p="5" data-v="4"> None</label></div><div><h2>Right arm</h2><label><input type="radio" name="p6" data-p="6" data-v="1" checked> Normal</label><label><input type="radio" name="p6" data-p="6" data-v="2"> Upwards</label><label><input type="radio" name="p6" data-p="6" data-v="3"> Downwards</label><label><input type="radio" name="p6" data-p="6" data-v="4"> None</label></div><div><h2>Torso</h2><label><input type="radio" name="p7" data-p="7" data-v="1"> Buttons</label><label><input type="radio" name="p7" data-p="7" data-v="2" checked> Vest</label><label><input type="radio" name="p7" data-p="7" data-v="3"> Inward arms</label><label><input type="radio" name="p7" data-p="7" data-v="4"> None</label></div><div><h2>Base</h2><label><input type="radio" name="p8" data-p="8" data-v="1"> Buttons</label><label><input type="radio" name="p8" data-p="8" data-v="2"> Feet</label><label><input type="radio" name="p8" data-p="8" data-v="3"> Flat</label><label><input type="radio" name="p8" data-p="8" data-v="4" checked> None</label></div><br><button id="random">Randomize</button><pre id="p"></pre><input type="text" id="code">

NinjaBearMonkey
sumber
3
+1 Sangat pintar, jauh lebih baik daripada milik saya
edc65
23
'GUI' sangat keren.
topher
7
Manis, lihat manusia salju laba-laba bermata 8: 22112333
Claudiu
1
Saya suka burung hantu Rusia yang sedang tidur: 41444442
ETHproduk
1
Anda dapat menghemat enam byte dengan menghapus setiap ruang tunggal dalam slot ( 1 1-> 11) dan menambahkan ||' 'di akhir.
Yair Rand
30

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!

q:Q;SS"
 _===_,___
 ....., _
  /_\,___
 (_*_)"',/0{Q=~(=}:G~N" \ "4G'(".oO-"_2G",._ "1G@3G')" / "5GN"< / "4G'(" : ] [> <   "3/6G')"> \ "5GNS'(" : \" \"___   "3/7G')

Cobalah online.

Bonus

Berpikir di luar kotak! 32443333memberikan 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 ...

Runer112
sumber
17
Bagi saya, bonus Anda lebih mirip anggota KKK daripada pengantin wanita.
ace_HongKongIndependence
26

Python, 276 289 byte

V='.oO-'
def F(d):
 D=lambda i:int(d[i])-1
 print"  "+("","___"," _ ","___")[D(0)]+"\n "+\
"_. (=./_=._*=.\\__. )"[D(0)::4]+"\n"+\
" \\  "[D(4)]+"("+V[D(2)]+',._ '[D(1)]+V[D(3)]+")"+" /  "[D(5)]+'\n'+\
"< / "[D(4)]+"("+" ]> :    [< "[D(6)::4]+")"+"> \\ "[D(5)]+"\n ("+\
' "_ : _  "_ '[D(7)::4]+")"

Kode ini memiliki 8 byte tambahan ( \* 4) untuk keterbacaan.

Membangun manusia salju sedikit demi sedikit.

Bonus

F("44444432") memberikan "beruang Rusia mengantuk":

  ___    
 (_*_)
 (- -)
 (> <)
 (" ")
Claudiu
sumber
13
Beruang rusia mengantuk sekarang menjadi favorit saya juga.
Hobi Calvin
1
Garis bawah menggarisbawahi tampaknya tidak benar pada topi fez dan Rusia. mis. Ini memberikan topi propellor ..
Calvin Hobbies
@ Calvin Hobbies: Topi Rusia baik-baik saja, tetapi topi fez itu berantakan. Saya memperbaikinya sekarang dan memeriksa semua case lainnya juga. Saya harus lebih berhati-hati di masa depan!
Claudiu
Sangat terlambat ke pesta, tetapi TIO ini mengatakan ini adalah 297 untuk saya. Intellij mengatakan 299. Apakah saya kehilangan sesuatu?
bersalju
21

Python 2, 354 280 241 261 byte

def s(g):H,N,L,R,X,Y,T,B=[int(c)-1for c in g];e='.oO-';print(' '*9+'_ _ ___ _ _\n\n\n\n    _. (=./_=._*=.\\__. )')[H::4]+'\n'+' \\  '[X]+'('+e[L]+',._ '[N]+e[R]+')'+' /  '[Y]+'\n'+'< / '[X]+"("+' ]> :    [< '[T::4]+')'+'> \\ '[Y]+'\n ('+' "_ : _  "_ '[B::4]+")"

Panggilan s('33232124')memberi:

   _ 
  /_\ 
\(o_O) 
 (] [)>
 (   )

Tapi favorit saya adalah 44242123dan 41341144:

  ___      ___
 (_*_)    (_*_)
\(o -)    (O,-) 
 (] [)>  <(   )>
 (___)    (   )
Cees Timmerman
sumber
1
Ketika saya melakukan s('33232124')fez garis miring tidak ditarik. Faktanya bagian bawah topi hilang dalam banyak kasus. Juga, 0bukan salah satu opsi.
Calvin Hobi
@ CalvinHobbies Terima kasih, saya memperbaikinya.
Cees Timmerman
20

CJam, 150 145 byte

Basis mengonversi semua hal!

"b8li'
U9gN;|"125:Kb8bl:~f="r  pL|P3{cR`@L1iT"Kb21b"G.HMtNY7VM=BM@$^$dX8a665V"KbFb"=_./ <[(*-oO,\":"f=_"/<[(""\>])"er+4/f=.=7/N*

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:Kb8bpmenghasilkan array

[1 0 0 0 0 0 0 0 0 0 0 0 0 0 4 0 2 1 3 0 5 4 0 6 6 6 0 5 0 0 7 7 7 0]

yang 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 untuk 14441133kita dapatkan

[2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 2 4 1 2 1 1 3 3 3 1 2 1 1 4 4 4 1]

"G.HMtNY7VM=BM@$^$dX8a665V"KbFb"=_./ <[(*-oO,\":"f= memberi string

"_=./  /  < /  [<(((((_. _ _     _ __*=._-.oO ,._  \"_ :   : _"

setelah 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 7 7/dan riffle di beberapa baris baru N*.

Tes berjalan

11111111

 _===_ 
 (.,.) 
<( : )>
 ( : )

22222222
  ___  
 ..... 
\(o.o)/
 (] [) 
 (" ")

33333333
   _   
  /_\  
 (O_O) 
/(> <)\
 (___)

44444444
  ___  
 (_*_) 
 (- -) 
 (   ) 
 (   )
Sp3000
sumber
19

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 7baris ketiga dari bawah ke bawah X+6. Kode di bawah ini diperbaiki jika Anda perlu membandingkan.

Input Str9
seq(inString("1234",sub(Str9,I,1)),I,1,length(Ans→L1
"      ___   _   ___ →Str1
"_===_..... /_\ (_*_)→Str2
",._ →Str3
"•oO-→Str4
"<\/ →Str5
">/\ →Str6
" : ] [> <   →Str7
" : ¨ ¨___   →Str8
"Str1Str2Str3Str4Str5Str6Str7Str8→Str0
For(X,3,5
Output(X,2,"(   )
End
L1
Output(3,3,sub(Str4,Ans(3),1)+sub(Str3,Ans(2),1)+sub(Str4,Ans(4),1
Ans(5
Output(4-(Ans=2),1,sub(Str5,Ans,1
L1(6
Output(4-(Ans=2),7,sub(Str6,Ans,1
L1-1
For(X,1,2
Output(X+3,3,sub(expr(sub(Str0,X+6,1)),1+3Ans(X+6),3
Output(X,2,sub(expr(sub(Str0,X,1)),1+5Ans(1),5
End

Bonus: Saya sangat suka 12341214.

 _===_
 (O.-)/
<( : )
 (   )

Beberapa catatan:

  • Pasti bisa bermain golf lebih, tidak ada pertanyaan tentang itu. Saya hampir positif bahwa saya dapat menggabungkan mayoritas, jika tidak semua, dari keluaran menjadi satu For (loop. Juga, saya cukup yakin bahwa saya dapat menggabungkan beberapa string bersama.
  • Di Str4 (mata) saya menggunakan "plot dot" ( [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.
  • Di Str8 (base) saya harus menggunakan diaeresis (¨) alih-alih tanda kutip ganda karena tidak ada cara untuk melarikan diri karakter dalam TI-BASIC, dan tanda kutip ganda digunakan untuk memulai / mengakhiri string.
  • Dalam TI-BASIC, tidak perlu menutup tanda kurung dan tanda kurung jika mereka diikuti oleh titik dua, baris baru atau → (digunakan untuk penugasan var), dan tanda kutip ganda (string) dapat tetap tertutup ketika diikuti oleh baris baru atau →.
MI Wright
sumber
1
Pertama, di baris kedua, length(Ansseharusnya length(Str9; kedua, sudahkah Anda mencoba menggabungkan Str3 hingga Str6 menjadi satu string?
lirtosiast
Oh, wah! Saya pikir itu sudah diperbaiki dalam unduhan. Selain itu, saya belum pernah melihat ini sejak saya membuatnya, tetapi saya memang menyebutkan bahwa saya mungkin bisa menggabungkan beberapa string bersama; Saya akan membahasnya hari ini / minggu ini.
MI Wright
18

C, 280 272 264 byte

Hanya sebagian golf pada saat ini, tetapi ini adalah tantangan yang menyenangkan.

#define P(n)[s[n]&3],
f(char*s){printf("  %.3s\n %.5s\n%c(%c%c%c)%c\n%c(%.3s)%c\n (%.3s)",
"___   ___ _"+*s%4*3,"(_*_)_===_..... /_\\"+*s%4*5,"  \\ "P(4)"-.o0"P(2)    
" ,._"P(1)"-.o0"P(3)"  /"P(5)" < /"P(4)"    : ] [> <"+s[6]%4*3," > \\"P(5)
"    : \" \"___"+s[7]%4*3);}

(Dengan beberapa tambahan untuk keterbacaan.) Saya berharap defineharus pergi dengan bermain golf lebih lanjut.

Versi yang lebih mudah dibaca adalah

#define P(n)[s[n]&3],
f(char *s) {
  printf("  %.3s\n"
         " %.5s\n"
         "%c(%c%c%c)%c\n"
         "%c(%.3s)%c\n"
         " (%.3s)",
         "___   ___ _"+*s%4*3,                  /* Top of hat. */
         "(_*_)_===_..... /_\\"+*s%4*5,         /* Lower hat. */
         "  \\ "P(4)                            /* Upper left arm. */
         "-.o0"P(2)                             /* Left eye. */
         " ,._"P(1)                             /* Nose. */
         "-.o0"P(3)                             /* Right eye. */
         "  /"P(5)                              /* Upper right arm. */
         " < /"P(4)                             /* Lower left arm. */
         "    : ] [> <"+s[6]%4*3,               /* Torso. */
         " > \\"P(5)                            /* Lower right arm. */
         "    : \" \"___"+s[7]%4*3              /* Base. */
         );
}
CL-
sumber
12

C, 212 byte

d;main(){char*t="##3#b#b3#bbb3#b#b##\r#3b1#+3@12b3@1b-3@1_b3b1#,#\r7#_##+51rR04/1b#61rR0,8#2##\r7?#2#+9#`A#9=###9#^?#,8A#_#\r#+:#%b#:=#b#:#%b#,#",p[9];for(gets(p);d=*t++;putchar(d-3))d=d<51?d:(p[d-51]-53)[t+=4];}

Versi yang dapat dibaca:

d;
main()
{
    char *t = "##3#b#b3#bbb3#b#b##\r"
              "#3b1#+3@12b3@1b-3@1_b3b1#,#\r"
              "7#_##+51rR04/1b#61rR0,8#2##\r"
              "7?#2#+9#`A#9=###9#^?#,8A#_#\r"
              "#+:#%b#:=#b#:#%b#,#",
        p[9]; // 9 bytes is just enough for the input string of length 8

    for (gets(p); d = *t++; putchar(d-3))
        d = d < 51 ? d : (p[d - 51] - 53)[t += 4];
}

Saya mengambil ide dari jawaban oleh Reto Koradi . Ada beberapa peningkatan yang menyenangkan yang saya lakukan, yang mungkin menjamin posting jawaban yang terpisah:

  • Dikonversi dari fungsi ke program (+10)
  • Pindah baris baru ke string kontrol (-7)
  • Menambahkan 3 ke semua kode karakter untuk memiliki lebih sedikit karakter yang lolos seperti \"(-3)
  • Membaca dari string dengan peningkatan otomatis; juga digantikan t[i++]oleh *t++(-4)
  • Diganti whileoleh for; dihapus {}(-4)
  • Terminasi loop sederhana: membaca sampai \0(-9)
  • Berubah t[...],t+=4menjadi(...)[t+=4] untuk menghilangkan operator koma (-1)

Kenapa semua masalah itu? Untuk membagikan yang favorit saya, hantu salju:

   _
  /_\
\(. .)/
 (   )
 (___)
anatolyg
sumber
Dapat dimasukkan ke ddalam parens di belakangmain
ceilingcat
10

JavaScript, 489 (tanpa baris dan tab baru)

x=' ';
d="   ";
h=['\n_===_',' ___ \n.....','  _  \n /_\\ ',' ___ \n(_*-)'];
n=[',','.','_',x];
e=['.','o','O','-'];
y=['>',,'\\',x];
u=['<',,'/',x];
t=[' : ','[ ]','> <',d;
b=[' : ','" "',"___",d];

j=process.argv[2].split('').map(function(k){return parseInt(k)-1});
q=j[4]==1;
w=j[5]==1;

console.log([
    h[j[0]].replace(/(.*)\n(.*)/g, " $1\n $2"),
    (q?'\\':x)+'('+e[j[2]]+n[j[1]]+e[j[3]]+')'+(w?'/':x),
    (!q?u[j[4]]:x)+'('+t[j[6]]+')'+(!w?y[j[5]]:x),
    x+'('+b[j[7]]+')'].join('\n'));

jalankan bersama node snowman.js 33232124

Christopher Reid
sumber
6
Selamat datang di Golf Code! Beberapa petunjuk: Anda mungkin tidak memerlukan parseIntpanggilan, karena pengurangan secara otomatis mencoba untuk memberikan operan string ke angka. Juga, Anda dapat menyingkirkan functionpembungkus dan hanya memimpin dengan i=process.argv[2], kecuali jika Anda menggunakannya untuk rekursi atau pelingkupan variabel. Selain itu, Anda dapat menyingkirkan ssepenuhnya dan lakukan saja console.log([ ... ].join('\n')).
apsillers
3
Sebenarnya, Anda bisa menghapus konversi string-ke-array input sepenuhnya jika Anda meletakkan koma di setiap array Anda untuk meningkatkan indeks setiap item. Ini menambahkan 7 ,karakter, tetapi memungkinkan Anda untuk menghapus lebih dari 50. Akhirnya, satu optimasi yang sangat rewel akan menggunakan q=j[4]-1alih-alih q=j[4]==1(dan kemudian membalik penggunaan Anda dari qdan !q). Hal ini akan menyebabkan qmenjadi 0(nilai falsey) saat j[4]ini 1, dan sebaliknya nilai nol truthy. Ini adalah kebalikan dari nilai true / false Anda saat ini, jadi Anda cukup beralih qdan !q.
apsillers
Maaf atas gundukan umpan balik atas jawaban pertama Anda! Saya pribadi menemukan merevisi kiriman saya menjadi salah satu bagian paling menyenangkan dari bermain golf; saya minta maaf jika Anda tidak berbagi perasaan saya. :)
apsillers
@apsillers umpan balik Anda sangat dihargai! Saya akan pergi tidur tadi malam dan kemudian menulis ini untuk bersenang-senang dengan niat untuk menjulurkannya ke yang paling sederhana nanti. Saya akan melakukan beberapa pengeditan malam ini!
Christopher Reid
9

Pyth, 203 byte

M@GCHgc"  ___

  ___
   _"bhzgc" (_*_)
 _===_
 .....
  /_\\"bhzs[g"  \ "@z4\(g"-.oO"@z2g" ,._"@z1g"-.oO"@z3\)g"  / "@z5)s[g" < /"@z4\(gc"   
 : 
] [
> <"b@z6\)g" > \\"@z5)++" ("gc"   
 : 
\" \"
___"bez\)

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).

M@GCH  def g(G,H): return G[ord(H)]

Hal-hal lain hanyalah mencetak baris demi baris. Misalnya, baris pertama adalah:

 c"  ___\n\n  ___\n   _"b     split the string "  ___\n\n  ___\n   _" at "\n"
                         hz   first char in input
g                             apply g and print

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.

Jakube
sumber
9

R, 436 437 byte

Inilah percobaan pertama saya pada , menggunakan R yang bukan yang terpendek namun tetap menyenangkan. Setidaknya saya mengalahkan JavaScript (untuk saat ini) ...

H=c("_===_"," ___\n .....","  _\n  /_\\"," ___\n (_*_)")
N=c(",",".","_"," ")
L=c(".","o","O","-")
X=c(" ","\\"," "," ")
S=c("<"," ","/"," ")
Y=c(" ","/"," ","")
U=c(">"," ","\\","")
T=c(" : ","] [","> <","   ")
B=c(" : ","\" \"","___","   ")
f=function(x){i=as.integer(strsplit(x,"")[[1]]);cat(" ",H[i[1]],"\n",X[i[5]],"(",L[i[3]],N[i[2]],L[i[4]],")",Y[i[6]],"\n",S[i[5]],"(",T[i[7]],")",U[i[6]],"\n"," (",B[i[8]], ")",sep="")}

Pengujian:

> f("12344321")
 _===_
 (O.-) 
 (] [)\
 ( : )

Saya benar-benar berjuang dengan Xdan Ymenjadi 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.

Molx
sumber
Anda membutuhkan dan char ekstra untuk topi ke-4
OganM
@ OganM Terima kasih untuk byte ekstra itu! :( Diperbaiki.
Molx
Saat melakukan codegolf, kita biasanya menghitung setiap baris baru sebagai satu karakter (seperti pada * nix) dan bukan dua (seperti pada Windows). Jadi tidak masalah apakah Anda menggunakan titik koma atau baris baru.
ace_HongKongIndependence
@ace Terima kasih atas tipnya, senang tahu!
Molx
8

Haskell, 361 306 289 byte

o l a b=take a$drop((b-1)*a)l
n="\n"
p i=id=<<["  ",o"    \n _===____ \n ..... _  \n  /_\\ ___ \n (_*_)"11a,n,o" \\  "1e,o"(.(o(O(-"2c,o",._ "1 b,o".)o)O)-)"2d,o" /  "1f,n,o"< / "1e,o"( : )(] [)(> <)(   )"5g,o"> \\ "1f,n," (",o" : )\" \")___)   )"4h]where[a,b,c,d,e,f,g,h]=map(read.(:[]))i

Pemakaian:

putStrLn $ p "12333321"

 _===_
 (O.O) 
/(] [)\
 ( : )

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

nimi
sumber
8

C, 233 230 byte

char*t="  0 _ _0 ___0 _ _   0_. (0=./_0=._*0=.\\_0_. ) 4 \\  (2.oO-1,._ 3.oO-)5 /  4< / (6 ]> 6:   6 [< )5> \\  (7 \"_ 7: _ 7 \"_ ) ";i,r,d;f(char*p){while(r++<35){d=t[i]-48;putchar(t[d<0?i:i+p[d]-48]);i+=d<0?1:5;r%7?0:puts("");}}

Dengan baris baru dan spasi putih untuk keterbacaan yang lebih baik:

char* t = "  0 _ _0 ___0 _ _   0_. (0=./_0=._*0=.\\_0_. ) 4 \\  (2.oO-1,._ 3.oO-)5 /  4< / (6 ]> 6:   6 [< )5> \\  (7 \"_ 7: _ 7 \"_ ) ";
i, r, d;
f(char* p)
{
    while (r++ < 35)
    {
        d = t[i] - 48;
        putchar(t[d < 0 ? i : i + p[d] - 48]);
        i += d < 0 ? 1 : 5;
        r % 7 ? 0 : puts("");
    }
}

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:

  • Sebuah karakter yang konstan: , (, ). Panjang entri tabel adalah 1 karakter.
  • Indeks bagian tubuh, diikuti oleh 4 karakter yang mungkin tergantung pada pemilihan bagian dalam input. Panjang entri tabel adalah 5 karakter.

Kode kemudian melompati 35 karakter, dan mencari nilai dalam tabel.

Reto Koradi
sumber
8

R 414 Bytes

Versi Molx yang sedikit dimodifikasi

W =c("_===_"," ___\n .....","  _\n  /_\\"," ___\n (_*_)",",",".","_"," ",".","o","O","-"," ","\\"," "," ","<"," ","/"," "," ","/"," ","",">"," ","\\",""," : ","] [","> <","   "," : ","\" \"","___","   ")
f=function(x){i=as.integer(strsplit(x,"")[[1]]);cat(" ",W[i[1]],"\n",W[i[5]+12],"(",W[i[3]+8],W[i[2]+4],W[i[4]+8],")",W[i[6]+20],"\n",W[i[5]+16],"(",W[i[7]+28],")",W[i[6]+24],"\n"," (",W[i[8]+32], ")",sep="")}

Hanya menggabungkan variabel-variabel yang terpisah menjadi satu. Shawing dari beberapa ruang yang digunakan untuk X=c(rutin.

OganM
sumber
7

CJam, 200 191 byte

Ini pasti bisa bermain golf banyak. (Khususnya jika saya basis encode). Tapi ini untuk pemula:

7S*"_===_  ___  .....   _    /_\   ___  (_*_)"+6/2/Nf*",._ "1/".oO-"1/_" <\  /   >/  \  "2/4/~" : ] [> <    : \" \"___   "3/4/~]l~Ab:(]z::=:L0=N4{L=}:K~0='(2K1K3K')5K0=N4K1='(6K')5K1=NS'(7K')

Input masuk ke STDIN. Misalnya, input 23232223memberi:

  ___ 
 .....
\(o_O)/
 (] [) 
 (___)

Cobalah online di sini

Pengoptimal
sumber
7

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.

a=y["\n _===_\n","  ___ \n .....\n","   _  \n  /_\\ \n","  ___ \n (_*_)\n"]
d=y",._ "
c=y".oO-"
e=y"< / "
j=y" \\  "
f=y"> \\ "
k=y" /  "
y w n=w!!(n-1)
h=y[" : ","] [","> <","   "]
b=y[" ( : ) \n"," (\" \") \n"," (___) \n"," (   ) \n"]
s(m:x:o:p:n:q:t:l:_)=putStr$a m++j x:'(':c o:d n:c p:')':k q:'\n':e x:'(':h t++')':f q:'\n':b l

Itu bergantung pada fungsinya

y :: [a] -> Int -> a
y w n=w!!(n-1)

yang mengembalikan elemen ke-n dari daftar yang diberikan. Ini memungkinkan daftar topi dalam, dan juga hal-hal seperti

k=y" /  "

semua fungsi ini menggunakan reduksi beta sehingga argumennya diteruskan sebagai indeks ke fungsi y.

Keluaran:

λ> s $ repeat 1

 _===_
 (.,.) 
<( : )>
 ( : ) 

λ> s $ repeat 2
  ___ 
 .....
\(o.o)/
 (] [) 
 (" ") 

λ> s $ repeat 3
   _  
  /_\ 
 (O_O) 
/(> <)\
 (___) 

λ> s $ repeat 4
  ___ 
 (_*_)
 (- -) 
 (   ) 
 (   ) 
Craig Roy
sumber
@ CalvinHobbies Terima kasih, saya pikir saya sudah memperbaikinya sekarang.
Craig Roy
7

Python 3, 349 336 254 251 byte

Sangat banyak untuk melakukan tesis saya.

Berikut isi file snowman.py :

l='_===_| ___\n .....|  _\n  /_\| ___\n (_*_)| : |] [|> <|   |>| |\| | : |" "|___|   '.split('|')
l[4:4]=' \  .oO-,._ .oO- /  < / '
def s(a):print(' {}\n{}({}{}{}){}\n{}({}){}\n ({})'.format(*[l[4*m+int(a[int('0421354657'[m])])-1]for m in range(10)]))

Dan inilah cara saya menyulap manusia salju favorit saya:

s('11112311')

 _===_ 
\(.,.) 
 ( : )\
 ( : ) 

Penjelasan

# Create a list containing the 4 * 10 body parts of the snowman in order of drawing:
#   hats,
#   upper left arms, left eyes, noses, right eyes, upper right arms,
#   lower left arms, torso's, lower right arms,
#   bases
l='_===_| ___\n .....|  _\n  /_\| ___\n (_*_)| : |] [|> <|   |>| |\| | : |" "|___|   '.split('|')
l[4:4]=' \  .oO-,._ .oO- /  < / '
# This is the function that draws the snowman
# All the lines of this function are golfed in a single statement, but seperated here for clearity
def s(a):
    # In this list comprehension I put the elements of l that are chosen according to the parameters
    list_comprehension = []
    # m is the number of the body part to draw
    for m in range(10):
        # Get the index for the choice of the m-th bodypart
        # (example: the 2nd bodypart (m = 1: the upper left arm) is in the 4th place of the arguments list)
        choice_index = int('0421354657'[m])
        # n is the parameter of the current bodypart
        n = int(a[choice_index]) - 1
        # Add the body part from list l to the list comprehenseion
        list_comprehension.append( l[4 * m + n] )
    # Print the list comprehension with the static parts
    print(' {}\n{}({}{}{}){}\n{}({}){}\n ({})'.format(*list_comprehension))
Matty
sumber
Anda dapat menghapus spasi pada baris 2 antara [int(i)]dan for. Demikian pula Anda dapat menghapus ruang di baris 7 antara f(int(i))dan for. Juga, dalam print()pernyataan Anda, Anda tidak perlu mencetak ruang terakhir - ini bukan bagian dari manusia salju. Akhirnya, ubah print()panggilan Anda menjadi satu baris print("{}\n{}({}{}{}){}\n{}({}){}\n ({})".format(*c)). Masing-masing harus menghemat 1 byte, menghemat total 4 byte :)
ace_HongKongIndependence
1
Selain itu, alih-alih menggunakan variabel global n, Anda dapat menentukan atribut fungsi f. 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.
ace_HongKongIndependence
1
@ace Terima kasih, tidak pernah mendengar atribut fungsi sebelumnya, mempelajari sesuatu yang baru!
Matty
6

PowerShell , 199 byte

Terinspirasi oleh Reto Koradi dan anatolyg .

for($t='  0 _ _0 ___0 _ _
 0_. (0=./_0=._*0=.\_0_. )
4 \  (2.oO-1,._ 3.oO-)5 /  
4< / (6 ]> 6:   6 [< )5> \ 
 (7 "_ 7: _ 7 "_ )';$d=$t[$i++];$r+="$d"){if($d-ge48){$d=$t[$i+"$args"["$d"]-49]
$i+=4}}$r

Cobalah online!

Catatan: Baris 3 memiliki 2 ruang jejak, baris 4 memiliki ruang jejak.

Favorit saya adalah 44444444"penjaga Rusia mengantuk":

 ___
(_*_)
(- -)
(   )
(   )
mazzy
sumber
5

JavaScript (ES6), 247

Tidak sebagus iklan @ NinjaBearMonkey's :(

Uji dalam cuplikan (dengan Firefox)

S=p=>([h,n,c,d,l,r,t,b,e,x]=[...p,' .oO-',`1_===_1 ___
 .....1  _
  /_\\1 ___
 (_*_)1 : 1] [1> <1   1 : 1" "1___1   `.split(1)],` ${x[h]}
${'  \\  '[l]}(${e[c]+' ,._ '[n]+e[d]})${'  /  '[r]}
${' < / '[l]}(${x[3-~t]})${' > \\ '[r]}
 (${x[7-~b]})`)

// TEST // 

function go()
{
  var n=N.value
  if (/^[1-8]{8}$/.test(n)) {
    s=S(n)
    OUT.innerHTML = s+'\n'+n+'\n\n'+ OUT.innerHTML
  }
  else N.focus()
}
  
<input id=N maxlength=8><button onclick="go()">Test</button>
<pre id=OUT></pre>

edc65
sumber
3

05AB1E , 137 135 128 122 byte

…( )7ÝJ»•αγʒδÓ₂©8¥ŽQxΣxêÿ•12вèJIvN”</[(
._-=:"ÆŸ,*”º•DùÙÂ+;Èγтáì³ÓW©ÎÂ_`ƒ≠îj*ΓçÊ~ÞÒ¸β¦oåb/õ47/vÎΓ”›≠øØZµλݺ•20в趡Nè4äyè.;

-6 byte terima kasih kepada @Grimy .

Cobalah secara online atau verifikasi beberapa kasus uji lagi .

Penjelasan:

Kami pertama kali membuat templat-string:

…( )         # Push string "( )"
7ÝJ          # Push a list in the range [0,7] joined together: "01234567"
»            # Join both by a newline: "( )\n01234567"
•αγʒδÓ₂©2°ćì₂òη₆½•
             # Push compressed integer 80545642885242518310229085147411483894
 12в         # Convert it to Base-12 as list: [1,4,4,4,4,4,3,1,4,4,4,4,4,3,8,0,6,5,7,2,9,3,8,0,10,10,10,2,9,3,1,0,11,11,11,2]
    è        # Index each into the string: [" ","0","0","0","0","0","\n"," ","0","0","0","0","0","\n","4","(","2","1","3",")","5","\n","4","(","6","6","6",")","5","\n"," ","(","7","7","7",")"]
     J       # And join it to a single string: " 00000\n 00000\n4(213)5\n4(666)5\n (777)"

Yang terlihat seperti ini:

 00000
 00000
4(213)5
4(666)5
 (777)

Lalu saya lewati digit input:

I            # Get the input
 v           # Loop `y` over each of its digits:

Dan lakukan hal berikut:
Dorong indeks (0-diindeks) Ndari daftar:

  N          # Push the index of the loop

Dorong semua bagian yang mungkin sebagai daftar daftar karakter:

  ”</[(
  ._-=:"ÆŸ,*”
            "# Push dictionary string "</[(\n._-=:" Oo,*"
   º         # Mirror each line: "</[()]\>\n._-=:" Oo,**,oO ":=-_."
  DùÙÂ+;Èγтáì³ÓW©ÎÂ_`ƒ≠îj*ΓçÊ~ÞÒ¸β¦oåb47/vÎΓ”›≠øØZµλݺ•
             # Push compressed integer 492049509496347122906361438631265789982480759119518961177677313610613993948059787418619722816092858096158180892708001681647316210
   20в       # Convert it to Base-20 as list: [15,10,10,10,15,3,10,19,10,4,15,15,15,15,15,10,12,12,12,10,15,10,10,10,15,9,9,9,9,9,15,15,10,15,15,15,1,10,6,15,8,15,18,9,10,8,11,9,17,16,8,11,9,17,16,8,15,15,15,0,6,15,15,1,8,15,15,15,7,1,15,15,6,8,15,15,15,15,13,15,5,15,2,7,15,0,8,15,15,15,15,13,15,14,15,14,10,10,10]
      è      # Index each into the string: [" ","_","_","_"," ","(","_","*","_",")"," "," "," "," "," ","_","=","=","=","_"," ","_","_","_"," ",".",".",".",".","."," "," ","_"," "," "," ","/","_","\"," ","\n"," ",",",".","_","\n","-",".","o","O","\n","-",".","o","O","\n"," "," "," ","<","\"," "," ","/","\n"," "," "," ",">","/"," "," ","\","\n"," "," "," "," ",":"," ","]"," ","[",">"," ","<","\n"," "," "," "," ",":"," ","""," ",""","_","_","_"]
       ¶¡    # Split it by the newline character: [[" ","_","_","_"," ","(","_","*","_",")"," "," "," "," "," ","_","=","=","=","_"," ","_","_","_"," ",".",".",".",".","."," "," ","_"," "," "," ","/","_","\"," "],[" ",",",".","_"],["-",".","o","O"],["-",".","o","O"],[" "," "," ","<","\"," "," ","/"],[" "," "," ",">","/"," "," ","\"],[" "," "," "," ",":"," ","]"," ","[",">"," ","<"],[" "," "," "," ",":"," ","""," ",""","_","_","_"]]

Gunakan loop index Nuntuk mendapatkan daftar karakter dari bagian yang sedang kami kerjakan:

  Nè         # Index the loop index into it
             #  i.e. 6 → [" "," "," "," ",":"," ","]"," ","[",">"," ","<"]

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. Pengindeksan 3dalam daftar [1,3,5]akan menghasilkan 1), saya cukup memutar bagian sekali sehingga bagian dengan nr 4 dalam deskripsi tantangan, ada di bagian depan daftar.)

    4ä       # Split it into 4 equal parts
             #  i.e. [[" "," "," "],[" ",":"," "],["]"," ","["],[">"," ","<"]]
      yè     # Index the input-digit `y` into it (with automatic wraparound)
             #  i.e. 4 → [" "," "," "]

Dan kemudian ganti indeks terindeks 0 dari loop yang kita dorong pada awalnya, satu per satu dengan bagian-karakter:

  .;         # Replace first; every index of the loop `N` in the template-string
             # is replaced one by one with the characters

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 :

44114432:
   _  
 (_*_)
 (. .) 
 (> <) 
 (" ")
Kevin Cruijssen
sumber
-4 , cukup untuk mengalahkan CJam!
Grimy
1
Turun ke 122 , dan juga lebih dekat dengan apa yang awalnya Anda miliki.
Grimy
@Grimy Versi 122 byte Anda ada di 0antara matanya. :)
Kevin Cruijssen
Hanya kesalahan pengkodean basis-12, harus cukup mudah untuk diperbaiki!
Grimy
@ Grimy Kamu benar. Saya tidak punya banyak waktu kemarin, tapi itu memang perbaikan sederhana dalam daftar. Terima kasih untuk -6! :)
Kevin Cruijssen
2

Java 8, 548 545 432 401 399 byte

a->{int q=50,H=a[0]-49,N=a[1],L=a[2],R=a[3],X=a[4],Y=a[5];return"".format(" %s%n %s%n%c(%c%c%c)%c%n%c(%s)%c%n (%s)",H<1?"":H%2<1?" ___":"  _","_===_s.....s /_\\s(_*_)".split("s")[H],X==q?92:32,L<q?46:L<51?111:L<52?79:45,N<q?44:N<51?46:N<52?95:32,R<q?46:R<51?111:R<52?79:45,Y==q?47:32,X<q?60:X%2<1?32:47,"   s : s] [s> <".split("s")[a[6]%4],92-(Y%3+Y%6/4)*30,"   s : s\" \"s___".split("s")[a[7]%4]);}

Coba di sini.

Penjelasan:

a->{             // Method with character-array parameter and String return-type
  int q=50,      //  Temp integer with value 50 to reduce the byte-count
      H=a[0]-49, //  The hat-character as unicode value minus 49: 1=0; 2=1; 3=2; 4=3
      N=a[1],L=a[2],R=a[3],X=a[4],Y=a[5];
                 //  Most of the other characters as unicode values: 1=49; 2=50; 3=51; 4=52
  return"".format(" %s%n %s%n%c(%c%c%c)%c%n%c(%s)%c%n (%s)",
                                               // Return the snowman with:
    H<1?"":H%2<1?" ___":"  _",                 //  The top of the hat
    "_===_s.....s /_\\s(_*_)".split("s")[H],   //  + the bottom of the hat
    X==q?92:32,                                //  + the top of the left arm
    L<q?46:L<51?111:L<52?79:45,                //  + the left eye
    N<q?44:N<51?46:N<52?95:32,                 //  + the nose
    R<q?46:R<51?111:R<52?79:45,                //  + the right eye
    Y==q?47:32,                                //  + the top of the right arm
    X<q?60:X%2<1?32:47,                        //  + the bottom of the left arm
    "   s : s] [s> <".split("s")[a[6]%4],      //  + the torso
    92-(Y%3+Y%6/4)*30,                         //  + the bottom of the right arm
    "   s : s\" \"s___".split("s")[a[7]%4]);}  //  + the feet

Kesukaanku:

44114432:
   _  
 (_*_)
 (. .) 
 (> <) 
 (" ")

Saya tidak tahu mengapa, tetapi terlihat agak lucu. Seperti kelinci dengan topi Rusia, bukannya telinga.

Kevin Cruijssen
sumber
1

F #, 369 byte

let f(g:string)=
 let b=" "
 let p=printfn
 let i x=int(g.[x])-49
 p"  %s  "["";"___";" _ ";"___"].[i 0]
 p" %s "["_===_";".....";" /_\ ";"(_*_)"].[i 0]
 p"%s(%c%c%c)%s"[b;"\\";b;b].[i 4]".oO-".[i 2]",._ ".[i 1]".oO-".[i 3][b;"/";b;b;b].[i 5]
 p"%s(%s)%s"["<";b;"/";b].[i 4][" : ";"] [";"> <";"   "].[i 6][">";b;"\\";b].[i 5]
 p" (%s) "[" : ";"\" \"";"___";"   "].[i 7]

Cobalah online!

Karena gmenggunakan accessor array, saya perlu secara eksplisit menentukan jenis dalam definisi fungsi sebagai string, yang mengapa definisi fungsi memiliki (g:string).

Selain itu, biasanya array stringsdiakses oleh indeks. Topi, lengan kiri dan kanan yang akan berada di garis yang terpisah dibagi menjadi array atas dan bawah yang terpisah. The iFungsi perubahan nomor dalam argumen gke dalam indeks array. Dan surat itu bmenggantikan string satu spasi dalam array.

Tantangan besar! Manusia salju favorit saya mungkin 242244113:

  ___  
 ..... 
 (o o) 
 ( : ) 
 ( : ) 

aku mengawasi kamu

Ciaran_McCarthy
sumber
1

PHP, 378 byte

<?$f=str_split;$r=$f($argv[1]);$p=[H=>'   _===____..... _  /_\ ___(_*_)',N=>',._ ',L=>'.oO-',R=>'.oO-',X=>' <\  /  ',Y=>' >/  \  ',T=>' : ] [> <   ',B=>' : " "___   '];echo preg_replace_callback("/[A-Z]/",function($m){global$A,$p,$r,$f;$g=$m[0];return$f($f($p[$g],strlen($p[$g])/4)[$r[array_search($g,array_keys($p))]-1])[(int)$A[$g]++];},'  HHH
 HHHHH
X(LNR)Y
X(TTT)Y
 (BBB)');

Cobalah online!

Saya suka Tuan Owl yang bijak 31333342

   _ 
  /_\ 
 (O,O) 
/(   )\
 (" ")
Jo.
sumber
1

Python 2.7, 257 byte (saya pikir)

H,N,L,R,X,Y,T,B=map(int,i)
l='\n'
s=' '
e=' .o0-'
F='  \  / '
S=' < / \ >'
o,c='()'
print s+'      _ _ ___ _ _\n\n\n\n    _. (=./_=._*=.\__. )'[H::4]+l+F[X]+o+e[L]+' ,._ '[N]+e[R]+c+F[-Y]+l+S[X]+o+'  ]> :    [< '[T::4]+c+S[-Y]+l+s+o+'  "_ : _  "_ '[B::4]+c

di mana 'i' adalah input sebagai string (mis. "13243213")

Khalil
sumber
2
Selamat datang di PPCG! Ketika itu terjadi, itu adalah 256 byte. Sayangnya, Anda tidak dapat mengasumsikan input disimpan dalam variabel. Namun Anda dapat mengganti iuntuk input()untuk total 262 byte
H.PWiz
0

Dart , 307 byte

f(i,{r='.o0-',s=' : '}){i=i.split('').map((j)=>int.parse(j)-1).toList();return' ${['_===_',' ___ \n.....',' /_\\ ',' ___ \n (_*_)'][i[0]]}\n${' \\  '[i[4]]}(${r[i[2]]+',._ '[i[1]]+r[i[3]]})${' /  '[i[5]]}\n${'< /  '[i[4]]}(${[s,'] [','> <','  '][i[6]]})${'> \\ '[i[5]]}\n (${[s,'" "','___','   '][i[7]]})';}

Cobalah online!

Elcan
sumber
0

Zsh, 247 byte

coba online !!

(){H='_===_h ___
 .....h  _
  /_\h ___
 (_*_)'
W=' \  ' L=.oO- N=,._\  Y=' /  '
X='< / ' T=' : ] [> <   ' Z='> \ '
B=' : " "___   '
<<<" ${H[(ws:h:)$1]}
$W[$5]($L[$3]$N[$2]$L[$4])$Y[$6]
$X[$5](${T:3*($7-1):3})$Z[$6]
 (${B:3*($8-1):3})"
} ${(s::)1}

fav snowman:

43232122 Cossack dancer
  ___
 (_*_)
\(o_O) 
 (] [)>
 (" ")
roblogic
sumber