คุณต้องการรหัสมนุษย์หิมะหรือไม่


176

นี่คือมนุษย์หิมะASCII ศิลปะที่เรียบง่าย:

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

มาทำให้เขามีเพื่อนบ้าง นี่จะเป็นรูปแบบทั่วไปสำหรับมนุษย์หิมะศิลปะ ASCII ของเรา:

 HHHHH
 HHHHH
X(LNR)Y
X(TTT)Y
 (BBB)

ช่องว่างชั้นนำและวงเล็บจะเหมือนกันเสมอสำหรับมนุษย์หิมะทุกคน ตัวอักษรที่แตกต่างกันแสดงถึงส่วนต่าง ๆ ของรูปแบบที่สามารถเปลี่ยนแปลงเป็นรายบุคคล แต่ละส่วนมีค่าที่ตั้งล่วงหน้าสี่ตัวสำหรับอักขระ ASCII ที่สามารถเติมเต็มได้ โดยการผสมและจับคู่ค่าที่ตั้งล่วงหน้าเหล่านี้สำหรับแปดส่วนเราสามารถสร้างมนุษย์หิมะที่หลากหลาย

ค่าที่ตั้งไว้ทั้งหมด

(โปรดสังเกตว่าช่องว่างถูกวางไว้บนบรรทัดอื่นที่ว่างดังนั้นรูปร่างของส่วนจะถูกต้องเสมอ)

H สำหรับหมวก

  1. หมวกฟาง

         
    _===_
  2. หมวกเม็กซิกัน

     ___ 
    .....
    
  3. เฟซ

      _  
     /_\ 
    
  4. หมวกรัสเซีย

     ___ 
    (_*_)
    

N สำหรับจมูก / ปาก

  1. ปกติ ,

  2. จุด .

  3. เส้น _

  4. ไม่มี

L สำหรับตาข้างซ้าย

  1. จุด .

  2. ใหญ่กว่า Dot o

  3. จุดที่ใหญ่ที่สุด O

  4. ปิด -

R สำหรับตาขวา

(รายการเช่นเดียวกับตาข้างซ้าย)

X สำหรับแขนซ้าย

  1. แขนปกติ

     
    <
  2. แขนขึ้นไป

    \
     
  3. แขนลง

     
    /
  4. ไม่มี

     
     

Y สำหรับแขนขวา

  1. แขนปกติ

     
    >
  2. แขนขึ้นไป

    /
     
  3. แขนลง

     
    \
  4. ไม่มี

     
     

