Mèo nổ tung!


17

Thử thách

Bạn sẽ tạo một chương trình / hàm lấy chuỗi đầu vào có độ dài nvà:

  1. Đặt kthchar ở trung tâm của không gian, ở đâu k = (n+1)/2. Đây sẽ là vị trí của mặt đất của bạn.
  2. Đặt phần còn lại của các ký tự không khoảng trắng được sắp xếp ngẫu nhiên xung quanh mặt đất bằng không. Khoảng cách Pythagore từ char không được vượt quá n.
  3. Kết quả đầu ra.

Nếu bạn cần làm rõ, xem ví dụ dưới đây.


Quy tắc

  • Tiêu chuẩn áp dụng!
  • I / O phải ở dạng chuỗi.
  • Đầu vào sẽ luôn là số lẻ để đảm bảo rằng bạn có một char trung tâm để đặt ở mức 0.
  • Mỗi đầu ra hợp lệ nên xảy ra với xác suất khác không.

Đây là ; mã ngắn nhất trong byte thắng!


Thí dụ

Đầu vào: qwert

Ranh giới của vụ nổ phát ra từ mặt đất bằng không (dấu x là vị trí hợp lệ cho phần còn lại của ký tự):

     x
  xxxxxxx
 xxxxxxxxx
 xxxxxxxxx
 xxxxxxxxx
xxxxxexxxxx
 xxxxxxxxx
 xxxxxxxxx
 xxxxxxxxx
  xxxxxxx
     x

Ví dụ đầu ra:

       t
     r

q    e


      w

Chọn vị trí ngẫu nhiên, một char có thể đi vào cùng vị trí của một vị trí khác và ghi đè lên nó. Đây có phải là ám chỉ? (Gợi ý của tôi: không)
edc65

Bạn nói đúng: Không
Mama Fun Roll

1
Điều này có liên quan gì đến việc làm tôi nổ tung? (Tôi thực sự không hiểu sự liên quan của tiêu đề ...)
mèo

1
@cat Đây là bản sửa đổi của chương trình mèo, ngoại trừ việc bạn làm nổ đầu vào.
Mama Fun Roll

Câu trả lời:


0

APL (Dyalog Classic) , 68 66 65 63 62 byte

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

Hãy thử trực tuyến!

{ } hàm ẩn danh với đối số

n←≢⍵biến nlà chiều dài

s←2⍴1+2×nbiến slà hình dạng của kết quả: 2n + 1 by 2n + 1

''⍴⍨s tạo một hình vuông của không gian với hình dạng đó

A@I⊢Bđặt các phần tử Atại (cặp) chỉ số Itrong ma trậnB

+.ר⍨n-⍳s bình phương khoảng cách từ tâm của ma trận

(××n≥*∘.5) ma trận boolean chỉ ra nơi những khoảng cách đó khác không và ≤n

các cặp tọa độ cho 1s trong ma trận boolean

i[n?≢i← ... ] chọn n trong số chúng một cách ngẫu nhiên (không trùng lặp)

n⊣¨¨@(⊢≡¨⌽) thay đổi trung tâm thành n n

⍵@( ... )⊢ ... đặt ký tự từ đối số tại các chỉ số đã cho trong ma trận khoảng trắng


3

JavaScript (ES6), 211 216 220

Chỉnh sửa 1 byte đã lưu thx @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`
`

Kiểm tra

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>


Bạn có thêm một không gian trước đâyg.map(r=>r.join``)...
tôi kết bạn vào

@usandfriends thx Tôi không biết mình đã bỏ lỡ nó như thế nào
edc65

Sử dụng new Date()%h-lthay vì Math.random()*h-l|0. Nó tiết kiệm byte.
ericw31415

1
@ ericw31415 chỉ sử dụng 0. Nó cũng tiết kiệm byte. Nhưng cả hai sẽ không hoạt động
edc65

2

Hồng ngọc 211 207 203 196 ký tự

Cảm ơn edc65 cho 4 ký tự

->(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 $/}

Giải trình:

->(x){...} định nghĩa một hàm ẩn danh có trong một đối số x

x=x.charschuyển đổi xtừ một chuỗi thành một chuỗi các chuỗi một ký tự

o,b,c=x.sizelưu trữ độ dài của đầu vào ođể sử dụng sau. bcchỉ cần khởi tạo một cái gì đó , vì vậy hãy lưu 2 ký tự bằng cách đính kèm vào một bài tập trước.

l=o*2+1 đây là chiều dài / chiều rộng của trường nơi tất cả các ký tự có thể đi, cũng là đường kính của vòng tròn vụ nổ.

