ระเบิดแมว!


17

ท้าทาย

คุณจะสร้างโปรแกรม / ฟังก์ชั่นที่รับความยาวของสตริงnและ:

  1. ทำให้ถ่านที่เป็นศูนย์กลางของพื้นที่ที่kth k = (n+1)/2นี่จะเป็นที่ตั้งของศูนย์พื้นของคุณ
  2. วางส่วนที่เหลือของตัวอักษรที่ไม่ใช่ช่องว่างจัดเรียงแบบสุ่มรอบศูนย์พื้น nระยะห่างจากถ่านพีทาโกรัสต้องไม่เกิน
  3. ส่งออกผลลัพธ์

หากคุณต้องการคำชี้แจงดูตัวอย่างด้านล่าง


กฎระเบียบ

  • ช่องโหว่มาตรฐานใช้!
  • I / O ต้องอยู่ในรูปของสตริง
  • การป้อนข้อมูลจะเป็นเลขคี่เสมอเพื่อให้แน่ใจว่าคุณมีถ่านส่วนกลางที่จะนำไปที่ศูนย์ดิน
  • ผลลัพธ์ที่ถูกต้องควรเกิดขึ้นกับความน่าจะเป็นที่ไม่ใช่ศูนย์

นี่คือ ; รหัสที่สั้นที่สุดเป็นไบต์ชนะ!


ตัวอย่าง

การป้อนข้อมูล: qwert

ขอบเขตของการระเบิดเล็ดลอดออกมาจากพื้นดินเป็นศูนย์ (เครื่องหมายของสถานที่ที่ถูกต้อง x สำหรับส่วนที่เหลือของตัวอักษรที่จะ):

     x
  xxxxxxx
 xxxxxxxxx
 xxxxxxxxx
 xxxxxxxxx
xxxxxexxxxx
 xxxxxxxxx
 xxxxxxxxx
 xxxxxxxxx
  xxxxxxx
     x

ตัวอย่างผลลัพธ์:

       t
     r

q    e


      w

การเลือกตำแหน่งแบบสุ่มหนึ่งอักขระสามารถไปอยู่ในตำแหน่งเดียวกันของอีกฝ่ายและเขียนทับมันได้ สิ่งนี้ได้รับการจัดสรรหรือไม่? (คำแนะนำของฉัน: ไม่)
edc65

คุณพูดถูก: ไม่
Mama Fun Roll

1
สิ่งนี้บนโลกนี้เกี่ยวข้องกับการทำให้ฉันระเบิด (ฉันจริงๆไม่เข้าใจความเกี่ยวข้องของชื่อเรื่อง ... )
แมว

1
@cat นี่คือการเปลี่ยนแปลงของโปรแกรม cat ยกเว้นว่าคุณจะระเบิดอินพุต
Mama Fun Roll

คำตอบ:


0

APL (Dyalog Classic) , 68 66 65 63 62 ไบต์

{⍵@(n⊣¨¨@(⊢≡¨⌽)i[n?≢i←⍸(××n≥*∘.5)+.ר⍨n-⍳s])⊢''⍴⍨s21+2×n←≢⍵}

ลองออนไลน์!

{ } ฟังก์ชั่นไม่ระบุชื่อกับการโต้แย้ง

n←≢⍵ตัวแปรnคือความยาว

s←2⍴1+2×nตัวแปรsคือรูปร่างของผลลัพธ์: 2n + 1 คูณ 2n + 1

''⍴⍨s สร้างช่องว่างที่มีรูปร่างนั้น

A@I⊢Bใส่องค์ประกอบAที่ (คู่) ดัชนีIในเมทริกซ์B

+.ר⍨n-⍳s ระยะทางกำลังสองจากจุดศูนย์กลางของเมทริกซ์

(××n≥*∘.5) บูลีนเมทริกซ์ที่ระบุว่าระยะทางเหล่านั้นไม่ใช่ศูนย์และ ≤n

ประสานงานการจับคู่สำหรับ 1s ในเมทริกบูลีน

i[n?≢i← ... ] เลือก n อย่างสุ่ม (ไม่มีรายการซ้ำ)

n⊣¨¨@(⊢≡¨⌽) เปลี่ยนศูนย์กลางหนึ่งเป็น n n

⍵@( ... )⊢ ... ใส่ตัวอักษรจากการโต้แย้งที่ดัชนีที่กำหนดในเมทริกซ์ของช่องว่าง


3

JavaScript (ES6), 211 216 220

แก้ไข 1 ไบต์บันทึกขอบคุณ @usandfriends