T สำหรับลำตัว

  1. ปุ่ม :

  2. เสื้อกั๊ก ] [

  3. อาวุธภายใน > <

  4. ไม่มี

B สำหรับฐาน

  1. ปุ่ม :

  2. ฟุต " "

  3. แบน ___

  4. ไม่มี

ท้าทาย

เขียนโปรแกรมที่ใช้สตริงอักขระแปดตัว (ผ่าน stdin หรือบรรทัดคำสั่ง) ในรูปแบบHNLRXYTBโดยที่ตัวอักษรแต่ละตัวเป็นตัวเลขตั้งแต่ 1 ถึง 4 ซึ่งหมายถึงค่าที่ตั้งไว้ล่วงหน้าที่จะใช้สำหรับส่วนที่สอดคล้องกันของมนุษย์หิมะ พิมพ์ snowperson แบบเต็มไปยัง stdout

ตัวอย่างเช่นการป้อนข้อมูล11114411เป็นมนุษย์หิมะที่ด้านบนของหน้า (แรก1: เขามีหมวกฟางที่สอง1: เขามีจมูกปกติ ฯลฯ )

อีกตัวอย่างหนึ่งคือ snowperson สำหรับอินพุต33232124:

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

รายละเอียด

  • จำนวนและการรวมกันของช่องว่างนำหน้า / ต่อท้ายและการขึ้นบรรทัดใหม่นำหน้า / ต่อท้ายจะได้รับอนุญาตตราบเท่าที่ ...

    • snowperson มีส่วนทั้งหมดของพวกเขาจัดอย่างถูกต้องด้วยความเคารพซึ่งกันและกันและ
    • ไม่มีอักขระช่องว่างรวมมากกว่า 64 ตัว (รูปแบบทั่วไปมีเพียง 7 × 5 ดังนั้นคุณอาจไม่ถึงขีด จำกัด นี้)

    คุณไม่จำเป็นต้องพิมพ์แถว / คอลัมน์ของรูปแบบหากมีเพียงช่องว่าง เช่นไม่ต้องใช้บรรทัดว่างของหมวกฟาง

  • คุณต้องใช้การสั่งซื้อชิ้นส่วนตามที่ระบุไว้ข้างต้น

  • แทนที่จะเป็นโปรแกรมคุณสามารถเขียนฟังก์ชั่นที่รับสายอักขระตัวเลขเป็นอาร์กิวเมนต์ เอาต์พุตควรถูกพิมพ์ตามปกติหรือส่งคืนเป็นสตริง

  • คุณอาจถือว่าอินพุตเป็นจำนวนเต็มแทนที่จะเป็นสตริงหากต้องการ

เกณฑ์การให้คะแนน

รหัสที่สั้นที่สุดในหน่วยไบต์ชนะ

คำถามโบนัส: คนไหนที่คุณชื่นชอบในสโนว์ 65536 คนไหน?


19
ผมชอบทูตสวรรค์14441133 อีกทางหนึ่งคือสัตว์ประหลาดตัวเล็กที่มีอาวุธสี่ตา สิ่งที่คุณเลือก
Sp3000

14
มันต้องเป็นมนุษย์หิมะหรือไม่?

54
มันไม่จำเป็นต้องเป็นมนุษย์หิมะ (ข้อจำกัดความรับผิดชอบ: อาจต้องเป็นมนุษย์หิมะ)
Joshpbarron

3
ความคิดเห็นที่เฉียบแหลมเป็นครั้งคราวเป็นสิ่งที่ดี แต่สำหรับการสนทนาเพิ่มเติมโปรดใช้การแชทแทนความคิดเห็น ฉันทำความสะอาดนี้เล็กน้อย
Martin Ender

36
คำถามที่ต้องทำต่อไป: "รหัสไม่เคยรบกวนฉันเลย"
งานอดิเรกของ Calvin

คำตอบ:


39

CJam, 135 134 132 130 126 125 ไบต์

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*

ในการสร้างไฟล์บนเครื่องของคุณดำเนินการxxd -r > snowman.cjamวาง hexdump พลิกกลับจากข้างต้นให้กดEnterและในที่สุดก็+CtrlD

หรือคุณสามารถลองออนไลน์รหัสโดยใช้ล่าม CJam

โบนัส

ตุ๊กตาหิมะที่ฉันชอบคือ Olaf:

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

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

ฤดูหนาวเป็นช่วงเวลาที่ดีที่จะอยู่ในและกอด แต่ทำให้ฉันในฤดูร้อนและฉันจะเป็น ... มนุษย์หิมะมีความสุข

ความคิด

สตริงฐานสิบหก

dd7382d6bfab28707190992f240c362ee510262bd07a7708
556de9dcdb566c676817c2b87f5ecb8bab145dc2f2f76e07

เข้ารหัสทางเลือกที่เป็นไปได้สำหรับทุกส่วนของมนุษย์หิมะรวมถึงชิ้นส่วนคงที่ ขอเรียกสายนี้P

ในการถอดรหัสเราแปลงP (ที่นี่ถือว่าเป็นอาร์เรย์ของจำนวนเต็ม) จากฐาน 256 เป็นฐาน 20 และแทนที่แต่ละจำนวนเต็มที่ได้โดยใช้อักขระที่สอดคล้องกันของสตริงM :

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

ผลลัพธ์นี้ในสตริงT :

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

บรรทัดแรกเข้ารหัสตัวเลือกหมวกทั้งหมดชิ้นส่วนร่างกายที่ผ่านมาคงที่ทั้งหมด บรรทัดอื่น ๆ ประกอบด้วยชิ้นส่วนร่างกาย 28 ตัวแปร

เราแบ่งTที่ linefeeds และแบ่งสตริงของอาร์เรย์ผลลัพธ์ออกเป็นสี่ส่วนที่มีความยาวเท่ากัน จากนั้นเราอ่านอินพุตจาก STDIN กดอาร์เรย์ของตัวเลขในฐาน 10 แล้วเลือกองค์ประกอบที่สอดคล้องกันของสตริงการแยก เราใช้ประโยชน์จากความจริงที่ว่าอาร์เรย์ล้อมรอบใน CJam ดังนั้นองค์ประกอบที่ดัชนี 4 ของอาร์เรย์ความยาว 4 จึงเป็นองค์ประกอบแรก สตริงที่แบ่งล่าสุดไม่สอดคล้องกับอินพุตใด ๆ ดังนั้นมันจะถูกเลือกทั้งหมด

เราจัดการกับหมวกโดยการขยับองค์ประกอบแรกออกจากอาร์เรย์ผลลัพธ์ ดัชนีในMของอักขระตัวแรกที่อ่านเป็นตัวเลขฐาน 4 แสดงจำนวนช่องว่างและขีดล่างในบรรทัดแรกของหมวก เราพิมพ์อักขระเหล่านั้นตัวป้อนบรรทัดพื้นที่และส่วนที่เหลือของสตริงที่เลื่อน จากนั้นเรากดตัวป้อนบรรทัดเพิ่มเติมที่ด้านล่างของสแต็ก

สำหรับส่วนต่าง ๆ ของร่างกายเราเชื่อมสตริงที่สอดคล้องกับส่วนต่างๆทั้งหมด ขอเรียกสายนี้S การประกอบชิ้นส่วนร่างกายที่เราดำเนินการทับศัพท์: เราใช้ตัวอักษรของสตริงแต่ละMคำนวณดัชนีในการจัดเรียง (M)และแทนที่ด้วยอักขระที่เกี่ยวข้องของS เราใช้ประโยชน์จากข้อเท็จจริงที่ว่าผู้ดำเนินการถอดเสียงจะวางแผ่นSเพื่อจับคู่ความยาวของการเรียงลำดับ (M)โดยการทำซ้ำอักขระสุดท้ายของSหลาย ๆ ครั้งตามที่จำเป็น

สุดท้ายเราก็แบ่งสตริงผลลัพธ์ออกเป็นสตริงย่อยที่มีความยาว 7 และวาง linefeed ระหว่างสตริงย่อยแต่ละคู่

รหัส

สมมติว่าตัวแปรMและPมีสายMและ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.

60

JavaScript ES6, 210 208 202 ไบต์

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]||' ')

