¡Gatos explosivos!

17

Desafío

Hará un programa / función que toma una entrada de cadena de longitud ny:

  1. Pone el kthcarbón en el centro del espacio, donde k = (n+1)/2. Esta será la ubicación de su punto cero.
  2. Pone el resto de los caracteres que no son espacios en blanco dispuestos aleatoriamente alrededor de la zona cero. La distancia de Pitágoras al carbón no debe exceder n.
  3. Emite el resultado.

Si necesita aclaraciones, consulte el siguiente ejemplo.


Reglas

  • Se aplican lagunas estándar.
  • La E / S debe tener la forma de una cadena.
  • La entrada siempre será extraña para garantizar que tenga un carácter central para poner en la zona cero.
  • Cada salida válida debe ocurrir con una probabilidad distinta de cero.

Este es el ; ¡el código más corto en bytes gana!


Ejemplo

Entrada: qwert

Los límites de la explosión que emana de la zona cero (x marca lugares válidos para el resto de los caracteres):

     x
  xxxxxxx
 xxxxxxxxx
 xxxxxxxxx
 xxxxxxxxx
xxxxxexxxxx
 xxxxxxxxx
 xxxxxxxxx
 xxxxxxxxx
  xxxxxxx
     x

Salida de ejemplo:

       t
     r

q    e


      w
Mama Fun Roll
fuente
Al seleccionar la posición al azar, un personaje podría ir en la misma posición de otro y sobrescribirlo. ¿Esto está permitido? (Mi sugerencia: no)
edc65
Tienes razón: No.
Mama Fun Roll
1
¿Qué tiene que ver esto con hacerme explotar? (Realmente no entiendo la relevancia del título ...)
gato
1
@cat Esta es una modificación de un programa cat, excepto que explota la entrada.
Mama Fun Roll

Respuestas:

0

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

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

Pruébalo en línea!

{ } función anónima con argumento

n←≢⍵ variable n es la longitud

s←2⍴1+2×nvariable ses la forma del resultado: 2n + 1 por 2n + 1

''⍴⍨s crear un cuadrado de espacios con esa forma

A@I⊢Bpone elementos Aen (pares de) índices Ien matrizB

+.ר⍨n-⍳s distancias al cuadrado desde el centro de la matriz

(××n≥*∘.5) matriz booleana que indica dónde esas distancias son distintas de cero y ≤n

pares de coordenadas para los 1 en la matriz booleana

i[n?≢i← ... ] elija n de ellos al azar (sin duplicados)

n⊣¨¨@(⊢≡¨⌽) cambiar el central a n n

⍵@( ... )⊢ ... coloca los caracteres del argumento en los índices dados en la matriz de espacios

ngn
fuente
3

JavaScript (ES6), 211 216 220

Editar 1 byte guardado gracias @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`
`

Prueba

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>

edc65
fuente
Tienes un espacio extra antesg.map(r=>r.join``)...
usandfriends
@usandfriends thx No sé cómo me lo perdí
edc65
Usar en new Date()%h-llugar de Math.random()*h-l|0. Se ahorra bytes.
ericw31415
1
@ ericw31415 usa solo 0. También ahorra bytes. Pero ambos no funcionarán
edc65
2

Rubí, 211 207 203 196 caracteres

Gracias a edc65 por 4 personajes.

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

Explicación:

->(x){...} define una función anónima que toma un argumento x

x=x.charstransformarse xde una cadena en una matriz de cadenas de un carácter

o,b,c=x.sizealmacenar la longitud de la entrada opara su uso posterior. by csimplemente necesita inicializarse en algo , así que guarde 2 caracteres adjuntándolos a una tarea previa.

l=o*2+1 Esta es la longitud / anchura del campo donde todos los caracteres podrían ir, también el diámetro del círculo de explosión.

Array.new(l){Array.new l,' '}crea una matriz 2D de caracteres espaciales en tamaño lx l.

a[o][o]=x.delete_at o/2establece el centro de la matriz en el centro de los valores de x(la entrada), mientras elimina ese valor dex

... while x[0]ejecute el bloque (en este caso, el código anterior whileporque está en línea) una y otra vez hasta que xesté vacío. En ruby, acceder a un índice que no existe devuelve nil, que es un valor falso.

a[b=rand(l)][c=rand(l)]==' 'Asigne by ca valores aleatorios donde 0 <= n < l. Luego verifique si el lugar en b, cestá vacío (también conocido como el carácter de espacio)

(b-o)**2+(c-o)**2<=o*oControl de distancia pitagórica. oes la longitud de la entrada. **es el operador de exponenciación de ruby ​​y val<=o*oes más corto queval**0.5<=o .

a[b][c]=x.popborrar el último valor de x. Establecer la posición a, ba ese valor en la 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]Establezca una posición aleatoria en el último valor si esa posición es libre y está dentro del radio de explosión; sigue haciendo esto hasta que nos quedemos sin personajes para colocar.

$/se establece en la nueva línea del sistema operativo. También es más corto que"\n"

a.map(&:join).join $/Asigne todos los arreglos aa una versión de una sola cadena de sí mismos (por ejemplo, ['a','b','c']-> 'abc'). Tome esa nueva matriz y únala con nuevas líneas. Retorno implícito.

Shelvacu
fuente
o * o es más corto que ** 0.5
edc65
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)

Probarlo en línea es una opción.

Whoops, tropezó con esto debido a una actividad reciente, no notó que tenía más de dos años de alguna manera hasta que pasé un buen rato en esto. Bueno, dos respuestas son un poco tristes, así que probablemente sea una buena idea publicar de todos modos. Estoy seguro de que hay docenas de formas de mejorar esto: hasta ahora no noté que la información siempre es extraña, lo que hubiera sido útil saber.

Explicación

i=input() es entrada, por supuesto, l=len(i) está guardando la longitud de la cadena porque se usa varias veces.

a=range(-l,l+1) - una herramienta rápida para crear un iterador que varía las distancias disponibles desde el origen en ambos sentidos a lo largo de una dimensión.

g=[(y,x)for y in a for x in a] construye una lista de coordenadas de tupla que conforma la cuadrícula final completa.

p=[(y,x)for y,x in g if abs(x+y*1j)<=l and x|y] crea un subconjunto de la lista que contiene solo las coordenadas en las que las letras que no están en el centro pueden aterrizar

m=i[l//2] Establece el carácter central.

d=[*i.replace(m,"",1).center(len(p))]- el personaje del centro es eliminado, dejándonos con los otros escombros. La center()función es muy agradable aquí, porque nos permite rellenar la línea (con un espacio predeterminado) hasta que tenga una cierta cantidad de caracteres. Aquí, ese es el número de espacios en los que las letras pueden aterrizar, reflejando así la distribución que necesitamos.

r.shuffle(d) naturalmente, baraja dicha distribución para ser realmente ... distribuida.

El bucle, for c in g: o+=m if c==(0,0)else d.pop()if c in p else" "mira sobre todo el cuadrado de mosaicos factibles, independientemente de cualquier cosa que pueda aterrizar sobre él o no, y según sea necesario, agrega un carácter a nuestra cadena de salida o. Los caracteres salen de nuestra muestra de escombros para que solo aparezcan una vez.

if c[1]==l:o+="\n"- Agrega saltos de línea también. Devoluciones.

Reecer6
fuente