Gatos de explosão!


17

Desafio

Você criará um programa / função que aceita uma entrada de string de comprimento ne:

  1. Coloca o kthcaractere no centro do espaço, onde k = (n+1)/2. Este será o local do seu marco zero.
  2. Coloca o restante dos caracteres que não são de espaço em branco dispostos aleatoriamente em torno do ponto zero. A distância pitagórica do carvão não deve exceder n.
  3. Mostra o resultado.

Se você precisar de esclarecimentos, veja o exemplo abaixo.


Regras

  • Aplicam-se brechas padrão!
  • A E / S deve estar na forma de uma sequência.
  • A entrada sempre será estranha para garantir que você tenha um caractere central para colocar no ponto zero.
  • Toda saída válida deve ocorrer com uma probabilidade diferente de zero.

Isso é ; o menor código em bytes vence!


Exemplo

Entrada: qwert

Os limites da explosão que emana do ponto zero (marca de x é um local válido para o resto dos caracteres):

     x
  xxxxxxx
 xxxxxxxxx
 xxxxxxxxx
 xxxxxxxxx
xxxxxexxxxx
 xxxxxxxxx
 xxxxxxxxx
 xxxxxxxxx
  xxxxxxx
     x

Exemplo de saída:

       t
     r

q    e


      w

Selecionando a posição aleatoriamente, um caractere poderia ir na mesma posição do outro e substituí-lo. Isso é permitido? (Minha sugestão: não)
edc65 24/01

Você está certo: Não.
Mama Fun Roll

11
O que diabos isso tem a ver com me explodir? (Eu realmente não entendo a relevância do título ...)
cat

11
@cat Esta é uma modificação de um programa cat, exceto que você explode a entrada.
Mama Fun Roll

Respostas:


0

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

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

Experimente online!

{ } função anônima com argumento

n←≢⍵variável né o comprimento

s←2⍴1+2×nvariável sé a forma do resultado: 2n + 1 por 2n + 1

''⍴⍨s crie um quadrado de espaços com essa forma

A@I⊢Bcoloca elementos Aem (pares de) índices Ina matrizB

+.ר⍨n-⍳s distâncias ao quadrado do centro da matriz

(××n≥*∘.5) matriz booleana indicando onde essas distâncias são diferentes de zero e ≤n

pares de coordenadas para os 1s na matriz booleana

i[n?≢i← ... ] escolha n deles aleatoriamente (sem duplicatas)

n⊣¨¨@(⊢≡¨⌽) mude o central para n n

⍵@( ... )⊢ ... coloque os caracteres do argumento nos índices fornecidos na matriz de espaços


3

JavaScript (ES6), 211 216 220

Editar 1 byte salvo 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`
`

Teste

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>


Você tem um espaço extra antesg.map(r=>r.join``)...
usandfriends

@usandfriends thx Eu não sei como eu perdi
edc65

Use em new Date()%h-lvez de Math.random()*h-l|0. Ele salva bytes.
Ericw31415

11
@ ericw31415 use apenas 0. Ele salva bytes também. Mas ambos não vai funcionar
edc65

2

Rubi, 211 207 203 196 caracteres

Agradecimentos a edc65 por 4 caracteres

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

Explicação:

->(x){...} define uma função anônima que recebe um argumento x

x=x.charstransformar xde uma sequência em uma matriz de sequências de um caractere

o,b,c=x.sizearmazene o comprimento da entrada opara uso posterior. be csimplesmente precisa ser inicializado em algo , então salve 2 caracteres anexando a uma tarefa anterior.

l=o*2+1 este é o comprimento / largura do campo onde todos os caracteres podem ir, também o diâmetro do círculo de explosão.

Array.new(l){Array.new l,' '}faça uma matriz 2D de tamanho lx lde caracteres de espaço.

a[o][o]=x.delete_at o/2define o centro da matriz como o centro dos valores de x(a entrada), enquanto exclui esse valor dex

... while x[0]execute o bloco (nesse caso, o código anterior whileporque está embutido) repetidamente até xficar vazio. Em ruby, acessar um índice que não existe retorna nil, que é um valor falsey.

a[b=rand(l)][c=rand(l)]==' 'Atribua be ca valores aleatórios onde 0 <= n < l. Em seguida, verifique se o ponto a partir b, cestá vazia (aka está definido para caractere de espaço)

(b-o)**2+(c-o)**2<=o*oVerificação de distância de Pitágoras. oé o comprimento da entrada. **é o operador de exponenciação do rubi e val<=o*oé menor que val**0.5<=o.

a[b][c]=x.popexclua o último valor de x. Definir a posição a, bpara que o valor na matriza

a[b][c]=x.pop if a[b=rand(l)][c=rand(l)]==' '&&(b-o)**2+(c-o)**2<=o*o while x[0]Defina uma posição aleatória para o último valor se essa posição estiver livre e estiver dentro do raio da explosão; continue fazendo isso até ficarmos sem caracteres para colocar.

$/está definido como a nova linha do sistema operacional. Também é mais curto que"\n"

a.map(&:join).join $/Mapeie todas as matrizes apara uma versão de cadeia única (ex: ['a','b','c']-> 'abc'). Pegue essa nova matriz e junte-a às novas linhas. Retorno implícito.


o * o é mais curto que ** 0,5
edc65 25/01

0

Python 3 , 286 bytes

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)

Tentá-lo online é uma opção.

Ops, tropeçou nisso devido a atividade recente, não percebi que tinha mais de dois anos até que passei um bom tempo nisso. Bem, duas respostas são meio tristes, então provavelmente é uma boa ideia postar assim mesmo. Tenho certeza de que há dezenas de maneiras de melhorar isso - não percebi até agora que a entrada é sempre estranha, o que seria útil saber.

Explicação

i=input() é entrada, é claro, l=len(i) está salvando o comprimento da string porque é usada algumas vezes.

a=range(-l,l+1) - uma ferramenta rápida para criar um iterador que varia as distâncias disponíveis da origem nos dois sentidos ao longo de uma dimensão.

g=[(y,x)for y in a for x in a] cria uma lista de coordenadas da tupla que compõem toda a grade final.

p=[(y,x)for y,x in g if abs(x+y*1j)<=l and x|y] cria um subconjunto da lista que contém apenas as coordenadas nas quais as letras não centrais podem pousar.

m=i[l//2] estabelece o caractere central.

d=[*i.replace(m,"",1).center(len(p))]- o personagem central é retirado, deixando-nos com os outros detritos. ocenter() função é muito boa aqui, porque nos permite preencher a linha (com um espaço padrão) até que tenha um certo número de caracteres. Aqui, esse é o número de espaços em que as letras podem pousar, espelhando assim a distribuição que precisamos.

r.shuffle(d) embaralha naturalmente a distribuição para ser realmente ... distribuída.

O loop,, for c in g: o+=m if c==(0,0)else d.pop()if c in p else" "examina todo o quadrado de blocos viáveis, independentemente de qualquer coisa que possa estar sobre ele ou não, e conforme necessário, adiciona um caractere à nossa string de saída o. Os caracteres são retirados de nossa amostra de detritos para que apareçam apenas uma vez.

if c[1]==l:o+="\n"- Adiciona quebras de linha também. Retorna.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.