นี่คือฟังก์ชั่นที่ไม่ระบุชื่อ ([function code])('42232124')คุณจะใช้มันโดยการดำเนินการ ส่วนที่ทำให้รุนแรงที่สุดของเรื่องนี้คือแขนซึ่งใช้เวลา 2 บรรทัดดังนั้นฉันจึงต้องรวมรหัสสำหรับทั้งด้านบนและด้านล่าง

ส่วนย่อยของกองด้านล่างมีโค้ดที่แสดงความคิดเห็นที่ไม่ได้รับการแก้ไข และคุณสามารถใช้มันเพื่อทดสอบรหัสและลองชุดค่าผสมที่แตกต่างกัน แก้ไข:ฉันกำลังสนุกกับสิ่งนี้มากเกินไป ฉันได้เพิ่มคุณสมบัติใหม่หลายประการรวมถึงวิธีสร้างมนุษย์หิมะแบบสุ่ม

ขอบคุณ Yair Rand สำหรับการบันทึกหกไบต์

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">


3
+1 ฉลาดมากดีกว่าของฉันมาก
edc65

23
'GUI' นั้นค่อนข้างน่ากลัว
topher

7
น่ารักลองดูมนุษย์หิมะแมงมุม 8 ตา: 22112333
Claudiu

1
ฉันชอบนกฮูกรัสเซียนอนหลับ: 41444442
ETHproductions

1
คุณสามารถบันทึกหกไบต์โดยลบแต่ละช่องว่างในช่อง ( 1 1-> 11) และเพิ่ม||' 'ในตอนท้าย
Yair Rand

30

CJam, 164 ไบต์

สร้างมนุษย์หิมะจากซ้ายไปขวา, จากบนลงล่าง สิ่งนี้ไม่จำเป็นสำหรับการเข้าร่วมสตริงหรือการจัดวางตำแหน่งใหม่อีกต่อไปเนื่องจากฉันเพิ่งปล่อยมนุษย์หิมะทุกชิ้นไว้บนกองซ้อน จากนั้นเนื่องจากการถ่ายโอนข้อมูลสแต็คอัตโนมัติเมื่อสิ้นสุดโปรแกรม:

CJam ต้องการสร้างมนุษย์หิมะ!

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

ลองออนไลน์

โบนัส

คิดนอกกรอบ! 32443333ให้เจ้าสาวชายหิมะ (wo) คุณต้องลองนิดหน่อยเพื่อดูมัน แต่มันมีแขนด้านใน, เฟซ + แขนด้านล่าง = ม่านและหัวก็อยู่ในเฟซ / ม่าน แบบฟอร์มที่มีขนาดใหญ่โดยทั่วไปคือชุดที่เป็นลูกคลื่นและ "ตา" และ "จมูก" เป็นรอยพับในชุด

   _
  /_\
 (-.-) 
/(> <)\
 (___)

ตัวเลือก "ตา" อื่น ๆ นั้นค่อนข้างน่าสนใจ ...


17
สำหรับฉันโบนัสของคุณดูเหมือนสมาชิก KKK มากกว่าเจ้าสาว
ace_HongKongIndependence

26

Python ขนาด276 289 ไบต์

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]+")"

รหัสนี้มี 8 ไบต์พิเศษ ( \* 4) เพื่อให้สามารถอ่านได้

สร้างมนุษย์หิมะขึ้นทีละนิด

โบนัส

F("44444432") ให้ "หมีรัสเซียง่วงนอน":

  ___    
 (_*_)
 (- -)
 (> <)
 (" ")

13
หมีรัสเซียง่วงนอนตอนนี้ก็เป็นที่ชื่นชอบของฉันด้วย
งานอดิเรกของ Calvin

1
แถวล่างสุดดูเหมือนจะไม่ถูกต้องบนหมวก fez และรัสเซีย เช่นจะให้หมวกเป็นตัวขับเคลื่อน ..
งานอดิเรกของ Calvin

@ Calvin'sHobbies: หมวกรัสเซียโอเค แต่หมวก fez ก็ยุ่งเหยิง ฉันแก้ไขตอนนี้และตรวจสอบกรณีอื่นทั้งหมดด้วย ฉันต้องระวังให้มากขึ้นในอนาคต!
Claudiu

สายไปงานเลี้ยง แต่ TIO นี้บอกว่านี่คือ 297 สำหรับฉัน Intellij พูดว่า 299. ฉันทำอะไรหาย
หิมะ

21

Python 2, 354 280 241 261 ไบต์

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]+")"

การโทรs('33232124')ให้:

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

แต่รายการโปรดของฉันคือ44242123และ41341144:

  ___      ___
 (_*_)    (_*_)
\(o -)    (O,-) 
 (] [)>  <(   )>
 (___)    (   )

1
เมื่อฉันทำs('33232124')เครื่องหมายสแลช fez ไม่ถูกวาด ในความเป็นจริงครึ่งล่างของหมวกหายไปในหลายกรณี ยัง0ไม่ได้เป็นหนึ่งในตัวเลือก
งานอดิเรกของ Calvin

@ Calvin'sHobbies ขอบคุณฉันซ่อมมันแล้ว
Cees Timmerman

20

