ASCII แบบสุ่มของวัน # 5: การเอียงเพชร


21

Mash Up Time!

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

หลุมที่ 5: การเอียงเพชร

รูปหกเหลี่ยมปกติสามารถปูด้วยเพชรได้เช่น:

เราจะใช้การแทนค่า ASCII art ของ tilings เหล่านี้ สำหรับรูปหกเหลี่ยมของความยาวด้าน 2 มี 20 แบบดังกล่าว:

   ____     ____     ____     ____     ____     ____     ____     ____     ____     ____  
  /\_\_\   /\_\_\   /\_\_\   /\_\_\   /_/\_\   /_/\_\   /\_\_\   /_/\_\   /_/\_\   /_/\_\ 
 /\/\_\_\ /\/_/\_\ /\/_/_/\ /\/_/\_\ /\_\/\_\ /\_\/_/\ /\/_/_/\ /\_\/\_\ /\_\/_/\ /_/\/\_\
 \/\/_/_/ \/\_\/_/ \/\_\_\/ \/_/\/_/ \/\_\/_/ \/\_\_\/ \/_/\_\/ \/_/\/_/ \/_/\_\/ \_\/\/_/
  \/_/_/   \/_/_/   \/_/_/   \_\/_/   \/_/_/   \/_/_/   \_\/_/   \_\/_/   \_\/_/   \_\/_/ 
   ____     ____     ____     ____     ____     ____     ____     ____     ____     ____  
  /_/_/\   /\_\_\   /_/\_\   /_/_/\   /_/\_\   /_/\_\   /_/_/\   /_/_/\   /_/_/\   /_/_/\ 
 /\_\_\/\ /\/_/_/\ /_/\/_/\ /\_\_\/\ /\_\/_/\ /_/\/_/\ /_/\_\/\ /\_\_\/\ /_/\_\/\ /_/_/\/\
 \/\_\_\/ \/_/_/\/ \_\/\_\/ \/_/\_\/ \/_/_/\/ \_\/_/\/ \_\/\_\/ \/_/_/\/ \_\/_/\/ \_\_\/\/
  \/_/_/   \_\_\/   \_\/_/   \_\/_/   \_\_\/   \_\_\/   \_\/_/   \_\_\/   \_\_\/   \_\_\/ 

ให้ความยาวด้านNคุณควรสร้างแบบเรียงต่อกันสำหรับความยาวด้านหกเหลี่ยมNโดยการสุ่ม การแจกแจงที่แน่นอนนั้นไม่สำคัญ แต่การคืนค่าแต่ละครั้งจะต้องถูกส่งกลับด้วยความน่าจะเป็นที่ไม่ใช่ศูนย์

สำหรับN ≤ 4การส่งของคุณจะต้องสร้างการปูกระเบื้องภายใน 1 นาทีอย่างน้อย 80% ของเวลาและอย่างน้อย 80% ของการเอียงจะต้องสร้างขึ้นภายใน 1 นาที วิธีการส่วนใหญ่ไม่ต้องกังวลเกี่ยวกับกฎนี้ (มันผ่อนปรนมาก) - นี่เป็นเพียงการออกกฎขั้นตอนวิธีการปฏิเสธที่ไร้เดียงสามากที่สร้างสตริงโดยพลการจนกว่าจะมีการเรียงต่อกัน

คุณอาจต้องการที่จะรู้ว่าจำนวนรวมของ tilings เป็นไปได้สำหรับให้ N สามารถพบได้ในOEIS A008793

คุณสามารถเขียนโปรแกรมหรือฟังก์ชั่นเต็มรูปแบบและรับอินพุตผ่าน STDIN (หรือทางเลือกที่ใกล้เคียงที่สุด) อาร์กิวเมนต์บรรทัดคำสั่งหรืออาร์กิวเมนต์ฟังก์ชันและสร้างเอาต์พุตผ่าน STDOUT (หรือทางเลือกที่ใกล้เคียงที่สุด), ค่าส่งคืนของฟังก์ชันหรือพารามิเตอร์

