Ladybugs สมมาตร


22

บทนำ:

เมื่อเราคิดถึง Ladybugs เรามักจะคิดถึงแมลงสีแดงหรือสีส้มเข้มที่มีจุดด่างดำ แม้ว่าสิ่งนี้ไม่จำเป็นจริงเนื่องจากมีLadybugs ด่างดำสีแดง / ส้มหรือLadybugs ที่ไม่มีจุดเลยเราจึงแสดงภาพ Ladybugs เป็นส่วนใหญ่เช่น Asian Ladybug นี้:

ป้อนคำอธิบายรูปภาพที่นี่

อีกสิ่งที่ควรทราบก็คือจุดที่เกี่ยวกับ ladybugs นั้นมักจะสมมาตรอยู่เสมอ และนี่คือที่มาของความท้าทายนี้

ท้าทาย:

รับจำนวนเต็มn( >= 0) ส่งออกเต่าทอง ASCII ศิลปะต่อไปนี้หนึ่งครั้งหรือหลายครั้งโดยมีจุดสมมาตรแบ่งเท่า ๆ กันระหว่างทั้งสองด้านเช่นเดียวกับ Ladybugs สองคนขึ้นไป

นี่คือเลย์เอาต์ Ladybug เริ่มต้น:

    _V_ 
  /(@I@)\
 /   |   \
|    |    |
 \   |   /
  ''-!-''

หากn=0เราแสดงผลเต่าทองด้านบนตามที่เป็นอยู่

เมื่อnมีขนาดใหญ่กว่าศูนย์เรากรอกในช่องว่างของข้อผิดพลาด ASCII ศิลปะที่มีตัวพิมพ์เล็กoหรือแทนที่ในศูนย์ที่มีทุน| Oเป้าหมายคือทำการnเปลี่ยนแปลง 'เต่าทอง' ว่าง 'ในขณะที่ยังคงสร้างเอาต์พุตแบบสมมาตร (ต่อเต่าทอง) และให้ผลผลิตเต่าทองน้อยที่สุดเท่าที่จะทำได้

ดังนั้นผลลัพธ์ที่ถูกต้องn=1คือ:

    _V_ 
  /(@I@)\
 /   O   \
|    |    |
 \   |   /
  ''-!-''

    _V_ 
  /(@I@)\
 /   |   \
|    O    |
 \   |   /
  ''-!-''

    _V_ 
  /(@I@)\
 /   |   \
|    |    |
 \   O   /
  ''-!-''

แต่สิ่งนี้จะไม่ถูกต้อง:

    _V_ 
  /(@I@)\
 /   |   \
| o  |    |
 \   |   /
  ''-!-''

ผลลัพธ์ที่ถูกต้องสำหรับn=2คือ:

    _V_ 
  /(@I@)\
 /   O   \
|    O    |
 \   |   /
  ''-!-''

    _V_ 
  /(@I@)\
 /   O   \
|    |    |
 \   O   /
  ''-!-''

    _V_ 
  /(@I@)\
 /  o|o  \
|    |    |
 \   |   /
  ''-!-''

    _V_ 
  /(@I@)\
 /   |   \
| o  |  o |
 \   |   /
  ''-!-''

etc. There are a lot of possible outputs.

ครั้งแรกที่ไม่ได้เป็นไปได้ที่จะปรับตัวให้เข้าเต่าทองเดียวอีกต่อไปn n=24ในกรณีนี้คุณจะต้องแบ่งมันให้เท่ากันเท่าที่จะทำได้เป็นสอง ladybugs (คุณสามารถเลือกได้ว่าจะเอามันออกมาติดกันหรือแยกกัน - โดยเลือกหนึ่งช่องว่างหรือหนึ่งบรรทัดใหม่ในระหว่างนั้น) ตัวอย่างเช่น:

    _V_        _V_ 
  /(@I@)\    /(@I@)\
 /o o|o o\  /o o|o o\
|o o | o o||o o | o o|
 \o o|o o/  \o o|o o/
  ''-!-''    ''-!-''

หรือ:

    _V_ 
  /(@I@)\
 /ooo|ooo\
|    |    |
 \ooo|ooo/
  ''-!-''
    _V_ 
  /(@I@)\
 /ooo|ooo\
|    |    |
 \ooo|ooo/
  ''-!-''