CJam, 150 145 ไบต์

ฐานแปลงทุกสิ่ง!

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

SE unangles unprintables ดังนั้นนี่คือสำเนาบน Pastebin ตรวจสอบให้แน่ใจว่าคุณคัดลอกส่วน "RAW Paste Data" ไม่ใช่ส่วนที่อยู่ถัดจากหมายเลขบรรทัด คุณสามารถลองออนไลน์ได้ แต่ลิงก์ถาวรอาจไม่ทำงานในบางเบราว์เซอร์

คำอธิบาย

"b8li'U9gN;|"125:Kb8bpส่วนสร้างอาร์เรย์

[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]

ซึ่งแมปตัวเลขแต่ละตัวของอินพุตกับตำแหน่งที่ใช้ สิ่งใดที่เป็นเรื่องธรรมดาสำหรับอินพุตทั้งหมด (เช่นช่องว่างนำหน้าและ()) ได้รับการกำหนดโดยพลการ 0 ยกเว้นอันแรกที่ได้รับมอบหมาย 1 เพื่อให้การแปลงฐานสามารถทำงานได้

l:~f=จากนั้นแปลงแต่ละหลักให้เป็น int และแผนที่ตามลำดับเช่นที่14441133เราได้รับ

[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= ให้สตริง

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

หลังจากที่เราทำซ้ำแทนที่/<[(ด้วย\>])และผนวกเพื่อให้สตริงยาว จากนั้นเราแบ่งสตริงออกเป็นกลุ่ม 4 และแมปตามอาเรย์อื่น"r pL|P3{cR`@L1iT"Kb21bดังนั้นจึงได้อาเรย์ของสตริงความยาว -4 อธิบายตัวเลือกที่เป็นไปได้ทั้งหมดในแต่ละเซลล์ (เช่น_=./เป็นตัวเลือกที่เป็นไปได้ทั้งหมดสำหรับตัวละครที่สองในบรรทัดที่สอง หมวกรัสเซีย)

ในที่สุดเรา map ตัวเลือกต่อปัจจัยการผลิตตาม.=แบ่งออกเป็นแถวยาว 7 และระลอกคลื่นน้อยในการขึ้นบรรทัดใหม่บางส่วน7/N*

ทดสอบการทำงาน

11111111

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

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

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

44444444
  ___  
 (_*_) 
 (- -) 
 (   ) 
 (   )

19

TI-BASIC, 397 ไบต์

สำคัญ:หากคุณต้องการทดสอบให้ดาวน์โหลดจากที่นี่และส่งไฟล์นั้นไปยังเครื่องคิดเลขของคุณ อย่าได้พยายามที่จะคัดลอกโค้ดด้านล่างลงในโปรแกรมแก้ไขโปรแกรม TI-Connect CE หรือ SourceCoder 3 หรือบางสิ่งบางอย่างที่จะสร้างและส่งไปยังเครื่องคิดเลขของคุณ ในกรณีของ TI-Connect มันจะบอกว่ามันมีโทเค็นที่ไม่ถูกต้อง SC3 ใช้แบ็กสแลชเป็นตัวคั่นความคิดเห็น ( //เริ่มความคิดเห็นใน SC3; /\/แม้ว่าจะส่งออกเป็น//) และดังนั้นมันจะไม่ส่งออกแขนและหมวกและเช่นนั้นอย่างถูกต้องทำให้โปรแกรมแสดงส่วนของร่างกายที่ไม่ถูกต้องและโยน ข้อผิดพลาด: DOMAIN ทุก ๆ คราว สิ่งที่สนุก!

ที่สำคัญ # 2:ฉันขี้เกียจเกินไปที่จะแก้ไขปัญหาการดาวน์โหลดในขณะนี้ดังนั้นเมื่อคุณโอนไปยัง Calc ของคุณให้เปลี่ยนในบรรทัดที่สามจากด้านล่างไป7 X+6รหัสด้านล่างได้รับการแก้ไขหากคุณต้องการเปรียบเทียบ

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

โบนัส:12341214ฉันรักโดยเฉพาะอย่างยิ่ง

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

หมายเหตุบางส่วน:

  • มันสามารถเล่นกอล์ฟได้มากขึ้นแน่นอนไม่มีคำถามเกี่ยวกับเรื่องนั้น ฉันเกือบจะเป็นบวกที่ฉันสามารถรวมเสียงส่วนใหญ่หากไม่ใช่ทั้งหมดของการแสดงผลเป็นหนึ่งเดียวสำหรับ (ลูปนอกจากนี้ฉันค่อนข้างแน่ใจว่าฉันสามารถรวมบางสตริงเข้าด้วยกัน
  • ใน Str4 (ดวงตา) ฉันใช้ "พล็อตจุด" ( [2ND] → [0]CATALOG → [3]θ → scroll down, it's between ﹢ (small plus) and · (interpunct)) ตรงข้ามกับช่วงเวลาเพื่อที่ดวงตาจะไม่เข้ากับเครื่องหมายจุลภาคเพราะมันดูแปลกเหมือนนรก
  • ใน Str8 (ฐาน) ฉันต้องใช้ diaeresis (¨) แทนเครื่องหมายคำพูดคู่เพราะไม่มีทางที่จะหลบหนีตัวละครใน TI-BASIC ได้และใช้การอ้างอิงคู่เพื่อเริ่มต้น / สิ้นสุดสตริง
  • ใน TI-BASIC ไม่จำเป็นต้องปิดวงเล็บและวงเล็บถ้าพวกเขาตามด้วยเครื่องหมายจุดคู่, บรรทัดใหม่หรือ→ (ใช้สำหรับการมอบหมาย var) และเครื่องหมายอัญประกาศคู่ (สตริง) สามารถอยู่ unclosed เมื่อตามด้วย newline หรือ→

1
อันดับแรกในบรรทัดที่สองlength(Ansควรเป็นlength(Str9; วินาทีคุณลองรวม Str3 เข้ากับ Str6 เป็นสายเดียวหรือไม่?
lirtosiast

โอ้โห! ฉันคิดว่ามันคงที่ในการดาวน์โหลด นอกจากนั้นผมยังไม่ได้มองที่มากนี้ตั้งแต่ฉันทำมัน แต่ผมไม่ได้พูดถึงว่าฉันอาจจะผสานสตริงบางส่วนด้วยกัน ฉันจะดูว่าบางวันนี้ / สัปดาห์นี้
MI Wright

18

C, 280 272 264 ไบต์

มีเพียงบางส่วนที่เล่นกอล์ฟ ณ จุดนี้ แต่นี่เป็นความท้าทายที่สนุก

#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);}

(ด้วยความสามารถพิเศษ \ n สำหรับการอ่าน) ฉันคาดว่าสิ่งที่defineควรจะหายไปเมื่อเล่นกอล์ฟต่อไป

รุ่นที่อ่านได้มากขึ้นคือ

#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. */
         );
}

12

C, 212 ไบต์

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];}

รุ่นที่อ่านได้:

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];
}

