폭발하는 고양이!


17

도전

length의 문자열 입력을 취하는 프로그램 / 함수를 만들고 다음을 수행합니다 n.

  1. 박았 kth어디 공간의 중심에 문자를 k = (n+1)/2. 이것은 그라운드 제로의 위치입니다.
  2. 공백이 아닌 나머지 문자는 그라운드 제로 주위에 무작위로 배치합니다. 숯에서 피타고라스 거리는 초과해서는 안됩니다 n.
  3. 결과를 출력합니다.

설명이 필요한 경우 아래 예를 참조하십시오.


규칙

  • 표준 허점이 적용됩니다!
  • I / O는 문자열 형식이어야합니다.
  • 그라운드 제로에 놓을 중심 문자가 있는지 확인하기 위해 입력은 항상 홀수입니다.
  • 모든 유효한 출력은 0이 아닌 확률로 발생해야합니다.

이것은 . 바이트 단위의 가장 짧은 코드가 승리합니다!


입력: qwert

그라운드 제로에서 발생하는 폭발의 경계 (x의 나머지 문자는 유효한 위치 임) :

     x
  xxxxxxx
 xxxxxxxxx
 xxxxxxxxx
 xxxxxxxxx
xxxxxexxxxx
 xxxxxxxxx
 xxxxxxxxx
 xxxxxxxxx
  xxxxxxx
     x

출력 예 :

       t
     r

q    e


      w

무작위로 위치를 선택하면 한 문자가 다른 문자의 동일한 위치로 이동하여 덮어 쓸 수 있습니다. 이것이 허용됩니까? (내 제안 : 아니오)
edc65

당신이 맞아요 : 아니요.
Mama Fun Roll

1
이것은 지구상에서 나를 폭파시키는 것과 어떤 관련이 있습니까? (나는 제목의 관련성을 정말로 이해하지 못한다 ...)
cat

1
@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 x 2n + 1

''⍴⍨s 그 모양으로 공간의 제곱을 만듭니다

A@I⊢B 요소를 넣습니다 AI매트릭스의 인덱스 에 를B

+.ר⍨n-⍳s 행렬 중심으로부터의 거리 제곱

(××n≥*∘.5) 해당 거리가 0이 아닌 위치를 나타내는 부울 행렬 ≤n

부울 행렬에서 1의 좌표 쌍

i[n?≢i← ... ] 무작위로 n 개를 선택하십시오 (중복 없음)

n⊣¨¨@(⊢≡¨⌽) 중심을 바꾸다 n n

⍵@( ... )⊢ ... 주어진 행렬에서 인수의 문자를 공백 행렬에 넣습니다.


3

자바 스크립트 (ES6) 211 216 220

@usandfriends에서 1 바이트 저장 편집

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 thx 내가 어떻게 그리웠는지 모르겠다
edc65

new Date()%h-l대신 사용하십시오 Math.random()*h-l|0. 바이트를 저장합니다.
ericw31415

1
@ ericw31415는 0 만 사용합니다. 바이트도 절약됩니다. 그러나 둘 다 작동하지 않습니다
edc65

2

루비, 211 207 203 196 자

4 자 edc65 덕분에

->(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.charsx문자열을 한 문자 문자열의 배열로 변환

o,b,c=x.sizeo나중에 사용하기 위해 입력 길이를 저장하십시오 . b그리고 c간단하게 초기화 할 필요가 뭔가 이전 할당에 부착하여, 이렇게 저장이 개 문자.

l=o*2+1 이것은 모든 캐릭터가 갈 수있는 필드의 길이 / 폭이며 폭발 원의 지름입니다.

Array.new(l){Array.new l,' '}공백 문자 의 lx l크기의 2D 배열을 만듭니다.

a[o][o]=x.delete_at o/2배열의 중심을 x(입력) 값의 중심으로 설정하고 그 값을x

... while x[0]비어 while있을 때까지 블록 (이 경우 코드 가 인라인이기 때문에 이전 코드 )을 반복해서 실행하십시오 x. 루비에서 존재하지 않는 인덱스에 액세스하면 nilfalse 값을 반환 합니다.

a[b=rand(l)][c=rand(l)]==' '할당 bc랜덤 값 0 <= N < l. 에 자리 경우 확인 b, c비어가 (일명 세트 공백 문자이다)

(b-o)**2+(c-o)**2<=o*o피타고라스 거리 점검. o입력의 길이입니다. **루비의 지수 연산자 val<=o*o이며보다 짧습니다 val**0.5<=o.

a[b][c]=x.pop에서 마지막 값을 삭제하십시오 x. 위치 설정 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

파이썬 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)

온라인 시도는 옵션입니다.

최근 활동으로 인해 우연히 만난 사람들은 내가 이것에 좋은 시간을 보낼 때까지 어떻게 든 2 세 이상임을 알지 못했습니다. 글쎄, 두 가지 답변은 슬프기 때문에 어쨌든 게시하는 것이 좋습니다. 나는 이것을 개선하기 위해 수십 가지 방법이 있다고 확신합니다. 지금까지 입력이 항상 이상하다는 것을 알지 못했습니다.

설명

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))]— 중심 인물이 제거되어 다른 파편이 남게됩니다. 이 center()기능은 특정 문자 수가 될 때까지 줄을 채울 수 있기 때문에 매우 좋습니다. 이것은 글자가 들어갈 수있는 공간의 수입니다. 따라서 필요한 분포를 반영합니다.

r.shuffle(d) 자연스럽게 분포가 실제로 분포되어 있다고 셔플합니다.

루프 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.