ฉันต้องการรังผึ้ง


39

เขียนโปรแกรมที่สั้นที่สุดที่พิมพ์ส่วนศิลปะ ASCII ของการเรียงต่อหกเหลี่ยมหรือรวงผึ้ง :

       __
    __/  \__
 __/  \__/  \__
/  \__/  \__/  \
\__/  \__/  \__/
/  \__/  \__/  \
\__/  \__/  \__/
/  \__/  \__/  \
\__/  \__/  \__/
   \__/  \__/
      \__/
  • ไม่ควรป้อนข้อมูลใด ๆ
  • ส่งออกไปยัง stdout หรือทางเลือกที่ใกล้เคียงที่สุดในภาษาของคุณ
  • แทนที่จะเป็นโปรแกรมคุณสามารถเขียนฟังก์ชั่นที่มีชื่อซึ่งไม่มีพารามิเตอร์และพิมพ์ผลลัพธ์ได้ตามปกติหรือส่งกลับเป็นสตริง
  • เอาต์พุตอาจมีจำนวนบรรทัดใหม่นำหน้าและ / หรือลากขึ้นบรรทัดใหม่และแต่ละบรรทัดในเอาต์พุตอาจมีช่องว่างนำหน้าและ / หรือช่องว่างจำนวนเท่าใดก็ได้ (ตราบใดที่ลวดลายขึ้นอย่างถูกต้อง)
  • รหัสที่สั้นที่สุดในหน่วยไบต์ชนะ

13
คุณเล่น Catan เยอะไหม?
user3490

@ user3490 อันที่จริงฉันทำ ^^
งานอดิเรกของ Calvin

2
สัปดาห์ถัดไปบน PCG: เขียนตัวสร้างบอร์ด Catan หรือไม่
user3490

7
ควรมีอินพุต IMO ในกรณีของคุณควรเป็น 3
user3819867

3
@ user3819867 ฉันได้พิจารณาแล้ว แต่ต้องการสิ่งนี้ มันสายเกินไปที่จะเปลี่ยนแปลง แต่ไม่สายเกินไปที่ใคร ๆ ก็จะต้องทำการท้าทาย
งานอดิเรกของ Calvin

คำตอบ:


33

CJam, 45 43 42 41 40 ไบต์

741e8 36+Ab"\__/  "38*21/.{G2$-<\S*.e<N}

ลองใช้ออนไลน์ในล่าม CJam

มันทำงานอย่างไร

"\__/  "38*21/

ซ้ำรูปแบบ\__/ 38ครั้งและแยกมันเป็นชิ้นความยาว21 หากชิ้นข้อมูลถูกคั่นด้วย linefeeds นี่จะเป็นผลลัพธ์:

\__/  \__/  \__/  \__
/  \__/  \__/  \__/  
\__/  \__/  \__/  \__
/  \__/  \__/  \__/  
\__/  \__/  \__/  \__
/  \__/  \__/  \__/  
\__/  \__/  \__/  \__
/  \__/  \__/  \__/  
\__/  \__/  \__/  \__
/  \__/  \__/  \__/  
\__/  \__/  \__/  

มันมีรังผึ้งที่ต้องการอย่างชัดเจน สิ่งที่เหลืออยู่ที่ต้องทำคือการแทนที่ตัวละครบางตัวด้วยช่องว่างตัดออกบางคนและแนะนำ linefeeds จริง ๆ

741e8 36+Ab

สร้างจำนวนเต็ม74 100 000 036และแปลงเป็นอาร์เรย์[7 4 1 0 0 0 0 0 0 3 6] แต่ละองค์ประกอบอาร์เรย์จะเข้ารหัสจำนวนอักขระนำของบรรทัดที่สอดคล้องกันซึ่งจะต้องถูกแทนที่ด้วยช่องว่าง โดยการลบจำนวนนี้จาก16เรายังได้ความยาวที่ถูกต้องสำหรับบรรทัดนี้

.{            } e# Execute for each pair of a digit D and a line L:
  G2$-<         e#   Chop off L after 16 - D characters.
       \S*      e#   Push a string of D spaces.
          .e<   e#   Compute the vectorized minimum.
             N  e#   Push a linefeed.