s=>[...s].map((c,i)=>{for(R=_=>Math.random()*h-l|0;x=R(y=R()),!(i-(l/2|0)?x|y&&x*x+y*y<=l*l&g[y+=l][x+=l]<'!':x=y=l););z=[...g[y]],z[x]=c,g[y]=z.join``},l=s.length,g=Array(h=l-~l).fill(' '.repeat(h)))&&g.join`
`

ทดสอบ

f=s=>[...s].map((c,i)=>{for(R=_=>Math.random()*h-l|0;x=R(y=R()),!(i-(l/2|0)?x|y&&x*x+y*y<=l*l&g[y+=l][x+=l]<'!':x=y=l););z=[...g[y]],z[x]=c,g[y]=z.join``},l=s.length,g=Array(h=l-~l).fill(' '.repeat(h)))&&g.join`
`

// Less golfed
U=s=>(
  l=s.length,
  h=l-~l, // l+l+1
  g=Array(h).fill(' '.repeat(h)),
  [...s].map((c,i)=>{
    for(R=_=>Math.random()*h-l|0;
        x=R(y=R()), // set x,y to a random value in range -l ... l
        !(i - (l/2|0) // check if at mid point of input string
          ? x|y && // if not, check x and y must not be both 0
            x*x + y*y <= l*l &  // then check position inside the circle of ray L
            g[y+=l][x+=l] < '!' // then add offset L and check if position is not already used 
          : x=y=l // if at midpoint in input string, x and y have fixed value L
         );
       ); // loop until valid position found
    z = [...g[y]];  // modify string at current position: convert to array ...
    z[x] = c;       // ... set element ...
    g[y] = z.join`` // ... back to string
  }),
  g.join`\n`
)  

setInterval(_=>O.textContent=(f(I.value)),1000)
Word <input id=I value='qwert'><pre id=O></pre>


คุณมีที่ว่างเพิ่มก่อนg.map(r=>r.join``)...
usandfriends

@usandfriends ขอบคุณฉันไม่ทราบว่าฉันคิดถึงมันได้อย่างไร
edc65

ใช้แทนnew Date()%h-l Math.random()*h-l|0มันช่วยประหยัดไบต์
ericw31415

1
@ ericw31415 ใช้เพียง 0 มันช่วยประหยัดไบต์เช่นกัน แต่ทั้งสองจะไม่ทำงาน
edc65

2

ทับทิม, 211 207 203 196 ตัวอักษร

ขอบคุณ edc65 สำหรับ 4 ตัวอักษร

->(x){x=x.chars
o,b,c=x.size
l=o*2+1
a=Array.new(l){Array.new l,' '}
a[o][o]=x.delete_at o/2
a[b][c]=x.pop if a[b=rand(l)][c=rand(l)]==' '&&(b-o)**2+(c-o)**2<=o*o while x[0]
a.map(&:join).join $/}

คำอธิบาย:

->(x){...} กำหนดฟังก์ชั่นที่ไม่ระบุชื่อที่ใช้ในการโต้แย้ง x

x=x.charsแปลงxจากสตริงเป็นอาร์เรย์ของสตริงหนึ่งอักขระ

o,b,c=x.sizeเก็บความยาวของอินพุตoสำหรับใช้ในภายหลัง bและcก็ต้องเริ่มต้นกับบางสิ่งบางอย่างดังนั้นบันทึก 2 ตัวอักษรโดยแนบไปกับการมอบหมายก่อนหน้า

l=o*2+1 นี่คือความยาว / ความกว้างของฟิลด์ที่ตัวละครทุกตัวสามารถไปได้รวมถึงเส้นผ่านศูนย์กลางของวงกลมระเบิด

Array.new(l){Array.new l,' '}สร้างอาร์เรย์ขนาดlx l2 มิติของอักขระช่องว่าง

a[o][o]=x.delete_at o/2ตั้งค่ากึ่งกลางของอาร์เรย์เป็นศูนย์กลางของค่าx(อินพุต) ขณะที่ลบค่านั้นx

... while x[0]เรียกใช้บล็อก (ในกรณีนี้รหัสก่อนwhileเพราะมันเป็นแบบอินไลน์) ซ้ำแล้วซ้ำอีกจนกว่าxจะว่างเปล่า ในทับทิมการเข้าถึงดัชนีที่ไม่มีอยู่จะส่งคืนnilซึ่งเป็นค่าที่ผิดพลาด

