Inspirado en uno de los videos de Vi Hart (que son un tesoro lleno de posibles ideas de desafío)
Una serpiente está formada por segmentos de la misma longitud y la conexión entre cada segmento puede ser recta o girar 90 °.
Podemos codificar una serpiente de este tipo (hasta una rotación, que depende de la dirección inicial) escribiendo una diapositiva , la dirección de las vueltas (recta / izquierda / derecha) que toma. Este, comenzando en la parte superior izquierda y apuntando a la derecha
-+ +--+ SR RSSR
| +-+ | S RSL S
+--+ --+ LSSL SSR
Estaría representado por el slither SRSLSSLRLRSSRSRSS
Y, por supuesto, una serpiente plana no puede cruzarse (como en SSSSLLLSS
), lo que daría como resultado un horrible juego pixelado.
Su tarea es determinar si un deslizamiento es válido o no (resulta en al menos una auto-intersección)
Input
Una cadena hecha de letras SLR
con 2 < length < 10000
Output
Something Truthy si es un slither válido y algo Falsey si no lo es.
Casos de prueba
__Valid__
SSLSLSRSRSSRSSSLLSSSRRLRSLRLLSSS
SRRLSLLRRLLSLRRSRLLRSRRLLRRSRLLSSLLRSRRLLRRSRLLRSRRLSLLRRLLSLRR (A hilbert curve)
RLLRSRRLSLLRRLLSLRRSRLLRSRRLLRRSRLLSSLLRSRRLLRRSRLLRSRRLSLLRRLLSLRRSRLLRSRRLLRRSRLLSSLLRSRRLLRR
SRRSRSRSSRSSRSSSRSSSRSSSSRSSSSRSSSSSRSSSSSRSSSSSSRSSSSSSRSSSSSS (Spiral)
SSSSSSSSSSLSSSSSSSLSSSSSSSSLSSSSSLSSSSSSLSSSLLRRLLRRLLSLSSSRRSSSSRSSSRSSSSSSRSSSSSRSSSSSSSSRSSSSSSSRSSSSSSSSS (bigger, squigglier spiral)
LRSLLRLSRSLLSRLSLRSLSSSLRRSSLSRRLRSRLRLSLRLLRLRSSLSLRLRSRSSSSSLSRRLSLSSSRRLRLRLRLRRLLSSLSSSRRLRLRLRLRLSLSSSSSSSSSSSSSRLRLLRLRLRLRLRLRLRLSLSSSLSLSLL
__Invalid__
SRRLSLLRRLLSLRRSRLLRSRRLLRRSRLLLLRSRRLLRRSRLLRSRRLSLLRRLLSLRR
SRRLSLLRRLLSLRRSRLLRSRRLLSRSSSRSSSSSSSRSRSSSSSSSRRLLRRSRLLRSRRLSLLRRLLSLRR
SRRSRSRSSRSSRSSSRSSSRSSSSSSSSSSRSSSSRSSSSSRSSSSSRSSSSSSRSSSSSSRSSSSSS
SSSSSSSSSSLSSSSSSSLSSSSSSSSLSSSSSLSSSSSSLSSSLLRRLRLRRLLSLSSSRRSSSSRSSSRSSSSSSRSSSSSRSSSSSSSSRSSSSSSSRSSSSSSSSS
LRSLLRLSRSLLSRLSLRSLSSSLRRSSLSRRLRSRLRLSLRLLRLRSSLSLRLRSRSSSSSLSRRLSLSSSRRLRLRLRLRRLLSSLSSSRRLRLRLRLRLSLSSSSSSSSSSSSSRLRLLRLRLRLRLRLRLRLSLSSSLSLSLLSLRLSLRSLRSLRSLSLSLRSRLSLRSLRLSRSLLLRLRLRRRRSLSLSSLLSLSLSLSSLLSLSLLRLRSLLRSRLSLSSLLLLSSSSSSSSSSSSSSSSSSSSRLRLLRRLRLRLLRLRLRLRLRLSSSSLSLRLLRLSLSSLSLSLSLSLRLLRLSLLLSRSSSSSSSSSSSSSSSRLRLRLLRLRLSLSRSRSSSLSRLRLRLRSLSLSLSRLLSRLSLSLSLSLSSLSLSLLSLSRLLRLRLRLRLRLRLRLRLRLRLSLSRLRLSLLRRLSLLSLSLSLSLSLLSLSLSLRLRLRLRLRLRLRLRLRLRRLRSLSLSLSLSLSLSLSSLSSSSSLSLSSSLSLSLSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS
Puede dibujar los slithers aquí (R y L están invertidos, pero no afecta la validez)
fuente
SRRR
en un papel cuadriculado con un cuadrado por segmento, entonces se superpondría y, por lo tanto, no es válido, simplementeRRR
ocuparía exactamente un cuadrado de 2x2 sin superposiciones (al igual que en el juego clásico)Respuestas:
Pyth,
2220 bytesPruébelo usted mismo o ejecute el testuite .
Tenga en cuenta los valores ASCII de SRL, respectivamente 83, 76, 82. Abuso del hecho de que:
Desde aquí solo mantengo una variable para la posición actual y la dirección actual. Para cada personaje, multiplico la dirección actual con el número complejo anterior, luego lo agrego a la posición actual.
Al final verifico si todos los puestos visitados son únicos.
fuente
CJam, 30 bytes
Explicación a seguir pronto.
Pruébelo en línea aquí o ejecute toda la suite .
fuente
S
, ¿significa que la serpiente ya ha ocupado tanto (0,0) como (1,0)?JavaScript (ES6), 84
89Ejecute el fragmento en Firefox para probar.
Algunas notas:
undefined
. En la primera visita, el operador tilde lo cambia a -1, lo cual es una verdad. Finalmente, en una segunda visita, el valor cambia a 0 que es falso y elevery
ciclo termina devolviendo falso.fuente
TI-BASIC,
49 56 5351 bytesSimilar al método de orlp, esto crea una lista de todos los puntos en el plano complejo visitado por la serpiente, comenzando en el origen. Si la lista no tiene elementos duplicados, el código devuelve algún valor positivo. Tenga en cuenta que en una cadena de más de 999 elementos, la calculadora no podrá generar una lista suficientemente larga y generará un error.
EDITAR: se guardaron dos bytes a costa de la fealdad, ya que no hay dos puntos de red en el plano complejo que puedan estar a la misma distancia de e ^ i.
fuente
TI-BASIC,
6058 bytesEditar: ignore todo lo siguiente: una solución básica de trabajo está aquí , por Thomas-Kwa. ¡Vota eso!
⁻
es la[(-)]
clave, y Ans es[2ND]->[(-)]
. Ejecútelo encerrando las instrucciones de la serpiente entre comillas ([ALPHA]->[+]
) seguidas de dos puntos y luego el nombre del programa. Por ejemplo, si nombra el programa "SNAKE", ejecutaría el caso de prueba en el OP como"SRSLSSLRLRSSRSRSS":prgmSNAKE
.Editar: falla
SRRLSLLRRRS
. Tengo una versión revisada de 61 bytes, pero falla en el primer caso de prueba no válido:Intentaré arreglarlo mañana.
Actualización: el problema es que mi algoritmo es defectuoso. Si hubiera usado un For (bucle en lugar de seq ((para lograr lo mismo)) (ambos algoritmos anteriores, en realidad) podría describirse así:
Sin embargo, esto falla en deslizadores inválidos como
SRLRLRLRLRRRSS
. Ahora intentaré encontrar un algoritmo mejor ... o robar de otra respuesta.Estoy 90% seguro de que esto se puede reemplazar con un solo
seq(
comando, en realidad, pero por ahora esto es lo más pequeño que puedo obtener. Si tiene la intención de construir esto en un 8xp usando Sourcecoder en lugar de escribirlo, tenga en cuenta que≠
debe reemplazarse por!=
y el⁻1+
bit debe reemplazarse por~1+
.fuente
Rubí 87
89Prueba en línea: http://ideone.com/pepeW2
Versión sin golf:
fuente
Golfscript 48
49 50Espera que la cadena exista en la pila y devuelve
0
o1
.Puede probarlo en línea con pruebas para serpientes válidas e inválidas .
Esta es básicamente la misma idea que en mi respuesta de Ruby . Solo la matriz de dirección se trata de manera diferente, porque AFAIK Golfscript no tiene una función de rotación araria. En este caso, construyo una matriz de direcciones suficientemente grande, multiplicándola 10000 veces y luego recortando desde su inicio 0, 1 o 3 elementos, dependiendo del comando actual (S, R o L). La "dirección" actual para moverse es siempre el primer elemento de la matriz.
Aquí está con comentarios:
Editar:
Se guardó 1 carácter modificando cómo se consume la matriz de "direcciones".
Editar:
ahorró 1 char moviendo incrementos de 10 en lugar de 1 para hacer uso de la
?
sintaxis (potencia).fuente