เนื่องจากช่องว่างมีจุดโค้ดที่ต่ำกว่าอักขระอื่นของLและตัวดำเนินการ vectorized ปล่อยให้อักขระของสตริงที่ยาวกว่าซึ่งไม่สอดคล้องกับหนึ่งในอันที่สั้นกว่าที่ไม่ถูกแตะต้อง.e<แทนที่ตัวอักษรDตัวแรกด้วยช่องว่าง


2
อันนี้ยอดเยี่ยม ทำได้ดีมาก
Alex A.

28

Python 2, 73

i=0
exec"k=max(7-i,i-24,0);print' '*k+('\__/  '*9)[i:][k:16-k];i+=3;"*11

เห็นมันวิ่ง

สำหรับแต่ละแถวเอาต์พุต 11 แถวให้คำนวณจำนวนของช่องว่างนำหน้าkด้วยจำนวนฟังก์ชันเชิงเส้นสูงสุดสามฟังก์ชันที่รวมเป็นซองจดหมายทางด้านซ้ายของรูปหกเหลี่ยม เพราะเส้นทแยงมีความลาดชัน3และมันจะดีกว่าที่จะสร้างดัชนีหมายเลขแถวเป็น-3i=0,3,...30

เพื่อสร้างตาข่ายหกเหลี่ยมเราแรกกระเบื้องหน่วย'\__/ 'เพียงพอ จากนั้นเลื่อนการจัดตำแหน่งใหม่[i:]เป็น 3 สำหรับแถวคี่ สุดท้ายเราใช้เวลาส่วนที่จำเป็น[k:16-k]ของมันออกจากขอบของkด้านซ้ายและขวา


22

CJam, 65 56 55 ไบต์

"Ý6TNð*¯5"303b4b["/\_")"_ "4*S]f=sB/z{_W%"\/"_W%erN}/

ลองใช้ออนไลน์ในล่าม CJam

ความคิด

ครึ่งขวาของแต่ละบรรทัดคือสำเนาที่กลับด้านของครึ่งซ้ายด้วยเครื่องหมายทับและแบ็กสแลชที่สลับ ดังนั้นจึงพอเพียงที่จะเข้ารหัสครึ่งซ้ายของรวงผึ้ง:

       _
    __/ 
 __/  \_
/  \__/ 
\__/  \_
/  \__/ 
\__/  \_
/  \__/ 
\__/  \_
   \__/ 
      \_

แทนที่จะวิเคราะห์รูปแบบนี้ทีละบรรทัดเราสามารถวิเคราะห์ทีละคอลัมน์:

   /\/\/\  
  _ _ _ _  
  _ _ _ _  
  /\/\/\/\ 
 _ _ _ _ _ 
 _ _ _ _ _ 
 /\/\/\/\/\
_ _ _ _ _ _

รูปแบบที่ชัดเจนเกิดขึ้น:

  • สตริง_ _ _ _เกิดขึ้นห้าครั้ง
  • ทุกคนจะตามด้วย/\

โดยการเปลี่ยนทุก/\, _, _ _ _ _และพื้นที่ที่มีจำนวน 0-3 เราสามารถแปลงอาร์เรย์ที่เกิดจากตัวเลขฐาน 4 กับฐานที่สูงขึ้นและการจัดเก็บรูปแบบที่สมบูรณ์แบบในแฟชั่นที่มีขนาดกะทัดรัด

รหัส

"Ý6TNð*¯5"303b4b  e# Convert the string from base 303 to base 4.
["/\_")"_ "4*S]f= e# Replace each resulting digit by the corresponding item of the array
                  e# ["/\" "_" "_ _ _ _ " " "].
sB/               e# Split into strings of length 11.
z                 e# Zip: transpose rows with columns.
{             }/  e# For each string:
 _W%              e#     Push a reversed copy.
    "\/"_W%er     e#     Swap slashes and backslashes.
             N    e#     Push a linefeed.

10

C, 148 144 140 140 ไบต์

k,r,c,d,p;f(){for(;k<187;k++){r=k/17;c=k%17;d=c+r%2*3;p=3*r+c-7<33u&3*r-c+8<33u;putchar(c==16?10:p&(d+5)%6<2?95:p&d%6==3?47:!p|d%6?32:92);}}

