Tengo un serio problema. Tengo algunos archivos de texto donde guardo mis números muy importantes, ¡todos los importantes! Y dos y tres ...
Estos números eran tan importantes que no podía confiarlos a esos nuevos sistemas numéricos decimales o binarios. Mantuve cada número codificado en unario, así:
+--+
| |
+---+ +----+ |
| | | |
+---+ +-------+
~/two.txt
Simple y confiable: dos bucles ASCII para el número 2. Desafortunadamente, estas cosas tienden a enredarse con el tiempo y ahora me cuesta descubrir cuántos bucles hay en cada archivo. Aquí hay algunos ejemplos que trabajé a mano:
Uno:
+---+
| |
+--+ |
| |
+--+ |
| |
| |
| |
+--+ +--+
| |
+---------+
Tres:
+---------+
| +-----+ |
| | +-+ | |
| | | | | |
| | +-+ | |
| +-----+ |
+---------+
Cuatro:
+--------------+
| +--+ +--+ |
| | | | | |
+-|-----|-----|----+
| | | | | | | |
| +--+ +--+ +--+ |
+------------------+
+------------+
| |
+-----+ +-----+ |
| | | |
+-----|-----------+ | |
| | +--+ | | | |
+-+ +--|--|--+ +---------+
| | +-+ | | |
+------+ | | | |
+-------+ | |
|| | |
|+-----+
| |
+---+
Cinco:
+--------+ +--------+ +--------+
| | | | | |
| +--|-----+ +--|-----+ |
| | | | | | | | | |
+-----|--+ +-----|--+ +--------+
| | | |
+--------+ +--------+
¿Me pueden ayudar a contar mis bucles?
Estas son las reglas:
- Como guardo todo en unario codificado en ASCII, la eficiencia del espacio es muy importante para mí. Por lo tanto, este es el código de golf. El programa más pequeño en bytes gana.
- Los bucles se dibujan con los caracteres +, -, |. Cada esquina del bucle se dibuja sin ambigüedades: exactamente uno de los caracteres arriba y debajo del + será |, y exactamente uno a la derecha o izquierda será -. Dos marcas + nunca son adyacentes.
- Las hebras pueden pasar una debajo de la otra. Cuando los hilos se crucen, podrá ver el hilo "debajo" inmediatamente a ambos lados del hilo "sobre".
- Su programa debe tomar una representación de cadena del bucle (ya sea desde stdin o como un parámetro de función) y generar un número (ya sea stdout o como valor de retorno).
- Las longitudes de línea pueden no ser uniformes en el dibujo del bucle y puede haber espacios finales en cada línea.
- Puede suponer que hay al menos un bucle en la entrada.
¡Cuento con usted!
+
?Respuestas:
SnakeEx - 98 bytes con Javascript, 44 sin
Esto parecía un buen problema para probar mi idioma desde el desafío quincenal en:
El mejor lugar para probar esto es mi intérprete en línea .
SnakeEx hace coincidir patrones en el texto mediante el uso de "serpientes" que se mueven alrededor de las expresiones regulares de texto. El código se lee como una expresión regular, excepto:
<T>
instrucción Ese es un comando de dirección que ramifica a la serpiente de izquierda a derecha desde su dirección actual.{e<>PE}
es como una llamada de subrutina. Es el que genera una serpiente con definicióne
que avanza (<>
) y con parámetrosP
(piggyback - la serpiente de desove sigue a la nueva serpiente) yE
(exclusivo - no coincide con nada que ya haya sido igualado). Esta verificación exclusiva es lo único que impide que la serpiente se repita infinitamente.`
al final indica que lo que sigue debe coincidir solo si ya se ha comparado, lo que podemos usar para forzar el cierre del ciclo.Debido a que SnakeEx es como regex y técnicamente no genera los resultados deseados por sí mismo, supongo que necesitamos envolverlo en algún Javascript que llame al intérprete:
Editar : lo arregló para que funcione con los casos de prueba adicionales de blutorange
fuente
[^ ]
con[|\-]
;)C # - 338
388433bytesSe guardó un montón de bytes al cambiar a una matriz unidimensional.
Primero lee en la entrada, y lo hace agradable y rectangular, con un borde "" para que no tengamos que hacer ningún control de límites en la horizontal (más barato hacer la verificación en la vertical que poner en la línea extra) . Luego mira hacia atrás a través del rectángulo, por lo que siempre toca una esquina inferior derecha. Cuando golpea uno de estos, se dirige hacia arriba, siguiendo los + s que encuentra y eliminándolos a medida que avanza (con un espacio). Deja de seguir cuando se encuentra con un espacio. Probado en los cinco ejemplos dados.
fuente
Slip ,
5141 + 2 = 43 bytes(Ahora actualizado para trabajar con el caso de prueba de @ blutorange a un costo mayor)
Dado que @BMac usó SnakeEx para este desafío, pensé en intentar usar mi envío de lenguaje de coincidencia de patrones 2D , Slip. Pero debido a que Slip no tenía las características necesarias para resolver este problema, las he agregado en los últimos días. En otras palabras, esta presentación no es elegible para ganar .
Corre con la
n
bandera por el número de partidos, por ejemploPruébalo en línea .
Explicación
Debido a la gran cantidad de nuevas características en esta presentación, esta es una buena oportunidad para mostrarlas.
Slip intenta hacer coincidir partidas desde cada posición, y solo devuelve partidas únicas. Tenga en cuenta que usamos
[^ +]
: mientras que usar[-|]
teóricamente ahorraría dos bytes, sin escapes-
al principio / final de las clases de caracteres aún no se implementa en Slip.fuente
three
también tiene+
s que no son uno-
, uno|
y 2 espacios, así que supongo que no es un errorRubí 295
Pruébelo en línea: http://ideone.com/kIKELi ( agregué una
#to_a
llamada en la primera línea, porque ideone.com usa Ruby 1.9.3, que no es compatible#size
conEnumerable
s. En Ruby 2.1.5+ el código funciona bien . )El enfoque es el siguiente:
+
signos en la entrada y considere cada uno de ellos una forma distinta+
signos y combinan sus formas en unaAquí hay una versión más legible:
fuente
JavaScript (ES6) 190
197 202 215 235 289 570Editar matriz de dimensión única en lugar de 2 dimensiones, tamaño máximo de fila 999 caracteres (pero puede ser más sin costo, por ejemplo, 1e5 en lugar de 999)
Editar fragmento de código animado agregado, ver más abajo
Ungolfed primer intento
Fragmento animado
Mostrar fragmento de código
Prueba en la consola Firefox / FireBug
fuente
Rubí, 178
187199212Mejor versión ruby, crea una función F. Ahora con advertencias más deliciosas del intérprete constantemente.
Pruébelo en línea: ideone
Básicamente, la función
b
comienza en cualquiera+
, pasa recursivamente por el ciclo, configurando todo+
enu
. Así, un ciclo se elimina cada vez queb
se llama. La funciónF
solo intenta con qué frecuencia necesitamos llamarb
hasta que no quede ningún bucle.fuente
Python 2 - 390
Toma una cadena con líneas nuevas de stdin. Es un método bastante simple de golf, pero estoy seguro de que no tanto como podría estar considerando cuánto tiempo es.
fuente
Python 2 - 346 bytes
Implementado como una función
c
que toma los datos del archivo como entrada y devuelve el número de bucles.Primero, la función descompone los datos en un mapeo de ubicaciones de elementos de bucle al tipo de elemento en esa ubicación (por ejemplo
{(0,0): '+'}
). Luego, utiliza dos funciones internas recursivas mutuamente. El primero elimina un segmento de bucle del mapeo y decide qué ubicaciones verificar para el segmento posterior. El segundo verifica qué tipo de elemento de bucle está en las ubicaciones seleccionadas y, si es compatible con lo que se espera, llama al primero para eliminar la sección recién encontrada.fuente