Array.new(l){Array.new l,' '}tạo một mảng 2D có kích thước lx lcủa các ký tự khoảng trắng.

a[o][o]=x.delete_at o/2đặt trung tâm của mảng thành trung tâm của các giá trị của x(đầu vào), trong khi xóa giá trị đó khỏix

... while x[0]chạy khối (trong trường hợp này, mã trước whilevì nó là dòng) lặp đi lặp lại cho đến khi xtrống. Trong ruby, truy cập vào một chỉ mục không tồn tại trả về nil, đó là một giá trị falsey.

a[b=rand(l)][c=rand(l)]==' 'Gán bccho các giá trị ngẫu nhiên trong đó 0 <= n < l. Sau đó kiểm tra xem vị trí tại b, ccó trống không (aka được đặt thành ký tự khoảng trắng)

(b-o)**2+(c-o)**2<=o*oKiểm tra khoảng cách Pythagore. olà chiều dài của đầu vào. **là toán tử lũy thừa của ruby, và val<=o*ongắn hơn val**0.5<=o.

a[b][c]=x.popxóa giá trị cuối cùng từ x. Đặt vị trí a, btheo giá trị đó trong mảnga

a[b][c]=x.pop if a[b=rand(l)][c=rand(l)]==' '&&(b-o)**2+(c-o)**2<=o*o while x[0]Đặt vị trí ngẫu nhiên thành giá trị cuối cùng nếu vị trí đó là miễn phí và nằm trong bán kính nổ; tiếp tục làm điều này cho đến khi chúng ta hết nhân vật.

$/được đặt thành dòng mới của hệ điều hành. Nó cũng ngắn hơn"\n"

a.map(&:join).join $/Ánh xạ tất cả các mảng vào amột phiên bản chuỗi đơn (ví dụ ['a','b','c']-> 'abc'). Lấy mảng mới đó và tham gia nó với dòng mới. Hoàn trả lại.


o * o ngắn hơn ** 0,5
edc65

0

Python 3 , 286 byte

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)

Dùng thử trực tuyến là một lựa chọn.

Rất tiếc, vấp phải điều này do hoạt động gần đây, đã không nhận thấy nó đã hơn hai tuổi cho đến khi tôi dành thời gian tốt cho việc này. Vâng, hai câu trả lời là loại buồn, vì vậy đây có lẽ là một ý tưởng tốt để đăng. Tôi chắc chắn có hàng tá cách để cải thiện điều này cho đến bây giờ rằng đầu vào luôn là số lẻ, điều này sẽ hữu ích khi biết.

Giải trình

i=input()là đầu vào, tất nhiên, l=len(i)là tiết kiệm độ dài của chuỗi vì nó được sử dụng khá nhiều lần.

a=range(-l,l+1) - một công cụ nhanh chóng để tạo một trình vòng lặp bao gồm các khoảng cách có sẵn từ gốc cả hai chiều dọc theo một chiều.

g=[(y,x)for y in a for x in a] xây dựng một danh sách các tọa độ tuple tạo nên toàn bộ lưới cuối cùng.

p=[(y,x)for y,x in g if abs(x+y*1j)<=l and x|y] tạo một tập hợp con của danh sách chỉ chứa tọa độ mà các chữ cái không nằm giữa có thể có thể nằm trên.

m=i[l//2] thiết lập nhân vật trung tâm.

d=[*i.replace(m,"",1).center(len(p))]- nhân vật trung tâm được đưa ra ngoài, để lại cho chúng tôi những mảnh vụn khác. Các center()chức năng là rất tốt đẹp ở đây, bởi vì nó cho phép chúng ta pad ra dòng (với mặc định một không gian) cho đến khi đó là một số lượng nhất định các ký tự. Ở đây, đó là số lượng không gian mà các chữ cái có thể nằm trên, do đó phản ánh sự phân phối mà chúng ta cần.

r.shuffle(d) tự nhiên xáo trộn cho biết phân phối để thực sự ... phân phối.

Vòng lặp, for c in g: o+=m if c==(0,0)else d.pop()if c in p else" "nhìn qua toàn bộ ô vuông khả thi, bất kể mọi thứ có thể hạ cánh trên nó hay không, và khi cần thiết, sẽ thêm một ký tự vào chuỗi đầu ra của chúng tôi o. Các nhân vật được bật ra khỏi mẫu mảnh vỡ của chúng tôi để chúng chỉ xuất hiện một lần.

if c[1]==l:o+="\n"- Thêm ngắt dòng là tốt. Trả về.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.