กฏท้าทาย:

  • n0-1000จะอยู่ในช่วงของ
  • คุณสามารถเลือกที่จะส่งออกไปยัง STDOUT กลับมาเป็นสตริงหรือรายการอาร์เรย์ / 2D-char ฯลฯ การโทรของคุณ
  • ไม่อนุญาตให้นำบรรทัดใหม่หรือช่องว่างที่ไม่จำเป็นออกมา อนุญาตให้ใช้ช่องว่างสีขาวและบรรทัดใหม่ต่อท้ายบรรทัดเดียว
  • ดังที่ได้กล่าวไว้ข้างต้นเมื่อจำเป็นต้องใส่ Ladybugs สองตัวขึ้นไปคุณสามารถเลือกได้ว่าจะเอาท์พุทถัดจากกันและกันหรือต่ำกว่ากัน (หรือทั้งสองอย่างผสมกัน .. )
  • เมื่อมีการพิมพ์ Ladybugs สองตัวขึ้นไปอยู่ติดกันจะอนุญาตให้มีพื้นที่ตัวเลือกเดียวในระหว่างนั้น เมื่อมีการพิมพ์ Ladybugs สองตัวขึ้นไปจะมีบรรทัดใหม่ที่เป็นทางเลือกหนึ่งบรรทัดในระหว่างนั้น
  • คุณสามารถเลือกรูปแบบของ ladybugs ที่ในขั้นตอนใด ๆ nในระหว่างลำดับตราบเท่าที่พวกเขามีความสมมาตรและเท่ากับการป้อนข้อมูล
  • เนื่องจากเป้าหมายคือการมีnการเปลี่ยนแปลงและเป็น ladybugs n=23น้อยที่สุดคุณจะเริ่มใช้มากกว่าหนึ่งเต่าทองเมื่อข้างต้น เลย์เอาต์ของ Ladybugs เหล่านี้ไม่จำเป็นต้องเหมือนกัน ในความเป็นจริงมันเป็นไปไม่ได้สำหรับบางอินพุตเช่นn=25หรือn=50เพื่อตั้งชื่อสอง
  • นอกจากนี้บางครั้งมันเป็นไปไม่ได้ที่จะแบ่งจุดระหว่างเต่าทองสองตัวหรือมากกว่านั้นอย่างเท่าเทียมกัน ในกรณีนี้คุณจะต้องแยกพวกเขาให้เท่ากันที่สุดเท่าที่จะเป็นไปได้โดยมีความแตกต่างระหว่าง 1 อย่างมากที่สุด

ดังนั้นสำหรับn=50การรักษากฎสองข้อสุดท้ายนี้จะเป็นผลลัพธ์ที่เป็นไปได้ที่ถูกต้อง (ที่ข้อผิดพลาดแรกมี 16 สปอตและอีกสองมี 17):

    _V_        _V_        _V_ 
  /(@I@)\    /(@I@)\    /(@I@)\
 /oooOooo\  /   O   \  /o oOo o\
|ooooOoooo||ooooOoooo||o ooOoo o|
 \   |   /  \oooOooo/  \o oOo o/
  ''-!-''    ''-!-''    ''-!-''

กฎทั่วไป:

  • นี่คือดังนั้นคำตอบที่สั้นที่สุดในจำนวนไบต์ชนะ
    อย่าปล่อยให้ภาษาโค้ดกอล์ฟกีดกันคุณจากการโพสต์คำตอบด้วยภาษาที่ไม่ได้เข้ารหัส พยายามหาคำตอบสั้น ๆ ที่เป็นไปได้สำหรับภาษาโปรแกรม 'ใด ๆ '
  • กฎมาตรฐานจะใช้สำหรับคำตอบของคุณดังนั้นคุณจึงได้รับอนุญาตให้ใช้ STDIN / STDOUT ฟังก์ชั่น / วิธีการที่มีพารามิเตอร์ที่เหมาะสมและชนิดผลตอบแทนโปรแกรมเต็มรูปแบบ การโทรของคุณ
  • ช่องโหว่เริ่มต้นเป็นสิ่งต้องห้าม
  • หากเป็นไปได้โปรดเพิ่มลิงค์พร้อมทดสอบรหัสของคุณ
  • นอกจากนี้โปรดเพิ่มคำอธิบายหากจำเป็น