ผมเอาความคิดจากคำตอบโดย Reto Koradi มีการปรับปรุงที่สนุกสนานหลายอย่างที่ฉันทำซึ่งอาจรับประกันว่าจะมีคำตอบแยกต่างหาก:

  • แปลงจากฟังก์ชั่นเป็นโปรแกรม (+10)
  • ย้ายบรรทัดใหม่ไปยังสตริงควบคุม (-7)
  • เพิ่ม 3 ในรหัสอักขระทั้งหมดเพื่อให้มีตัวอักษรที่หลีกหนีน้อยลงเช่น\"(-3)
  • การอ่านจากสตริงพร้อมการสร้างอัตโนมัติ ถูกแทนที่t[i++]ด้วย*t++(-4)
  • แทนที่whileด้วยfor; ลบออก{}(-4)
  • การยกเลิกลูปแบบง่าย: อ่านจนกระทั่ง\0(-9)
  • แปลงt[...],t+=4เป็น(...)[t+=4]เพื่อกำจัดเครื่องหมายจุลภาค (-1)

ทำไมทุกปัญหา หากต้องการแบ่งปันผีหิมะที่ฉันโปรดปราน:

   _
  /_\
\(. .)/
 (   )
 (___)

สามารถวางdใน parens เบื้องหลังmain
ceilingcat

10

JavaScript, 489 (ไม่มีบรรทัดใหม่และแท็บ)

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'));

ทำงานด้วย node snowman.js 33232124


6
ยินดีต้อนรับสู่ Code Golf! ตัวชี้สองสามตัว: คุณอาจไม่ต้องการการparseIntโทรเนื่องจากการลบจะพยายามส่งสตริงตัวถูกดำเนินการไปยังหมายเลข นอกจากนี้คุณสามารถกำจัดการfunctionห่อและนำไปด้วยi=process.argv[2]เว้นแต่ว่าคุณจะใช้มันสำหรับการเรียกซ้ำหรือการกำหนดขอบเขตตัวแปร นอกจากนี้คุณยังสามารถกำจัดทั้งหมดและเพียงแค่ทำs console.log([ ... ].join('\n'))
apsillers

3
ที่จริงแล้วคุณสามารถทำได้ด้วยการแปลง string-to-array input ทั้งหมดถ้าคุณใส่เครื่องหมายจุลภาคชั้นนำในแต่ละอาร์เรย์ของคุณเพื่อเพิ่มดัชนีของแต่ละรายการ มันเพิ่ม,ตัวอักษร7 ตัว แต่มันช่วยให้คุณสามารถลบได้มากกว่า 50 ตัวสุดท้ายการเพิ่มประสิทธิภาพที่ยุ่งยากที่สุดอย่างหนึ่งจะใช้q=j[4]-1แทนq=j[4]==1(จากนั้นจึงพลิกการใช้qและ!q) สิ่งนี้จะทำให้qเป็น0(ค่าเท็จ) เมื่อj[4]เป็น1และอย่างอื่นค่าที่ไม่ใช่ศูนย์จริง นี่คือตรงข้ามแน่นอนของค่าปัจจุบันของคุณจริง / เท็จเพื่อให้คุณเพียงแค่สลับและq !q
apsillers

ขออภัยสำหรับความคิดเห็นกองคำตอบแรกของคุณ! ฉันพบว่าการแก้ไขการส่งของฉันเป็นส่วนที่สนุกที่สุดของการเล่นกอล์ฟ ขอโทษถ้าคุณไม่เปิดเผยความรู้สึกของฉัน :)
apsillers