a[b=rand(l)][c=rand(l)]==' 'กำหนดbและcเป็นค่าที่สุ่ม 0 <= nl < จากนั้นตรวจสอบว่าจุดที่b, cเป็นที่ว่างเปล่า (หรือที่รู้จักคือชุดตัวอักษรช่องว่าง)

(b-o)**2+(c-o)**2<=o*oตรวจสอบระยะทางพีทาโกรัส oคือความยาวของอินพุต **เป็นผู้ดำเนินการยกกำลังทับทิมและสั้นกว่าval<=o*oval**0.5<=o

a[b][c]=x.popxลบค่าสุดท้ายจาก ตั้งค่าตำแหน่งa, bค่าในอาร์เรย์ที่a

a[b][c]=x.pop if a[b=rand(l)][c=rand(l)]==' '&&(b-o)**2+(c-o)**2<=o*o while x[0]ตั้งค่าตำแหน่งสุ่มเป็นค่าสุดท้ายหากตำแหน่งนั้นว่างและอยู่ภายในรัศมีการระเบิด ทำอย่างนี้ต่อไปจนกว่าเราจะหมดตัวอักษร

$/ถูกตั้งค่าเป็นบรรทัดใหม่ของระบบปฏิบัติการ มันสั้นกว่าด้วย"\n"

a.map(&:join).join $/แมปอาร์เรย์ทั้งหมดในaเวอร์ชันสตริงเดี่ยว (เช่น['a','b','c']-> 'abc') รับอาร์เรย์ใหม่นั้นและเข้าร่วมกับบรรทัดใหม่ ผลตอบแทนโดยนัย


o * o สั้นกว่า ** 0.5
edc65

0

Python 3 , 286 ไบต์

import random as r
i=input()
l=len(i)
a=range(-l,l+1)
g=[(y,x)for y in a for x in a]
p=[(y,x)for y,x in g if abs(x+y*1j)<=l and x|y]
m=i[l//2]
d=[*i.replace(m,"",1).center(len(p))]
r.shuffle(d)
o=""
for c in g:
	o+=m if c==(0,0)else d.pop()if c in p else" "
	if c[1]==l:o+="\n"
print(o)

การลองออนไลน์เป็นตัวเลือก

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

คำอธิบาย

i=input()แน่นอนว่าอินพุตl=len(i)คือการบันทึกความยาวของสตริงเนื่องจากมีการใช้งานค่อนข้างน้อย

a=range(-l,l+1) - เครื่องมือที่รวดเร็วในการสร้างตัววนซ้ำตั้งแต่ระยะทางที่มีอยู่ห่างจากจุดกำเนิดทั้งสองทางในมิติเดียว

g=[(y,x)for y in a for x in a] สร้างรายการพิกัด tuple ที่ประกอบขึ้นเป็นกริดสุดท้ายทั้งหมด

p=[(y,x)for y,x in g if abs(x+y*1j)<=l and x|y] สร้างชุดย่อยของรายการที่มีเฉพาะพิกัดที่ตัวอักษรที่ไม่ตรงกลางสามารถลงจอดได้

m=i[l//2] สร้างตัวละครที่ศูนย์

d=[*i.replace(m,"",1).center(len(p))]- ตัวละครศูนย์กลางถูกนำออกไปทิ้งเราไว้กับเศษซากอื่น ๆ center()ฟังก์ชั่นเป็นสิ่งที่ดีมากที่นี่เพราะมันช่วยให้เราสามารถออกแผ่นสาย (มีค่าเริ่มต้นพื้นที่) จนกว่าจะมีจำนวนที่แน่นอนของตัวอักษร นี่คือจำนวนช่องว่างที่ตัวอักษรสามารถขึ้นฝั่งได้ดังนั้นจึงเป็นการสะท้อนการกระจายตัวที่เราต้องการ

r.shuffle(d) ตามธรรมชาติแล้ว shuffles บอกว่าการกระจายตัวเป็นจริง ... กระจาย

ห่วง, ดูเหนือตารางทั้งหมดของกระเบื้องที่เป็นไปได้โดยไม่คำนึงถึงสิ่งที่อาจจะเชื่อมโยงไปถึงหรือไม่และเท่าที่จำเป็นเพิ่มตัวอักษรสตริงผลผลิตของเราfor c in g: o+=m if c==(0,0)else d.pop()if c in p else" " oตัวละครถูกดึงออกมาจากตัวอย่างเศษซากของเราเพื่อให้ปรากฏเพียงครั้งเดียว

if c[1]==l:o+="\n"- เพิ่มตัวแบ่งบรรทัดเช่นกัน ผลตอบแทน

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