คุณหมายถึง "การเปลี่ยนแปลงน้อยที่สุดเท่าที่จะทำได้" กับเต่าทองที่ว่างเปล่า เมื่อวางตัวอักษร n (<24) ตัวอักษร o / O ลงในเต่าทองหนึ่งตัวคุณจะทำการเปลี่ยนแปลง n หรือคุณหมายถึงการเปลี่ยนแปลงจาก n-1 เป็น n (ดังนั้นผลลัพธ์จะแตกต่างกันไปโดยน้อยที่สุดเมื่ออินพุตแตกต่างกัน 1)?
Heimdall

@Heimdall Ah ขอโทษสำหรับความสับสนเนื่องจากการใช้ถ้อยคำที่ไม่ดี นี่คือตอนที่ฉันมีความคิดที่จะช่วยให้ตัวละครในรูปแบบหลายจุดหนึ่งเมื่อฉันคิดของความท้าทายนี้ แต่ฉันลดลงนี้และเพิ่งมีการใช้oและการOแทน ฉันเปลี่ยนถ้อยคำเล็กน้อย
Kevin Cruijssen

สำหรับn=50ตัวอย่างเช่นผมเชื่อว่าคุณหมายถึงข้อผิดพลาดครั้งแรกมี 16 จุดและอีกสองแต่ละคนมี 17
จอนซานตาคลอส

นี่คืออัลบั้ม Jimi Hendrix ที่ฉันโปรดปราน
Reinstate Monica iamnotmaynard

@iamnotmaynard บางทีฉันอาจพลาดบางสิ่งบางอย่างที่ชัดเจนหรือคุณแสดงความคิดเห็นเกี่ยวกับความท้าทายที่ผิดหรือเปล่า? ฉันไม่เห็นความเชื่อมโยงระหว่าง Jimi Hendrix กับ ladybugs จริงๆ ..
Kevin Cruijssen

คำตอบ:


5

ถ่าน , 84 81 ไบต์

Nθ≔⌈∕∨θ¹¦²³ηFη«≔⁺÷θη‹ι﹪θηζV_¶I@)↘²↙|/←''-↑!↑⎇›ζ²¹OO²§|OζE037×o⌊⟦⁻÷ζ²Iκ⁺³⁼κ3⟧↙»‖B←

ลองออนไลน์! การเชื่อมโยงคือการใช้รหัสเวอร์ชันอย่างละเอียด คำอธิบาย:

Nθ

ใส่จำนวนสปอตทั้งหมด

≔⌈∕∨θ¹¦²³η

คำนวณจำนวนของ ladybirds ที่ต้องการ

Fη«

วนรอบแต่ละเต่าทอง

≔⁺÷θη‹ι﹪θηζ

คำนวณจำนวนจุดที่จะใส่เต่าทองนี้

V_¶I@)↘²↙|/←''-↑!

พิมพ์หัวและปีกขวาของเต่าทอง

↑⎇›ζ²¹OO²

หากมีมากกว่า 21 จุดให้พิมพ์สองจุดหรือพิมพ์ด้านหลัง

§|Oζ

หากจำนวนจุดพิมพ์ผิดปกติจุดอื่นจะพิมพ์ส่วนหลังที่เหลือ

E037×o⌊⟦⁻÷ζ²Iκ⁺³⁼κ3⟧

แบ่งจำนวนของจุดสองจุดและแจกจ่ายในสามแถวของ 3, 4 และ 3 จุด

↙»

ย้ายไปที่จุดเริ่มต้นของเต่าทองตัวถัดไป

‖B←

สะท้อนผืนผ้าใบไปทางซ้ายโดยรักษาด้านหลังไว้


8

Python 2 , 252 249 238 212 211 213 209 ไบต์

n=input()
x=(n+22)/23or 1
for i in range(x):b=n/x+(n%x>i);c=r"""    _V_
  /(@I@)\
 /361%s163\
|408717804|
 \5201025/
  ''-!-''"""%'|O'[b%2];i=0;exec"c=c.replace(`i%9`,' |oO'[i>9::2][i<b/2],2);i+=1;"*11;print c

ลองออนไลน์!

  • บันทึกแล้ว 9 ไบต์ขอบคุณ Kevin Cruijssen
  • บันทึกแล้ว 18 ไบต์ขอบคุณ Mr. Xcoder
  • บันทึก 2 ไบต์ขอบคุณ Jonathan Frech