@apsillers ความคิดเห็นของคุณได้รับการชื่นชมอย่างมาก! เมื่อคืนนี้ฉันกำลังจะไปนอนแล้วเขียนมันเพื่อความสนุกโดยมีความตั้งใจอย่างเต็มที่ที่จะทำให้มันเป็นเรื่องง่ายที่สุดเท่าที่จะทำได้ในภายหลัง คืนนี้ฉันจะแก้ไข
Christopher Reid

9

Pyth, 203 ไบต์

M@GCHgc"  ___

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

ฮ่า ๆ. ลองใช้งานออนไลน์: Pyth Compiler / Executor

คำอธิบาย

ครั้งแรกที่ฉันกำหนดฟังก์ชั่นผู้ช่วยgซึ่งจะใช้รายการและถ่านเป็นอินพุตแปลงถ่านเป็นค่า ASCII และใช้องค์ประกอบที่เกี่ยวข้อง (การห่อโมดูลาร์)

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

สิ่งอื่น ๆ เป็นเพียงการพิมพ์ทีละบรรทัด เช่นบรรทัดแรกคือ:

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

Btw ฉันทำการทดลองเล็กน้อย.F"{:^7}"ซึ่งรวมศูนย์ไว้ด้วย เมื่อใช้มันฉันสามารถบันทึกช่องว่างบางส่วนในรหัสของฉันได้ แต่จะไม่บันทึกไบต์ใด ๆ ในตอนท้าย


9

R, 436 437 ไบต์

นี่คือการลองครั้งแรกของฉันเกี่ยวกับโดยใช้ R ซึ่งไม่สั้น แต่ก็ยังสนุก อย่างน้อยฉันก็กำลังจาวาสคริปต์ (ตอนนี้) ...

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="")}

การทดสอบ:

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

ที่จริงผมต่อสู้กับXและYถูก multilined แต่มีสิ่งที่อยู่ในระหว่างจบลงด้วยการแยกแต่ละบรรทัดใน ( X, S) และ ( Y, U)

function และการแปลงจากสตริงเป็นจำนวนเต็มก็มีรายละเอียดมากเช่นกัน

แก้ไข 436 => 437

ต้องแก้ไขพื้นที่ว่างที่หายไปที่สังเกตเห็นโดย @OganM

ฉันสามารถลดเหลือ 428 แทนที่การแบ่งบรรทัดระหว่างตัวแปรด้วย;แต่โค้ด "หนึ่งแถว" ดูแย่มากและอ่านไม่ได้ฉันจะไม่โลภมาก


คุณต้องการและถ่านพิเศษสำหรับหมวกที่ 4
OganM

@OganM ขอบคุณสำหรับไบต์พิเศษนั้น! :( แก้ไขแล้ว
Molx

เมื่อทำ codegolf เรามักจะนับบรรทัดใหม่เป็นตัวละครตัวหนึ่ง (ตามที่อยู่ใน * ระวัง) เมื่อเทียบกับสองตัวอักษร (เช่นใน Windows) ดังนั้นจึงไม่สำคัญว่าคุณจะใช้เซมิโคลอนหรือขึ้นบรรทัดใหม่
ace_HongKongIndependence

@ace ขอบคุณสำหรับเคล็ดลับดีที่รู้!
Molx

8

Haskell, 361 306 289 ไบต์

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

การใช้งาน:

putStrLn $ p "12333321"

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

มันทำงานอย่างไร: จัดทำดัชนีองค์ประกอบของรายการทุกรายการ[hat options, left upper arm options, left eye options, ..., base options]ด้วยหมายเลขอินพุตที่สอดคล้องกันและต่อเข้ากับรายการเดียว ฉันแยกแขนซ้ายและขวาเป็นส่วนบนและส่วนล่างเพื่อที่ฉันจะได้สร้างมนุษย์หิมะทีละบรรทัด

11112211ที่ฉันชอบคือคลาสสิก

แก้ไข: เปลี่ยนจากรายการของสตริงเป็นสตริงสำหรับชิ้นส่วน (หมวก, ตา, ... ) ต้องการพารามิเตอร์ตัวที่สองความยาวของสตริงย่อยที่จะใช้

แก้ไข II: แยกสตริงย่อยทั่วไป


8

C, 233 230 ไบต์

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("");}}

ด้วยการขึ้นบรรทัดใหม่และพื้นที่ว่างเพื่อให้อ่านง่ายขึ้น:

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("");
    }
}

สิ่งทั้งหมดนั้นเป็นกำลังดุร้าย มันใช้ตารางที่มีหนึ่งรายการสำหรับแต่ละอักขระ 35 (5 บรรทัดที่มีความยาว 7) แต่ละรายการในตารางมีดังนี้:

  • ตัวละครอย่างต่อเนื่อง: (, ), ความยาวของรายการตารางคือ 1 ตัวอักษร
  • ดัชนีของส่วนของร่างกายตามด้วยอักขระที่เป็นไปได้ 4 ตัวขึ้นอยู่กับการเลือกชิ้นส่วนในอินพุต ความยาวของรายการตารางคือ 5 ตัวอักษร

รหัสจะวนซ้ำเกิน 35 อักขระและค้นหาค่าในตาราง


8

R 414 ไบต์

เวอร์ชั่นดัดแปลงของ Molx's เล็กน้อย

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="")}