ด้วยช่องว่างโดยไม่มีคำเตือนของคอมไพเลอร์และก่อนที่จะมีการปรับแต่งโค้ดเพื่อบันทึกสองสามไบต์:

#include <stdio.h>

int k, r, c, d, p;

void f() {
    for ( ; k < 187; k++) {
        r = k / 17;
        c = k % 17;
        d = c + 3 * (r % 2);
        p = 3 * r + c - 7 < 33u && 3 * r - c + 8 < 33u;
        putchar(
            c == 16 ? 10 :
            p && (d + 5) % 6 < 2 ? 95 :
            p && d % 6 == 3 ? 47 :
            p && d % 6 == 0 ? 92 :
            32);
    }
}

วิธีนี้ไม่ได้ใช้ตารางอักขระ / สตริงใด ๆ มันวนซ้ำไปมาทั้งหมด 187 (11 แถว, 17 คอลัมน์รวมถึงการขึ้นบรรทัดใหม่) และตัดสินใจว่าอักขระตัวใดที่จะพิมพ์สำหรับแต่ละตำแหน่ง

เงื่อนไขรวมถึงการทดสอบการเป็นภายใน / ภายนอก 4 มุมโดยใช้สมการเส้น 4 pกับผลที่ได้เก็บไว้ในตัวแปร ส่วนที่เหลือนั้นส่วนใหญ่จะทำซ้ำทุก 6 ตัวอักษรโดยที่แถวคี่ถูกเลื่อนด้วย 3 ตัวอักษรเทียบกับแถวคู่


2
สำหรับคนแข็งแรงเล่นกอล์ฟคุณสามารถใช้โดยปริยาย-int int และวาง
luser droog

ไม่กี่ไมโครปรับปรุง:k;f(r,c,d,p){for(;k<187;putchar(c>15?10:p&d<2&p?95:p&d<3?47:!p|d-5?32:92))r=k/17,c=k++%17,d=(5+c+r%2*3)%6,p=3*r+c-7<33u&3*r-c+8<33u;}
เดนนิส


6

JavaScript (ES6), 129 130

นั่นเป็นสตริงบริสุทธิ์แทนที่ / แทนที่ / แทนที่ ... ไม่ได้ใช้ประโยชน์จากคุณสมบัติทางเรขาคณิตใด ๆ

การใช้สตริงเท็มเพลตบรรทัดใหม่ทั้งหมดมีความสำคัญและนับ

เรียกใช้ส่วนย่อยใน Firefox เพื่อทดสอบ

f=_=>`70
405
 055
9992 3051
6301`[R='replace'](/9/g,`55123
30551
`)[R](/5/g,1230)[R](/\d/g,n=>['__','/',,'\\'][n]||' '.repeat(n))

// TEST

O.innerHTML = f()
<pre id=O></pre>


6

PHP - 139 137 107 101 91 87 87 ไบต์

ฉันไม่รู้ว่านี่เป็นวิธีที่ดีที่สุดในการเล่นกอล์ฟหรือไม่ แต่นี่คือความพยายามของฉัน:

30 36 46 -50 bytes ขอบคุณ Ismael Miguel

ทดสอบออนไลน์ได้ที่นี่

<?='       __
    __',$a='/  \__',"
 __$a$a
",$c="$a$a/  \
\__$a$a/
","$c$c   \__$a/
      \__/";

<script src="http://ideone.com/e.js/WHWEZS" type="text/javascript" ></script>

รหัสเก่า:

<?php $a="/  \\__";$c=$a.$a."/  \\\n\__".$a.$a."/\n";echo "       __\n    __".$a."\n __".$a,$a."\n".$c,$c,$c."   \\__".$a."/\n      \\__/";