ฉันคิดว่าคุณสามารถลบ.replace('A','|O'[b%2])และใช้c=" _V_\n /(@I@)\ \n /361"+'|O'[b%2]+"163\ \n|4087B7804|\n \\529B925/\n ''-!-''"แทนได้หรือไม่
Kevin Cruijssen

230 ไบต์โดยเปลี่ยน[' o','|O'][i>9]เป็น' |oO'[i>9::2]และใช้|แทนโลจิคัลหรือ เปลี่ยนfor i in range(11)เป็นexecคำสั่งบันทึก 4 ไบต์
นาย Xcoder

1
และขออภัยสำหรับความคิดเห็นที่ยุ่งเหยิง แต่218 ไบต์โดยการผสมความเข้าใจในรายการของคุณกับforลูปเอาตัวแปรที่ไม่จำเป็นออกเช่นกัน
นาย Xcoder

@ Mr.Xcoder ขอบคุณมาก :)
TFeld

มันควรจะผลิต ladybugs ที่น้อยที่สุดเท่าที่จะทำได้ใช่ไหม เมื่อฉันใส่ 24 ถึง 46 ใน TIO มันให้ 3 ladybugs แทนสอง
Nick Matteo

7

JavaScript (ES6), 183 186 ไบต์

ใช้สูตรเดียวกันกับคำตอบของ TFeldเพื่อแยกจุดในระหว่างตัว Ladybugs

n=>(g=k=>k--?`    _V_
  /(@I@)\\
 /3\\
|4|
 \\3/
  ''-!-''
`.replace(/\d/g,i=>(h=s=>i--?h((p=N?(N-=2,'o'):' ')+s+p):s)('|O'[N>2*i|N&1&&+!!N--]),N=(n%j>k)+n/j|0)+g(k):'')(j=n/23+.99|0||1)

การสาธิต


6

Befunge, 292 279 ไบต์

#j07-00p&>::1-27*9+/\!!*:1+06pv-1_@#:<<g61$<<:
v"h"**95%2:+`g61%g60\/g60::p61<>-0g*+35*-,:!|
>\-30p2/:55+`:59**"g"\-40p-26pv^*84\!`"."::<<9
v\%+55+g62:%+55+4*g62:::-1<+55<>:"/n"$#->#<^#<
>`26g!+"O"*"Y"\-\-\5+0p:>#^_" 66<0<66// >,-"v
"n //>7OXO8k />'&%$%&'k !(*+)#)+*(! /k,-.$."<v

ลองออนไลน์!

คำอธิบาย

ASCII art สำหรับเต่าทองนั้นมีการเข้ารหัสในสตริง Befunge เดียวโดยมีค่าชดเชย 15 เพื่อให้สามารถสำรองอักขระ 15 ตัวแรกที่พิมพ์ได้สำหรับวัตถุประสงค์พิเศษ อักขระพิเศษสองตัวแรกแสดงถึงการขึ้นบรรทัดใหม่และ|อักขระซึ่งทั้งสองอย่างนั้นจะไม่สามารถพิมพ์ได้ ที่สามไม่ได้ใช้เพราะมันเป็น"ซึ่งไม่สามารถใช้ในสตริง สองคนถัดไปเป็นตัวแทนของจุดใหญ่ในศูนย์ และอีกสิบที่เหลืออยู่สำหรับจุดที่ปีก

อักขระพิเศษเหล่านี้จะถูกแปลเป็นรูปแบบสุดท้ายของพวกเขาผ่านตารางการค้นหาซึ่งเขียนทับส่วนแรกของบรรทัดแรก

เพื่อให้ง่ายต่อการอธิบายนี่เป็นรหัสที่มีการเน้นส่วนประกอบต่างๆ:

ซอร์สโค้ดที่มีไฮไลต์พา ธ การเรียกใช้งาน