เพิ่งรวมตัวแปรแยกเป็นหนึ่ง มีบางส่วนที่ใช้สำหรับX=c(ทำเป็นประจำ


7

CJam, 200 191 ไบต์

นี่สามารถเล่นกอล์ฟได้อย่างแน่นอน (พิเศษถ้าฉันเข้ารหัสพื้นฐาน) แต่ที่นี่จะเริ่มสำหรับ:

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

ข้อมูลเข้าสู่ STDIN ตัวอย่างเช่นอินพุต23232223ให้:

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

ลองออนไลน์ได้ที่นี่


7

Haskell, 333 ไบต์

ส่งครั้งแรกของฉัน! สร้างมนุษย์หิมะจากบนลงล่างซ้ายไปขวา ฉันแบ่งแขนออกเป็นสองฟังก์ชั่นสำหรับแต่ละแขนส่วนถัดจากหัวและส่วนถัดจากร่างกาย

ฟังก์ชั่น s รับรายการจำนวนเต็มและเชื่อมเอาท์พุทของฟังก์ชั่นที่สร้างส่วนต่างๆของร่างกายให้รายการย่อยที่ถูกต้องของอินพุต

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

มันขึ้นอยู่กับฟังก์ชั่น

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

ซึ่งส่งคืนองค์ประกอบที่ n ของรายการที่ได้รับ ซึ่งจะช่วยให้รายการหมวกใน a รวมถึงสิ่งที่ชอบ

k=y" /  "

ฟังก์ชั่นเหล่านี้ทั้งหมดใช้การลดเบต้าดังนั้นอาร์กิวเมนต์จะถูกส่งผ่านเป็นดัชนีไปยังฟังก์ชัน y

เอาท์พุท:

λ> s $ repeat 1

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

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

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

λ> s $ repeat 4
  ___ 
 (_*_)
 (- -) 
 (   ) 
 (   ) 

@ Calvin'sHobbies ขอบคุณฉันคิดว่าตอนนี้ฉันคงที่แล้ว
Craig Roy

7

Python 3, 349 336 254 251 ไบต์

มากสำหรับการทำวิทยานิพนธ์ของฉัน

นี่คือเนื้อหาของไฟล์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)]))

และนี่คือวิธีที่ฉันคิดในใจมนุษย์หิมะที่ชื่นชอบ:

s('11112311')

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

คำอธิบาย

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

คุณสามารถลบพื้นที่ในบรรทัดที่ 2 ระหว่างและ[int(i)] forในทำนองเดียวกันคุณสามารถเอาพื้นที่ในบรรทัดที่ 7 ระหว่างและf(int(i)) forนอกจากนี้ในprint()งบของคุณคุณไม่จำเป็นต้องพิมพ์ช่องว่างสุดท้าย - มันไม่ได้เป็นส่วนหนึ่งของมนุษย์หิมะ สุดท้ายเปลี่ยนprint()สายของคุณเป็นบรรทัดprint("{}\n{}({}{}{}){}\n{}({}){}\n ({})".format(*c))เดียว แต่ละเหล่านี้ควรจะช่วยให้คุณประหยัด 1 ไบต์ประหยัดทั้งหมด 4 ไบต์ :)
ace_HongKongIndependence

1
นอกจากนี้แทนที่จะใช้ตัวแปรโกลบอลnคุณสามารถกำหนดคุณลักษณะของฟังก์ชันfได้ เพื่อให้คุณสามารถเปลี่ยนสาย 5-6 ด้วย: <newline>def f(m):f.n+=1;return l[4*m+int(b[f.n])-1] f.n=-1สิ่งนี้จะลดขนาดอีก 3 ไบต์
ace_HongKongIndependence

1
@ace ขอบคุณไม่เคยได้ยินคุณลักษณะฟังก์ชั่นมาก่อนได้เรียนรู้สิ่งใหม่!
Matty

6

PowerShell , 199 ไบต์

แรงบันดาลใจจากReto Koradiและ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

ลองออนไลน์!

หมายเหตุ: บรรทัดที่ 3 มีช่องว่างเส้นทาง 2 เส้นบรรทัดที่ 4 มีพื้นที่ติดตาม

รายการโปรดของฉันคือ44444444"ยามรัสเซียง่วงนอน":

 ___
(_*_)
(- -)
(   )
(   )

5

JavaScript (ES6), 247