ยินดีต้อนรับสู่การเขียนโปรแกรมปริศนาและรหัสกอล์ฟ รหัส PHP ของคุณสามารถลดลงได้อีกมาก คุณสามารถใช้<?แทน <?phpการบันทึก 3 ไบต์ แทนที่จะ$c=$a.$a."/ \\\n\__".$a.$a."/\n";คุณสามารถเขียน$c="$a$a/ \\\n\__.$a$a/\n";(ตั้งแต่ PHP ขยายตัวแปรในสตริง) คุณสามารถใช้ตรรกะเดียวกันกับechoเพื่อลดความยาว นอกจากนี้คุณไม่ต้องการช่องว่างระหว่างechoและสตริง
Ismael Miguel

1
ขอบคุณฉันเรียนรู้สิ่งใหม่ทุกครั้งที่ฉันพยายามตีกอล์ฟฮิฮิ
Timo

ยินดี. นี่คือวิธีการแก้ปัญหาระยะยาว 99 ไบต์: ideone.com/WHWEZS มันดูเป็นระเบียบ แต่มันสั้นกว่าเยอะ แทนที่จะใช้\nคุณสามารถใส่ บรรทัดใหม่จริงและบันทึก 1 ไบต์ต่อบรรทัด
Ismael Miguel

ในขณะเดียวกันฉันได้ลดขนาด 2 ไบต์ลง ตอนนี้มันมี 97 ไบต์
Ismael Miguel

1
<?="\t __\n\t__",$a='/ \__',"\n __$a$a\n",$c="$a$a/ \\\n\__$a$a/\n","$c$c \__$a/\n\t \__/";นี่คือหนึ่งซับ: อย่าลืมแทนที่\tด้วยอักขระแท็บและขึ้น\nบรรทัดใหม่จริง
Ismael Miguel

4

ลัวะ 146

T="       __\n    __/  \\__\n __/  \\__/  \\__\n"
S="/  \\__/  \\__/  \\\n\\__/  \\__/  \\__/\n"
B="   \\__/  \\__/\n      \\__/"
io.write(T,S,S,S,B)

(เพิ่มบรรทัดใหม่เพื่อความชัดเจน)


1
รหัสนี้ไม่ยาวกว่าเอาท์พุทที่ต้องการเพราะมันมีแค่เอาต์พุตบวกกับการหลบหนีและการจัดการสตริง?
Caleb

6
@Caleb: ฉันสงสัยว่าคุณไม่ได้นับจริงๆ & แค่เดาในการแสดงความคิดเห็นนั้น ตามเครื่องมือแก้ไขข้อความของฉันมีตัวอักษร 165 ตัวในขัดแตะ (มีการขึ้นบรรทัดใหม่) ฉันมีตัวละครน้อยลง 19 ตัวเนื่องจากการทำซ้ำSสามครั้ง
Kyle Kanos

2
แต่คุณถูกต้องแล้วว่าการหลบหนีและการขึ้นบรรทัดใหม่นั้นจำกัดความสามารถของรหัสในการแข่งขันในเกมนี้ แต่การชนะก็ไม่ใช่เหตุผลที่ฉันทำเช่นนี้ แต่เพื่อความสนุกและการเรียนรู้
Kyle Kanos

3

โผ - 113

main({r:"/  \\__"}){print("       __\n    __$r\n __$r$r\n${"$r$r/  \\\n\\__$r$r/\n"*3}   \\__$r/\n      \\__/");}

วิธีการแก้ปัญหาการแก้ไขสตริงบริสุทธิ์ไม่มีอะไรแฟนซี การทำงานของสตริงเช่น "ซับสตริง" นั้นละเอียดเกินไปที่จะแข่งขันในทางปฏิบัติ

รันบนDartPad


3

Javascript ( ฉบับร่าง ES7 ), 96 94 93 ไบต์

แรงบันดาลใจนำมาจากคำตอบไม่กี่ข้อที่นี่ ...

แก้ไข: -1 จาก edc65

f=z=>[for(x of[741e6]+36)' '.repeat(x)+'/  \\__'.repeat(4,z^=3).slice(+x+z,16-x+z)].join(`
`)

// For snippet demo:
document.write('<pre>'+f()+'</pre>');

แสดงความคิดเห็น:

f=z=>[                                 
        for(x of [741e6] + 36)        // for each character "x" in "74100000036"
            ' '.repeat(x) +           // x spaces
            '/  \\__'.repeat(4,       // build pattern string
            z ^= 3).                  // toggle z offset (3) for even lines
            slice(+x + z, 16 - x + z) // get appropriate substring
    ].join(`                          // join with newlines
    `)

