Desafío
Hará un programa / función que toma una entrada de cadena de longitud n
y:
- Pone el
kth
carbón en el centro del espacio, dondek = (n+1)/2
. Esta será la ubicación de su punto cero. - 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
. - 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 código de golf ; ¡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
Respuestas:
APL (Dyalog Classic) ,
6866656362 bytesPruébalo en línea!
{ }
función anónima con argumento⍵
n←≢⍵
variablen
es la longituds←2⍴1+2×n
variables
es la forma del resultado: 2n + 1 por 2n + 1''⍴⍨s
crear un cuadrado de espacios con esa formaA@I⊢B
pone elementosA
en (pares de) índicesI
en 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 booleanai[n?≢i← ... ]
elija n de ellos al azar (sin duplicados)n⊣¨¨@(⊢≡¨⌽)
cambiar el central an n
⍵@( ... )⊢ ...
coloca los caracteres del argumento en los índices dados en la matriz de espaciosfuente
JavaScript (ES6), 211
216 220Editar 1 byte guardado gracias @usandfriends
Prueba
fuente
g.map(r=>r.join``)...
new Date()%h-l
lugar deMath.random()*h-l|0
. Se ahorra bytes.Rubí,
211207203196 caracteresGracias a edc65 por 4 personajes.
Explicación:
->(x){...}
define una función anónima que toma un argumentox
x=x.chars
transformarsex
de una cadena en una matriz de cadenas de un caráctero,b,c=x.size
almacenar la longitud de la entradao
para su uso posterior.b
yc
simplemente 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ñol
xl
.a[o][o]=x.delete_at o/2
establece el centro de la matriz en el centro de los valores dex
(la entrada), mientras elimina ese valor dex
... while x[0]
ejecute el bloque (en este caso, el código anteriorwhile
porque está en línea) una y otra vez hasta quex
esté vacío. En ruby, acceder a un índice que no existe devuelvenil
, que es un valor falso.a[b=rand(l)][c=rand(l)]==' '
Asigneb
yc
a valores aleatorios donde 0 <= n <l
. Luego verifique si el lugar enb
,c
está vacío (también conocido como el carácter de espacio)(b-o)**2+(c-o)**2<=o*o
Control de distancia pitagórica.o
es la longitud de la entrada.**
es el operador de exponenciación de ruby yval<=o*o
es más corto queval**0.5<=o
.a[b][c]=x.pop
borrar el último valor dex
. Establecer la posicióna
,b
a 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 arreglosa
a 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.fuente
Python 3 , 286 bytes
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 aterrizarm=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. Lacenter()
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 salidao
. 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.fuente