ไม่เป็นโฆษณาที่ดี @ @ NinjaBearMonkey :(

ทดสอบในตัวอย่าง (ด้วย 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>


3

05AB1E , 137 135 128 122 ไบต์

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

-6 ไบต์ขอบคุณที่@Grimy

ลองออนไลน์หรือตรวจสอบกรณีทดสอบอีกสองสามข้อ

คำอธิบาย:

ก่อนอื่นเราสร้างเทมเพลตสตริง:

…( )         # 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)"

ซึ่งมีลักษณะเช่นนี้:

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

จากนั้นฉันวนซ้ำตัวเลขของอินพุต:

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

และทำสิ่งต่อไปนี้:
กดดัชนี (0 ดัชนี) Nของรายการ:

  N          # Push the index of the loop

ผลักดันส่วนที่เป็นไปได้ทั้งหมดเป็นรายการของรายการตัวละคร:

  ”</[(
  ._-=:"ÆŸ,*”
            "# 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"],[" "," "," ","<","\"," "," ","/"],[" "," "," ",">","/"," "," ","\"],[" "," "," "," ",":"," ","]"," ","[",">"," ","<"],[" "," "," "," ",":"," ","""," ",""","_","_","_"]]

ใช้ดัชนีลูปNเพื่อรับรายการอักขระของส่วนที่เรากำลังทำงานกับ:

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

จากนั้นแบ่งรายชื่อตัวละครออกเป็นสี่ส่วนเท่า ๆ กันและใช้ตัวเลขy(ซึ่งเป็น 1 ดัชนี) เพื่อจัดทำดัชนี (หมายเหตุ: เนื่องจาก 05AB1E เป็นดัชนี 0 แต่อินพุตเป็น 1 ดัชนีจึงควรลดจำนวนหลักลง 1 ก่อนที่จะจัดทำดัชนีอย่างไรก็ตามเนื่องจาก 05AB1E มีการตัดคำอัตโนมัติ (เช่นการจัดทำดัชนี3ในรายการ[1,3,5]จะส่งผลให้1) หมุนชิ้นส่วนหนึ่งครั้งเพื่อให้ชิ้นส่วนที่มี nr 4 อยู่ในคำอธิบายการท้าทายอยู่ด้านหน้าของรายการ)

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

จากนั้นแทนที่ดัชนี 0 ดัชนีของลูปที่เราผลักไปตอนแรกทีละตัวด้วยอักขระส่วน:

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

และในที่สุดผลลัพธ์ก็คือผลลัพธ์โดยปริยาย

ดู 05AB1E เคล็ดลับของฉัน (ส่วนวิธีการบีบอัดจำนวนเต็มขนาดใหญ่และวิธีการบีบอัดรายการจำนวนเต็ม? )เพื่อทำความเข้าใจว่าส่วนการบีบอัดทำงานอย่างไร


สำหรับคนโปรดของฉันมันยังคงเป็น 'กระต่ายหิมะ' เหมือนเดิมเมื่อ 1.5 ปีก่อนเมื่อฉันโพสต์โซลูชัน Java ของฉัน :

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

-4เพียงพอที่จะเอาชนะ CJam!
Grimy

1
ลงไปที่ 122และใกล้เคียงกับสิ่งที่คุณมี
Grimy

@Grimy เวอร์ชัน 122 ไบต์ของคุณ0อยู่ระหว่างตา :)
Kevin Cruijssen

เพียงความผิดพลาดในการเข้ารหัสเบส -12 ควรจะง่ายต่อการแก้ไข!
Grimy

@Grimy คุณพูดถูก ฉันไม่ได้มีเวลามากเมื่อวานนี้ แต่แท้จริงแล้วมันเป็นวิธีแก้ไขที่ง่ายในรายการ ขอบคุณสำหรับ -6! :)
Kevin Cruijssen

2

Java 8, 548 545 432 401 399 ไบต์

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]);}

ลองที่นี่

คำอธิบาย:

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

ของโปรด:

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

ฉันไม่รู้ว่าทำไม แต่มันดูน่ารักดี เหมือนกระต่ายกับหมวกรัสเซียแทนหู


1

F #, 369 ไบต์

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]

ลองออนไลน์!

เพราะgใช้การเข้าถึงอาร์เรย์ที่ฉันจำเป็นต้องระบุอย่างชัดเจนชนิดในความหมายฟังก์ชั่นเป็นที่ซึ่งเป็นเหตุผลที่นิยามฟังก์ชันมีstring(g:string)

นอกเหนือจากนั้นก็มักจะเป็นอาร์เรย์ของการstringsเข้าถึงโดยดัชนี หมวก, แขนซ้ายและขวาซึ่งจะไปตามเส้นที่แยกกันจะถูกแบ่งออกเป็นอาร์เรย์ด้านบนและด้านล่างแยกต่างหาก iฟังก์ชั่นการเปลี่ยนแปลงจำนวนในการโต้เถียงที่gเข้าไปในดัชนีอาร์เรย์ และตัวอักษรbจะแทนที่สตริงหนึ่งช่องว่างในอาร์เรย์

ท้าทายมาก! มนุษย์หิมะที่ชื่นชอบน่าจะเป็น242244113:

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

ฉันกำลังดูคุณอยู่


1

PHP, 378 ไบต์

<?$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)');

ลองออนไลน์!

ฉันชอบนายนกฮูกที่ชาญฉลาด 31333342

   _ 
  /_\ 
 (O,O) 
/(   )\
 (" ")

1

Python 2.7, 257 ไบต์ (ฉันคิดว่า)

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

โดยที่ 'i' คืออินพุตเป็นสตริง (เช่น "13243213")


2
ยินดีต้อนรับสู่ PPCG! มันเกิดขึ้นมันคือ 256 ไบต์ น่าเสียดายที่คุณไม่สามารถสรุปได้ว่าอินพุตถูกเก็บไว้ในตัวแปร แต่คุณสามารถแทนที่iสำหรับinput()รวมเป็น 262 ไบต์
H.PWiz

0

โผ 307 ไบต์

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]]})';}

ลองออนไลน์!


0

Zsh, 247 ไบต์

ลองออนไลน์ !!

(){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}

ชอบมนุษย์หิมะ:

43232122 Cossack dancer
  ___
 (_*_)
\(o_O) 
 (] [)>
 (" ")
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.