ทำได้ดีนี่. .substr(+x+z,16-x-x)-> .slice(+x+z,16-x+z)-1
edc65

@ edc65 จับได้ดี!
nderscore

คำถามด่วน: ทำไม+xแทนที่จะเป็นแค่x?
Nic Hartley

1
@QPaysTaxes มันจะส่งxไปยังหมายเลข หากไม่มีมันก็จะเชื่อมต่อz
ขีดล่าง

2

Python 3, 100 87 ไบต์

n=0x85208e08e08dd445
while n:l=n>>2&15;print(' '*(8-l)+('\__/  '*4)[n&3:n&3|l*2]);n>>=6

และรหัสที่อ่านได้ด้านล่าง ความคิดคือการ hardcode ช่วงเวลา (เริ่มต้น, ความยาว) แล้วรองด้วยจำนวนที่ถูกต้องของช่องว่างเพื่อจัดช่วงเวลา

hexagon_string = '\__/  ' * 4
for i in range(11):
    # Pick the begin and length of the i-th interval using hardcoded numbers
    b = (0x00030303111 >> 4*i) & 3   # n is a combination of these two numbers
    l = (0x25888888741 >> 4*i) & 15  #
    # Print the interval with appropriate whitespace in front of it
    spaces = ' ' * (8-l)
    print(spaces + hexagon_string[b : b+l*2])

2

เรติน่า 66 ไบต์

<empty line>
sss __<LF>ssa__<LF> aa__<LF>lll dau<LF>ssdu
l
/daa<LF>\aau<LF>
a
ud
u
__/
d
s\
s

แต่ละบรรทัดควรไปที่ไฟล์ของตัวเองและ<LF>หมายถึงการขึ้นบรรทัดใหม่จริงในไฟล์ 1 ไบต์ต่อไฟล์พิเศษที่เพิ่มลงในจำนวนไบต์

คุณสามารถเรียกใช้รหัสเป็นไฟล์เดียวด้วยการ-sตั้งค่าสถานะรักษา<LF>เครื่องหมายและอาจเปลี่ยนเป็นบรรทัดใหม่ในผลลัพธ์เพื่อให้สามารถอ่านได้หากคุณต้องการ

อัลกอริทึมคือ 5 ขั้นตอนการแทนที่ง่าย ๆ (เปลี่ยนเนื้อหาบรรทัดคี่เป็นเนื้อหาเส้นคู่) เริ่มต้นจากสตริงอินพุตว่าง ผลลัพธ์หลังจากแต่ละขั้นตอนคือ (คั่นด้วย='s):

sss __
ssa__
 aa__
lll dau
ssdu
============
sss __
ssa__
 aa__
/daa
\aau
/daa
\aau
/daa
\aau
 dau
ssdu
============
sss __
ssud__
 udud__
/dudud
\ududu
/dudud
\ududu
/dudud
\ududu
 dudu
ssdu
============
sss __
ss__/d__
 __/d__/d__
/d__/d__/d
\__/d__/d__/
/d__/d__/d
\__/d__/d__/
/d__/d__/d
\__/d__/d__/
 d__/d__/
ssd__/
============
sss __
ss__/s\__
 __/s\__/s\__
/s\__/s\__/s\
\__/s\__/s\__/
/s\__/s\__/s\
\__/s\__/s\__/
/s\__/s\__/s\
\__/s\__/s\__/
 s\__/s\__/
sss\__/
============
       __
    __/  \__
 __/  \__/  \__
/  \__/  \__/  \
\__/  \__/  \__/
/  \__/  \__/  \
\__/  \__/  \__/
/  \__/  \__/  \
\__/  \__/  \__/
   \__/  \__/
      \__/

1

Javascript, 154 151 bytes

b="\n",c="\t",d="/  \\",f="__",g="\\",h="/",a=f+d,j=a+a,i=d+j+b+g+j+f+h+b,k="   ";console.log(c+k+f+b+c+a+f+b+" "+j+f+b+i+i+i+k+g+a+f+h+b+c+"  "+g+f+h)
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.