คุณต้องไม่ส่งออกช่องว่างนำหน้ามากกว่าที่จำเป็นเพื่อจัดตำแหน่งรูปหกเหลี่ยม (นั่นคือมุมซ้ายของรูปหกเหลี่ยมไม่ควรมีช่องว่างด้านหน้า) แต่ละบรรทัดอาจมีNช่องว่างต่อท้าย (ไม่จำเป็นต้องสม่ำเสมอดังนั้นคุณอาจมีเอาต์พุตสี่เหลี่ยมพิมพ์กล่องขอบเขตของรูปหกเหลี่ยม)

นี่คือรหัสกอล์ฟดังนั้นการส่งที่สั้นที่สุด (เป็นไบต์) ชนะ และแน่นอนว่าการส่งสั้นที่สุดต่อผู้ใช้จะเข้าสู่กระดานผู้นำโดยรวมของซีรีย์ด้วย

ลีดเดอร์

โพสต์แรกของแต่ละชุดสร้างกระดานแต้มนำ

เพื่อให้แน่ใจว่าคำตอบของคุณปรากฏขึ้นโปรดเริ่มต้นทุกคำตอบด้วยบรรทัดแรกโดยใช้เทมเพลต Markdown ต่อไปนี้:

# Language Name, N bytes

ที่Nมีขนาดของส่งของคุณ หากคุณปรับปรุงคะแนนของคุณคุณสามารถเก็บคะแนนเก่าไว้ในพาดหัวโดยการตีพวกเขาผ่าน ตัวอย่างเช่น

# Ruby, <s>104</s> <s>101</s> 96 bytes

(ภาษาไม่ปรากฏในปัจจุบัน แต่ตัวอย่างข้อมูลต้องการและแยกวิเคราะห์และฉันอาจเพิ่มกระดานผู้นำแบบแยกภาษาในอนาคต)


3
ฉันแค่คนที่เห็นภาพตัวอย่างในแบบ 3 มิติอยู่เรื่อย ๆ
LegionMammal978

3
@ LegionMammal978 ไม่เป็นเรื่องปกติอย่างสมบูรณ์ ;) (และอาจเป็นวิธีที่ดีในการเข้าถึงความท้าทาย)
Martin Ender

For N ≤ 4, your submission must produce a tiling within 1 minute at least 80% of the time.ง่ายเกินไป: 80% ของเวลาเหมือนกันกับการปูกระเบื้องขั้นพื้นฐานมิฉะนั้นฉันจะพบการเรียงต่อกันอีกครั้งในเวลาใดก็ตามที่ฉันต้องการ
edc65

@ edc65 จุดที่ดีให้ฉันใช้ถ้อยคำใหม่ที่
Martin Ender

คำตอบ:


10

CJam, 105 ไบต์