* * * *เราเริ่มต้นด้วยการเริ่มต้นบรรทัดใหม่และ|ตัวละครในตารางการค้นหาเนื่องจากสิ่งเหล่านี้เป็นค่าคงที่
* * * *ต่อไปเราอ่านจำนวนสปอตจาก stdin และคำนวณจำนวน ladybugs ที่ต้องการ
* * * *จากนั้นเราสามารถเริ่มวงรอบนอกสำหรับชุดของข้อบกพร่องการคำนวณจำนวนของจุดสำหรับ Ladybug ต่อไปที่จะแสดงผล
* * * *สำหรับเต่าทองแต่ละตัวเราคำนวณว่าจะต้องแสดงจุดกึ่งกลางขนาดใหญ่ (ถ้าspots%2 == 1) และเขียนค่าที่เหมาะสมลงในตารางการค้นหาหรือไม่ ส่วนสุดท้ายของการเริ่มต้นตารางการค้นหาคือการวนรอบที่คำนวณจุดเล็ก ๆ ที่ต้องแสดง โดยพื้นฐานแล้วอัลกอริธึมคือ: ถ้าหากต้องการแสดงจุดนั้น
* * * *ในทำนองเดียวกันเราคำนวณว่าจะต้องแสดงคู่ของจุดที่มีขนาดใหญ่อีกคู่หรือไม่ (ถ้าspots/2 > 10) ให้อัปเดตตารางการค้นหาอีกครั้ง นอกจากนี้เรายังคำนวณจุดที่เหลือที่จำเป็นสำหรับแต่ละปีก
* * * *(spotnum*spotcount+4)%10 > ((spotnum+1)*spotcount+4)%10
* * * *ต่อไปเราจะกดการแสดงสตริงที่เข้ารหัสของเต่าทองลงบนสแต็ก นี่เป็นเพียงสตริงธรรมดา แต่มันก็ซับซ้อนเล็กน้อยเมื่อฉันพยายามบีบลงในช่องว่างในรหัสเพื่อให้แหล่งที่มาเป็นรูปสี่เหลี่ยมผืนผ้า
* * * *ณ จุดนี้เราพร้อมที่จะเริ่มลูปเอาท์พุทประมวลผลอักขระทีละตัวแปลงกรณีพิเศษ (จุดแบ่งบรรทัดและอื่น ๆ ) ผ่านตารางการค้นหาที่สร้างขึ้นก่อนหน้านี้
* * * *ในที่สุดเราตรวจสอบว่าเราได้แสดง ladybugs ที่จำเป็นทั้งหมดหรือไม่หรือกลับไปที่จุดเริ่มต้นของลูปด้านนอก


ดีฉันชอบรูปแบบที่ Ladybugs ของคุณมีในแต่ละขั้นตอนตั้งแต่ 1-23 ค่อนข้างแตกต่างจากคำตอบอื่น ๆ +1 จากฉัน คุณจะช่วยเพิ่มคำอธิบาย (หลังจากที่คุณเล่นกอล์ฟต่อไปได้)
Kevin Cruijssen

1
ฉันดีใจที่คุณชอบรูปแบบ จริง ๆ แล้วฉันใช้เวลาค่อนข้างมากในการลองชุดค่าผสมที่แตกต่างกันเพื่อค้นหาอัลกอริทึมที่ดูดีในหลาย ๆ ขั้นตอนมากที่สุด เพิ่มคำอธิบายของคำตอบของฉันลงไปเล็กน้อย
James Holderness

3

ทับทิม , 203 193 190 ไบต์

f=->n{s=%q{    _V_ 
  /(@I@)\
 /137x731\
|0596x6950|
 \248x842/
  ''-!-''
}
n-=d=n>0?n/(1+~-n/23):0
s.gsub!(/\d/){$&.to_i<d/2??o:' '}
x=[d%2,d<=>21]*2
s.gsub!(?x){"|O|"[x.pop]}
n>0?s+f[n]:s}

ลองออนไลน์!

  • บันทึก 10 ไบต์ขอบคุณจอร์แดน

{|m|m.สามารถแทนที่ด้วย{$&.; b=(n-1)/23+1สามารถแทนที่ด้วยb=1+~-n/23; และสามารถถูกแทนที่ด้วยx=[z=d>21,d%2>0,z]⏎s.gsub!(?x){x.pop ? ?O:?|} x=[d%2,d<=>21]*2⏎s.gsub!(?x){"|O|"[x.pop]}
จอร์แดน

คุณสามารถบันทึกไบต์อื่นโดยใช้%q{XY}แทน'X'+"Y"ในแปดสายแรกและคู่มากขึ้นโดยการทำแทนd=n>0?n/(b=1+~-n/23):b=0 n>0?d=n/(b=(n-1)/23+1):d=b=0
Jordan

@ จอร์แดนว้าวขอบคุณ
Reinstate Monica iamnotmaynard
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.