Una cadena normal se ve así:
Hello,IAmAStringSnake!
Y una serpiente de cadena se ve así:
Hel
l rin
o,IAmASt g
S
!ekan
Tu tarea
Las serpientes de cadena son peligrosas, por lo que debe hacer un programa que tome una serpiente de cadena como entrada y la envíe como una cadena normal.
Especificaciones
- La entrada puede ser una cadena multilínea o una matriz de cadenas.
- Cada línea de la entrada se rellenará con espacios para formar una cuadrícula rectangular.
- Los personajes de la serpiente solo pueden conectarse con los personajes adyacentes arriba, abajo, a la izquierda o a la derecha de ellos (al igual que en el juego Snake). No pueden ir en diagonal.
- Los personajes de la serpiente nunca serán adyacentes a otra parte de la serpiente, solo los personajes conectados.
- El primer carácter de la cadena es el carácter final con la distancia más corta de Manhattan desde la esquina superior izquierda de la cuadrícula de entrada (es decir, el número mínimo de movimientos necesarios para que una serpiente vaya directamente desde el carácter final a la esquina superior izquierda esquina). Ambos extremos nunca tendrán la misma distancia.
- La cadena puede contener cualquier carácter ASCII entre los puntos de código 33 y 126 inclusive (sin espacios ni líneas nuevas).
- La cadena tendrá entre 2 y 100 caracteres de longitud.
- El código más corto en bytes gana.
Casos de prueba
(Cuadrícula de entrada, seguida de la cadena de salida)
Hel
l rin
o,IAmASt g
S
!ekan
Hello,IAmAStringSnake!
----------
Python
Python
----------
P ngPu Code
r i z d G
o m z n o
gram lesA lf
ProgrammingPuzzlesAndCodeGolf
----------
~ zyx tsr XWVUTSR
}|{ wvu q Y Q
! p Z `ab P
"#$ 6789:; o [ _ c O
% 5 < n \]^ d N
('& 432 = m e M
) 1 > lkjihgf L
*+,-./0 ? K
@ABCDEFGHIJ
!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~
----------
tSyrep
r p
in Sli
g Sile
Snakes n
Ser ylt
a eh ilS
fe w t
emo h
Sre
SlipperyStringSnakesSilentlySlitherSomewhereSafe
Respuestas:
APL, 55 bytes
Esta función toma una matriz de caracteres con la serpiente de cadena.
Ejemplo:
Explicación:
(,⍵≠' ')/,⍳⍴⍵
: obtener las coordenadas de todos los no espacios(⊂0 0)
: comienza en (0,0) (que es una coordenada no válida){
...}
: sigue a la serpiente, posición dada y serpiente:1<⍴⍵:
: si queda más de 1 elemento:∆←⍵~⍺
: elimina la posición actual de la serpiente y la almacena∆
.+/¨|⍺-∆
: encuentra la distancia entre la posición actual y cada punto en el resto de la serpiente∆[⊃⍋...
] `: obtener el punto más cercano en la serpiente∇
: ejecute la función nuevamente, con el punto más cercano como el nuevo punto actual y la serpiente acortada como la nueva serpiente.⍺,
: agrega la posición actual al resultado de ese⋄⍺
: de lo contrario, solo devuelve la posición actual1↓
: suelta el primer elemento del resultado (que es la posición (0,0))⍵[
...]
: obtener esos elementos de ⍵, en ese ordenfuente
JavaScript (ES6) + SnakeEx , 176 bytes
¿Recuerdas SnakeEx? Bien, porque yo tampoco! Sugerencias de golf bienvenidas.
fuente
MATL , 80 bytes
Gracias a @LevelRiverSt por una corrección
La entrada es como una matriz 2D de caracteres, con filas separadas por
;
. Los casos de prueba en este formato sonPruébalo en línea!
Explicación
Las coordenadas de cada carácter no espacial se representan mediante un número complejo. Para cada carácter actual, el siguiente se obtiene como el más cercano (diferencia absoluta mínima de sus coordenadas complejas).
Para determinar el carácter inicial, se deben encontrar los dos puntos finales. Esto se hace de la siguiente manera. Un punto final es un carácter no espacial que tiene exactamente un vecino no espacial. El número de vecinos se obtiene por convolución 2D con una máscara adecuada. El punto inicial es el punto final cuya coordenada compleja tiene la menor suma de partes reales e imaginarias; es decir, es la distancia más cercana en Manhattan al número complejo 0, o equivalente a 1 + 1j, que es la coordenada compleja de la esquina superior izquierda.
fuente
The initial point is the endpoint whose complex coordinate has the least absolute value
Cuidado: ¡distancia euclidiana! = Distancia de Manhattan. por ejemplo, el punto 7 + 7j tiene una distancia euclidiana de 9.8994 y una distancia de Manhattan 14. 10j está más lejos por la distancia euclidiana pero considerablemente más cerca por la distancia de Manhattan. Aparte de eso, ¡gran concepto!C
198190179180181 bytesEditar: Usé la sugerencia por user81655 y eliminé el paréntesis en el operador ternario, ¡gracias! También cambié la engorrosa prueba (S & 1) de uniformidad para el S% 2 más apropiado (¡y más corto!).
Edit2: el uso de * un estilo de direccionamiento en gran medida, me hizo ciego a las optimizaciones obvias en la definición de S, es decir, reemplazar * (a + m) por a [m] etc. Luego reemplacé S por T, lo que esencialmente hace la mitad de lo que hace S. El código ahora también aprovecha el valor de retorno de putchar.
Edit3: Se corrigió el error que existía desde el principio, el criterio de detención de búsqueda de Manhattan a <b + m es correcto solo si a ya se ha disminuido. Esto agrega 2 bytes, pero uno se recupera al hacer la definición de m global.
Edit4: Mi golf ha pasado el mínimo y ahora está yendo por el camino equivocado. Otra corrección de errores relacionada con la búsqueda de Manhattan. Originalmente tenía verificaciones entrantes en su lugar y sin ellas la búsqueda continúa para grandes conjuntos de entrada (en algún lugar alrededor de 50x50) más allá del conjunto b. Por lo tanto, esa matriz debe expandirse al menos al doble del tamaño anterior, lo que agrega un byte más.
Ungolfed y explicó:
fuente
a[1]
,a[-m]
etc., y hagam
global -m=103;main()
.C, 272 bytes
Mira la fuente de @ Zunga. Ahora mira el mío. ¿Quieres saber cómo obtuve los 91 bytes adicionales?
Sin golf:
fuente
Python (2 y 3),
640 624 604 583 575 561 546538 bytesTodavía soy un golf n00b, así que esto es un poco grande.
Editar: ¡Gracias a @porglezomp por las sugerencias! No eliminé todos los operadores 'y' ya que eso rompería Python 3.
Edit2: Gracias a @Aleksi Torhamo por el comentario sobre isspace (). La reducción resultante compensa la corrección de errores que puse. ¡También gracias a anónimo por el resaltado de sintaxis!
Edit3: Gracias a @ mbomb007 por algunos bytes adicionales.
Y aquí está mi versión previa al golf
fuente
S=lambda s:s.isspace()
y luego haciendo enS(s)
lugar des.isspace()
.and
a<
, ya quef() < g() < h()
es lo mismog = g(); f() < g and g < h()
en términos de efectos secundarios (cortocircuito de cadenas de comparación), y de todos modos está ignorando el resultado de las comparaciones.m[(x,y)]=
es lo mismo que el más cortom[x,y]=
S=str.isspace
S
y, en cambio, usarlo<'!'
en cada caso puede tener la misma longitud, posiblemente abriendo la oportunidad de ahorrar más. Cambiarif 1-S(v[x]):
aif(v[x]<'!')<1:
, por ejemplo. Y tal vez podría eliminar algunos paréntesis en las comparaciones posteriores al hacerlo de esa manera.JavaScript (ES6), 195
Ver explicación dentro del fragmento de prueba
Prueba
fuente
););}
?for
encabezado donde se necesitan 2 puntos. El segundo es el delímetro para elfor
cuerpoLua,
562535529513507504466458 BytesCon mucho, mi golf más masivo en este momento,
creo que todavía puedo cortar 100 bytes, para lo cual trabajaré, pero lo publico como respuesta, ya que ya me tomó un tiempo :)Tenía razón, ¡he reducido más de 100 bytes! No creo que haya mucho margen de mejora.Esta función debe llamarse con una matriz 2D que contiene un carácter por celda.
¡ Ahorré 40 bytes mientras trabajaba con @KennyLau , gracias a él!
Woohoo! ¡Menos de 500!
Sin golf
Las explicaciones vendrán una vez que termine de jugar golf, por el momento, le prestaré una versión legible de este código fuente: D ¡Aquí vienen las explicaciones!Editar: no actualizado con la última modificación, todavía jugando golf antes de actualizar. Lo mismo ocurre con las explicaciones.
Así que aquí vienen algunas explicaciones detalladas sobre cómo funciona este programa.
En primer lugar, consideremos el ciclo etiquetado
a
, nos permite encontrar el extremo más cercano a la esquina superior izquierda. Se repetirá para siempre si no hay un final, pero eso no es un problema: D.En una cuadrícula de 4x4, aquí están las distancias de las serpientes (izquierda) y el orden en que se miran (derecha)
Para cada uno de estos personajes, para ser el final, debe verificar dos condiciones: - No ser un espacio - Estar rodeado por exactamente 3 espacios (o exactamente 1 sin espacio)
Estas condiciones se verifican en el siguiente código
Comprobar si el carácter no es un espacio se logra mediante la expresión
m[i][j]~=s
.Verificando si estamos rodeados de solo 1 no espacio se logra al xor-re las condiciones anteriores para nuestro entorno, esto podría escribirse como
Y finalmente, si todo lo anterior se evalúa como verdadero, el ternario devolverá lo que está en el último
and
->m[i][j]
. De lo contrario, dejamosr
desarmado :)Ahora que tenemos la cabeza de la serpiente, ¡vamos al otro extremo! La iteración de la serpiente se logra principalmente mediante los siguientes terneros anidados:
Reestablecemos
i
yj
al mismo tiempo para evitar la necesidad de dummies para almacenar los valores antiguos. Ambos tienen exactamente la misma estructura y usan condiciones simples, por lo que los presentaré en forma de anidadosif
, debería permitirle leerlos. más fácilmente. :)Se puede traducir a:
¡Pruébalo!
Aquí está el código que uso para ejecutar esto, puede probarlo en línea copiando y pegando.
fuente
Lua, 267 bytes
Se requiere Lua 5.3.
Uso:
fuente
Python 3,
245243241236 bytess
es la cadena de entrada,n
es la salida impresa en stdout:Editar: ¡ Gracias a @Cees Timmerman por guardar 5 bytes!
fuente
c>' 'and
yprint n
en Python 2.if
lugar deelif
?s
variable es una cadena multilínea; el último carácter de la cadena debe ser una nueva línea (esto es necesario para aprobar elPython
caso de prueba)Python, 537
Mi solución inicial:
Compactado un poco, pero lo dejó como método:
fuente
Java 7,
927924923 bytesOk, eso tomó un tiempo ... En algunos lenguajes de programación no importa si su matriz x e y están fuera de los límites de una matriz 2D, pero con Java arrojará
ArrayIndexOutOfBoundsExceptions
, por lo que todo debe ser verificado ...Primero determino el punto de partida, y luego uso un método recursivo para construir la cadena desde allí. Además, utilizo una lista para realizar un seguimiento de las coordinaciones que ya he encontrado, por lo que no entrará en un bucle de ida y vuelta (resultando en una excepción StackOverflowException).
Esta es probablemente la respuesta más larga que he publicado hasta ahora, pero aunque algunas partes se pueden jugar al golf, no creo que este desafío pueda ser mucho más corto en Java. Java simplemente no es adecuado para seguir un camino en una cuadrícula. No obstante, fue un desafío divertido descubrir. :)
Sin golf y casos de prueba:
Pruébalo aquí
Salida:
fuente
PHP,
199184182 bytesaún puede tener un poco de golf
toma la entrada como una cadena multilínea desde la línea de comando, espera saltos de línea de estilo Linux.
Correr
php -r '<code>' '<string>'
; escapar de los saltos de línea.Descompostura
fuente
C #, 310
(Editar: corrección de errores)
Una función con un parámetro de cadena multilínea, que devuelve una cadena.
Incluyendo lo solicitado
using
en el recuento de bytes.Esta es una portabilidad de mi respuesta de JavaScript.
Prueba de ideona
Con espacios
fuente
Python 2, 251 bytes
O, si desea nuevas líneas principales en sus casos de prueba, 257 bytes:
Pasa todos los casos de prueba.
Resultados en:
fuente
b.append(...)
conb+=[...]
ydef n(x,y):return ...
conn=lambda x,y:...
' '
.~-x
lugar dex-1
, no tendrá que usar paréntesis.Japt
-P
, 106 bytesPruébalo en línea!
Es ... um ... una abominación.
Desempaquetado y cómo funciona
Un punto notable es que utilicé la precedencia del operador entre los operadores de asignación y coma en JS, para empacar algunas líneas y mantener el atajo
@
(XYZ{
) utilizable.fuente