ri:A" __"e*A,2f*:B,[W1]{J+B:):B,{N1$S*"\/"J%A2*4$-:D*
0{;B{_1&!2mr+J*m1e>D(2*e<}%__:)&}g:B{'_t}/+@J+}*}fJ;

เพิ่มบรรทัดใหม่เพื่อหลีกเลี่ยงการเลื่อน ลองออนไลน์

คำอธิบาย:

การแก้ปัญหานี้เริ่มต้นแต่ละบรรทัดเป็นซิกแซกจากนั้นวาง N ขีดล่างไว้โดยขึ้นอยู่กับตำแหน่งของพวกเขาในบรรทัดก่อนหน้าและกฎสองสามข้อ ฉันได้สิ่งนี้จากการสังเกตหลาย ๆ แบบในขณะที่มองผลลัพธ์เป็นเมทริกซ์ 2D ธรรมดาของตัวละคร:

  • แต่ละบรรทัดมีขีดเส้นใต้ N อย่างแน่นอน
  • ด้านล่างสามารถถูกแทนที่ด้วย / หรือ \ เพื่อให้รูปแบบซิกแซกซ้ำอย่างสมบูรณ์แบบ ( /\ในครึ่งบน\/ในครึ่งล่าง)
  • ขีดล่างไม่สามารถสัมผัสด้านข้างและไม่สามารถอยู่ติดกับขีดล่างอื่นได้
  • เมื่อไปที่บรรทัดถัดไปตำแหน่งของขีดล่างแต่ละอันจะเปลี่ยนเป็น -1, 0 หรือ 1
  • มากกว่านั้น/_/สามารถเปลี่ยนแปลงได้เพียง -1 หรือ 0 และ\_\สามารถเปลี่ยนแปลงได้เพียง 0 หรือ 1
  • สำหรับตำแหน่งขีดล่างเริ่มต้นเราสามารถใช้"_ "รูปแบบหรือ" _"รูปแบบทั้งสองได้ดี
  • กฎข้างต้นเพียงพอที่จะได้รับการเอียง

ดังนั้นฉันตัดสินใจที่จะใช้งานโดยรักษาตำแหน่งขีดล่างก่อนหน้านี้แก้ไขด้วยปัจจัยสุ่ม (2 ตัวเลือกสำหรับขีดล่างแต่ละอัน) และทำซ้ำจนกว่ากฎจะพึงพอใจ ในกระบวนการปรับให้เหมาะสมฉันเปลี่ยนไปใช้ตำแหน่งขีดล่างที่สัมพันธ์กับด้านซ้ายของรูปหกเหลี่ยม (ไม่รวมช่องว่าง)

ri:A" __"e*       read the input (A) and generate the top line
A,2f*:B           make an array [0 2 4 ... 2A-2] and store in B
                  these are the initial positions for the underscores
,                 B's length = A, used as the initial number of leading spaces
                  let's call it C
[W1]{…}fJ         for J in [-1 1] (top half, bottom half)
  J+              add J to C
  B:):B           increment the underscore positions (adjustment before each half)
  ,{…}*           repeat A times
    N1$S*         add a newline and C spaces
    "\/"J%        take "\/" and reverse it if J=-1 (zigzag pattern)
    A2*4$-:D*     calculate D=A*2-C and repeat the pattern
    0             dummy value (for the next loop)
    {…}g          do-while
      ;B          pop last value and push B
      {…}%        apply block to each item (say x)
        _1&!      duplicate x and calculate !(x&1) (for /_/ vs \_\)
        2mr+      randomly add 0 or 1
        J*m       multiply by J and subtract from x
        1e>       limit the minimum value to 1
        D(2*e<    and the maximum value to 2*(D-1)
      __:)&       check if the modified array has any adjacent values
    :B            store the new positions in B
    {'_t}/        place underscores over the zigzag pattern
    +@J+          bring C to the top and add J to it
;                 pop C

เวอร์ชั่นเก่า "3D", 189 ไบต์:

ri:A" __"e*aA4*S*aA2**+[0-2XXW1]:C;"/\_\\\/_/":D;A3m*{{C2/.f*:.+~
A(2*+:V;A+:U;2{UI+1$1$=4{_V+D4/I=@=t}/t}fI}:F~}/[0Y1WWW]:C;
"/_/\\\_\/":D;AaA*:B;A{A[_{_BI=e<)mr}fI]:B;{BQ={[PQR]F}fR}fQ}fPN*

ลองออนไลน์


+1 สำหรับงานที่ยอดเยี่ยมและเพราะอีกหนึ่งโหวตจะทำให้คุณอยู่ที่ 10k ตัวแทน แต่ส่วนใหญ่สำหรับงานที่ยอดเยี่ยม (โอ้เฮ้ลองดูสิขอแสดงความยินดีกับ 10k :))
อเล็กซ์ A.

การวิเคราะห์ที่ยอดเยี่ยมเกี่ยวกับรูปแบบ! ฉันจะใช้มันสำหรับคำตอบของฉัน
anatolyg

6

Python 2, 337 335 324 318 311 300 296 ไบต์

from random import*
n=input()
R=range(n*2)
b=[]
l=[]
for i in R:o=abs(i-n)-(i<n);b+=[o];l+=[list(' '*o+'\//\\'[i<n::2]*(n*2-o))]
for i in R[:n]:
 o=1;p=n+i*2
 for j in R:r=randint(0,p<n*3+i*2-j);p+=(r or-1)*(o==r);q=p<=b[j];o=r|q;p+=q;l[j][p]='_';b[j]=p+1
for s in[' '*n+'__'*n]+l:print''.join(s)

ความคิดคือการสร้างเพชรหกเหลี่ยมก่อนดังนี้:

  ____
 /\/\/\
/\/\/\/\
\/\/\/\/
 \/\/\/

แล้วเติมให้เต็มด้วยเส้นทางของขีดล่างเช่นนี้:

  ____                          ____
 /_/\/\                        /\_\/\
/_/\/\/\    or maybe this:    /\/_/\/\
\_\/\/\/                      \/_/\/\/
 \_\/\/                        \_\/\/

ผลลัพธ์สุดท้ายที่มีเส้นทางทั้งหมดที่เพิ่มเข้ามาจะมีลักษณะดังนี้:

  ____                          ____  
 /_/\_\                        /\_\_\ 
/_/\/_/\    or maybe this:    /\/_/\_\
\_\/_/\/                      \/_/\/_/
 \_\_\/                        \_\/_/ 

ค่อนข้างน้อยของรหัสไปสู่การทำให้แน่ใจว่าเส้นทางเหล่านี้ไม่ได้ไปนอกขอบเขตหรือข้ามแต่ละอื่น ๆ

รหัสที่ไม่ดีนัก:

# Initialize l with all diamonds
blocked = []
l = [[] for _ in range(n*2)]
for i in range(n*2):
    offset = n-i-1 if i<n else i-n
    blocked.append(offset)
    l[i] += ' '*offset + ('/\\' if i<n else '\/')*(2*n - offset)

# Generate the random _'s
for i in range(n):
    oldright = True
    pos = n + i*2
    for j in range(n*2):
        # Go randomly right (true) or left (false), except when you out of bounds on the right side
        right = randint(0, 1) and pos < n*3 + i*2 - j
        if right == oldright:
            pos += 1 if right else -1
        if pos <= blocked[j]:
            right = True
            pos += 1
        l[j][pos] = '_'
        blocked[j] = pos + 1
        oldright = right

# Print the result
print ' '*n + '__'*n
for s in l:
    print ''.join(s)

1
ฉันเพิ่งสังเกตเห็นว่าผลลัพธ์ของคุณดูเหมือนผิด คุณได้รูปสามเหลี่ยมในผลลัพธ์ exaple ทั้งสองของคุณ (ด้านบนขวาและล่างขวา)
Martin Ender

1
@MartinEnder ตัวอย่างแสดงเพียงหนึ่ง 'เส้นทางของขีดล่าง' เพื่อแสดงแนวคิดของอัลกอริทึม เอาท์พุทสุดท้ายมีเส้นทางทั้งหมด (ในกรณีนี้ 2) ซึ่งกำจัดสามเหลี่ยม ฉันเพิ่มในตัวอย่างของผลลัพธ์สุดท้ายเช่นกัน
Matty

ฉันเข้าใจแล้วว่ามันสมเหตุสมผล ขอขอบคุณสำหรับการชี้แจง.
Martin Ender

2
ฉันคิดว่าคุณสามารถร่นไปrandint(0,1)*(p<n*3+i*2-j) randint(0,p<n*3+i*2-j)
12Me21

โอ้โหขอบคุณ!
Matty

4

Perl, 174 168 166 161

#!perl -n
for$l(-$_..$_){$t=/_/?join'',map'/_'x($%=rand
1+(@z=/__?/g)).'/\\'.'_\\'x(@z-$%),split/\/\\/:__
x$_;$l>0&&$t!~s!^.(\\.*/).$!$1!?redo:print$"x abs$l-.5,$_=$t.$/}

ลองฉัน


ดูเหมือนว่าจะสร้างแบบเรียงต่อกันเหมือนเดิม (อย่างน้อยใน ideone)
aditsu

@aditsu, Ideone จะแสดงผลการแคชหากคุณเพียงคลิกที่ลิงค์ คุณต้องแยกเพื่อเรียกใช้งานจริงอีกครั้ง
nutki

2

JavaScript ( ES6 ), 376 416 494

เพื่อไปที่นั่น ...

สิ่งนี้สร้างความเอียงทั้งหมดจากนั้นเลือกแบบสุ่ม เวลาสำหรับ 232848 การเอียงสำหรับ N = 4 คือ ~ 45 วินาทีบนแล็ปท็อปของฉัน ฉันไม่ได้ลอง N = 5

เป็น EcmaScript 6 มันทำงานบน Firefox เท่านั้น

F=n=>{
  for(i=s=r=b='';i<n;i++)
    s='\n'+b+'/\\'[R='repeat'](n-i)+'_\\'[R](n)+s,
    r+='\n'+b+'\\/'[R](n-i)+'_/'[R](n),
    b+=' ';
  for(h=[t=0],x=[s+r];s=x[t];t++)
    for(d='';!d[n*3];d+='.')
      if(l=s.match(r=RegExp("(\n"+d+"/)\\\\_(.*\n"+d+"\\\\)/_","g")))
        for(j=2<<l.length;j-=2;h[z]||(h[z]=x.push(z)))
          z=s.replace(r,(r,g,h)=>(k+=k)&j?g+'_/'+h+'_\\':r,k=1);
  return b+'__'[R](n)+x[Math.random()*t|0]
}


function go()
{
  var n = N.value | 0,
  t0 = performance.now(),
  r = F(n),
  t1 = performance.now();
  
  O.innerHTML = r+'\n\nTime (msec): '+(t1-t0)
}
N: <input id=N value=3><button onclick="go()">GO</button>
<pre id=O></pre>


ใน Chromium 42 ฉันได้รับ "Uncaught SyntaxError: โทเค็นที่ไม่คาดคิด =>" และ "Uncaught ReferenceError: go ไม่ได้ถูกกำหนด"
aditsu

1
@aditsu เป็น ES6, Chrome: ไม่มี Firefox: ใช่ มันเป็นความจริงที่รู้จักกันดีหรือไม่?
edc65

ฉันไม่รู้ว่าฉันคาดหวังว่า Chromium จะใช้สิ่งที่เรียกว่าไม่จาวาสคริปต์ ขอบคุณที่อธิบาย
aditsu

ฉันวิ่งตอนนี้ใน firefox (31.5.3) และใช้งานได้กับ N = 1, 2 หรือ 3 แต่สำหรับ N = 4 มันทำงานประมาณ 10 วินาทีเสร็จสิ้นและไม่แสดงอะไรเลย (และไม่มีข้อผิดพลาดในคอนโซล )
aditsu

@aditsu ไม่แน่ใจว่า ... บางที JavaScript ใน sandbox ที่จะเงียบdom.max_script_run_timeฆ่าตายเมื่อเกินเวลาที่กำหนด เป็นค่ากำหนดทั่วโลกใน about: config เหมืองของฉันถูกตั้งค่าเป็น 30
edc65

1

SmileBASIC ขนาด 241 ไบต์

INPUT N
T=N*2CLS?" "*N;"__"*N
DIM B[T]FOR I=-1TO N-1O=1P=N+I*2FOR J=0TO T-1IF I<0THEN O=ABS(J0N+.5)<<0B[J]=O?" "*O;MID$("\/\",J<N,2)*(T-O)ELSE R=P<N*3+I*2-J&&RND(2)P=P+(R*2-1)*(O==R)A=P<=B[J]R=R||A:P=P+A:LOCATE P,J+1?"_"B[J]=P+1O=R
NEXT
NEXT

อย่างหนักตามคำตอบของ Matty

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