El título lo dice todo. Su objetivo es escribir un programa que forme un rectángulo de caracteres aw × h que se pueda rotar y volver a ejecutar para generar el número de rotaciones de 90 ° en sentido antihorario (CCW) que se han realizado.
Por ejemplo, si el programa 3 × 2
abc
def
resuelto el problema, inicialmente produciría 0 y rotaciones sucesivas de 90 ° CCW
cf fed da
be cba eb
ad fc
produciría 1, 2 y 3 respectivamente.
El uso de comentarios hace que esta sea una tarea trivial en la mayoría de los idiomas. En Ruby, por ejemplo, se puede hacer en un rectángulo de 7 × 7:
###p###
### ###
###1###
p 0#2 p
###3###
### ###
###p###
El desafío es hacer esto sin ningún tipo de comentario.
Puntuación
Su puntaje es w * h, el área de su rectángulo. Las líneas nuevas están excluidas. En otras palabras, code-golf, nuevas líneas no contadas.
La puntuación para el ejemplo de Ruby es 49 (aunque, por supuesto, no es válida ya que tiene comentarios).
Notas
- Su código debe ser realmente rectangular sin caracteres faltantes al final de las líneas.
- Si lo desea, puede generar otros valores legales "mod 90 °" en lugar de 0 1 2 3. Entonces 8 está bien en lugar de 0 y -1 está bien en lugar de 3, etc.
- La salida puede ir a la consola o a un archivo.
- Se aplican lagunas estándar.
Espero que esta, mi primera pregunta, realmente intriga a algunas personas. ¡Disfrutar!
fuente
echo 0;exit;e
en bash está permitido?Respuestas:
APL (1x3 = 3)
Esta solución utiliza la regla adicional de que cualquier salida que sea correcta mod 4 funciona.
En APL,
x!y
es el número de formas de elegirx
elementosy
, comúnmente conocido comobinom(y,x)
ochoose(y,x)
. Verifiquemos que cada rotación dé la respuesta correcta.0 rotaciones
No hay forma de elegir 5 elementos de 3, por lo que obtenemos 0, que se imprime automáticamente.
1 rotación CCW
APL evalúa felizmente cada línea, obteniendo el número
3
, el operador!
y luego el número5
, imprimiendo solo el último de estos (5
), que es 1 mod 4.2 rotaciones CCW
Esto es
binom(5,3)
, que(5*4*3*2*1)/(3*2*1)/(2*1) = 10
es 2 mod 4.3 rotaciones CCW
Como antes, solo el último valor evaluado de
3
es la impresora.En realidad no conozco APL, así que dígame si me equivoqué en alguna de las explicaciones. Lo encontré por prueba y error como el primer idioma en este sitio que:
Para (5), revisé la lista de funciones diádicas APL . Mi primera operación candidata fue la división entera
/
de C y Python 2, pero la división APL÷
da flotantes. La exponenciación es tentadora, pero falla porquea
ya^b
tiene la misma paridad, pero se obtienen rotaciones consecutivas (a menos queb=0
, pero luegob^a=0
). A los operadores booleanos les gusta<
dar0
y1
180 grados de separación, lo que no funciona. Finalmente, encontré el operador binomial!
y probé números hasta que obtuve algo de ese trabajo.Gracias a Quincunx por su confianza en que existe una solución más pequeña que 2x2.
fuente
Rubí, 7 × 9 (63)
Un poco más largo que la otra solución, pero al menos esta solución no depende de ninguna impresión implícita o abuso de reglas. Para las cuatro rotaciones, se analiza el código completo y, aparte de algunos cortocircuitos, se ejecuta todo. Sorprendentemente, no hay absolutamente ninguna simetría en el código.
Esta solución se basa en el hecho de que todavía es posible llamar a la
p
función (que se utiliza para imprimir los números) incluso si ya se ha definido una variable con el mismo nombre. Por ejemplo, algo así comop p
llama a la funciónp
con la variablep
como argumento (por lo tanto, imprime el valor dep
).Explicación de algunas de las expresiones comunes utilizadas en el código:
p
: Como se mencionó anteriormente, esta es una llamada a una función o una variable. Cuando la variable no está definida, esto llama a la funciónp
sin argumentos, que no hace nada y devuelvenil
.p p
: Imprime la variablep
.p|x
: Cuandop
es la función, esta es idéntica anil|x
, que devuelve verdadero / falso dependiendo del valor dex
. Sip
es un entero, es bit a bit o. De cualquier manera, esta declaración no tiene efectos secundarios.p=p||x
: Efectivamente lo mismo quep||=x
(asignación condicional) con la ventaja de ser sintácticamente válido y no operativo cuando se invierte.Versión simétrica (9 × 10 = 90)
Esta es la solución simétrica más corta (C 2 al ignorar los números para imprimir) que se me ocurrió.
Script de prueba
Aquí hay un script de prueba para verificar el código anterior (
#
se han agregado los extremos de la línea para que el espacio en blanco no se elimine y se elimine antes de la ejecución):fuente
GolfScript, 4 (2x2)
Imprime
4312
cuál es0
(mod 4). Las rotaciones se imprimen3241
(1 mod 4),2134
(2 mod 4) y1423
(3 mod 4).Provocado por:
En realidad, hay muchos conjuntos de números para los que esto funciona. Encontré esto con este programa de Python:
Aunque el programa genera
0
s (que probablemente no funcionaría), las soluciones válidas son de la formaDonde
a∈{4,8}
,b∈{3,7}
,c∈{1,5,9}
,d∈{2,6}
. IE(a,b,c,d)∈{4,8}×{3,7}×{1,5,9}×{2,6}
que es de 24 soluciones.fuente
Your score is w*h, the area of your rectangle. Newlines are excluded. In other words, code-golf, newlines not counted.
n
. Esto se debe a que la paridad del número entero es igual a la paridad de su dígito más a la derecha, pero las rotaciones separadas por 90 grados deben producir paridades diferentes. Entonces,2*2
es el mínimo para este enfoque.Pitón - 23 x 23 = 529
Ok, esta pregunta ya tiene un ganador, pero todavía no hay una solución de Python. Así que lo pensé, ¡en serio! - y encontré una manera de hacer que el
print
comando voluminoso funcione en cualquier dirección sin producir errores cuando se analiza desde una de las otras direcciones.El avance fue la siguiente línea:
Mientras
forward_code
se ejecuta,backward_code
forma parte de una cadena y, por lo tanto, no se imprime. Esto es exactamente al revés cuando se lee al revés.Entonces, combinado con dos direcciones más y ajustado para que todas las citas coincidan correctamente, termino con la siguiente solución:
Editar: encontré una manera de lidiar con todo ese espacio en blanco. ;)
fuente
p=print
el archivo, ya que actualmente tienes mucho espacio en blanco? (Python 3, por supuesto)p=print
también es larga. Y lo más importante: ¡no puede reutilizarp
después de rotar el código!BÁSICO, 64
No ganará, pero aquí está de todos modos. (Probado en Chipmunk Basic )
Nota:
?
es la abreviatura dePRINT
varios dialectos de BASIC. Aunque hay muchos errores de sintaxis en el código, laEND
declaración en la primera línea evita que el intérprete los vea.fuente
END
aunque :)Pyth , 9 caracteres (3x3)
En pyth, todo se imprime por defecto, a menos que esté precedido por un espacio. Las líneas después de la primera línea son para la entrada del usuario y no se evalúan en este programa.
Otra forma de obtener 9 caracteres:
Pyth 1.0.5 , 4 caracteres
Si bien los cambios recientes en pyth han dificultado la generación de números de 2 dígitos (un cambio que estoy considerando revertir), las versiones anteriores de Pyth tienen una generación de números de dos dígitos fácil, que, combinada con la impresión implícita y el hecho de que todas las líneas menos la primera son ignorados, da la siguiente solución:
Impresiones 32,21,14,43.
fuente
Befunge, 16
Explicación: dígitos desde
0
para9
empujar el número correspondiente a la pila,.
saca un valor de la pila y lo imprime como un entero, y@
finaliza el programa.(probado aquí )
fuente
Piet, 49
Solo decidí usar los colores amarillo y rojo, y tratar de hacerlo más o menos simétrico. Cuando se gira, imprime 0, 1, 2 o 3. Desafortunadamente, salir del programa en Piet es difícil y ocupa aproximadamente la mitad del espacio en la imagen.
fuente
GNU dc , 6 (3x2)
Creo que esta es la respuesta más corta para no requerir la relajación de la regla "mod 90 °":
Salidas
0
,1
,2
o3
para cada rotación.Para los
0
,2
y3
las rotaciones, elp
simplemente hace estallar e imprime el número literal de haber sido empujado a la pila. Para la1
rotación,z
empuja la profundidad de la pila actual (1) a la pila, luego lap
saca e imprime.fuente
311\n0p2
, ¿dónde\n
está un personaje de nueva línea? De lo contrario, no tendría sentido en el contexto de DC.GolfScript, 9 (3x3)
Una especie de abuso de las reglas. El
}
sucede para finalizar el programa si no hay coincidencia{
, y el contenido de la pila se imprimen al final del programa.fuente
Your score is w*h, the area of your rectangle. Newlines are excluded. In other words, code-golf, newlines not counted.
}
puede ser desequilibrado. Buen truco.JavaScript, 4
Cuando ejecuta este programa (o una rotación de este programa) en una consola javaScript, solo la última línea se evalúa y se repite en la consola.
Entonces:
Aquí están todos los programas 2x2 similares que también funcionan:
En otros términos,
donde a está en [0,4,8], b está en [3,7], c está en [1,5,9] yd está en [2,6]
fuente
CJam / GolfScript - 3 * 3
El punto y coma muestra el número anterior, por lo que solo se imprime la esquina inferior derecha.
fuente
Aheui , 8
Como Aheui no tiene una letra que empuje 1 a la pila, decidí imprimir 0, 5, 2 y 3.
Explicación: 바 y 반 empujan 0 y 2, respectivamente, a la pila y mueven el cursor hacia la derecha en un carácter. 뷸 y 뷷 empujan 5 y 3, respectivamente, a la pila y mueven el cursor hacia abajo dos caracteres. 몽 aparece e imprime el número en la pila y mueve el cursor un carácter hacia arriba. 희 termina el programa.
fuente
JavaScript
(Ingresado en la consola del navegador, shell u otro REPL, por lo que se imprime el resultado)
Debería funcionar para cualquier otro idioma con expresiones, líneas nuevas no significativas e impresión automática del resultado.
fuente
'2,3\n,0,\n1,0'
.Matlab / Octave -
144100Golfizado: 10 x 10 = 100
Solución alternativa: 15 x 15 = 225
fuente
...d....
...i....
...s2...
disp 1..
..3 psid
...4s...
....i...
....d...
..3 psid
. Necesita al menos tres puntos al comienzo de cada línea para indicar un salto de línea e ignorar los caracteres restantes.Perl 5x7 (35)
Un poco tarde para la fiesta. El solitario
-
determina qué número se imprime.fuente
JavaScript, 3
Funciona ... en la base 7.
Versión de base 9:
Explicación
Cuando se ejecuta de forma interactiva, por ejemplo, desde una consola de depuración, se generará el valor de la última declaración / expresión.
4 7 = 4 10 ≣ 0 (mod 4 )
412 7 = 205 10 ≣ 1 (mod 4 )
2 7 = 2 10 ≣ 2 (mod 4 )
214 7 = 109 10 ≣ 3 (mod 4 )
Se pueden encontrar soluciones similares para cualquier base impar.
fuente
Befunge, 12 (6x2)
Me las arreglé para llegar a una ligera mejora en la respuesta Befunge existente aprovechando al máximo la naturaleza bidimensional de Befunge y haciendo que la ruta del código se ejecute verticalmente en dos de las orientaciones.
Pruébelo en línea: Inicio 0 , Rotación 1 , Rotación 2 , Rotación 3 .
fuente
Maravilloso, 7 * 14 = 98
fuente
Argh! / Aargh! (4 * 4 = 16)
¿Qué fue eso de usar la herramienta adecuada para el trabajo? No hay comentarios (en el idioma en general).
Toda la familia de programas (generados en J:
((|.@:|:) ^: (i. 4)) >'hpqh';'q01p';'p32q';'hqph'
o((|.@:|:) ^: (i. 4)) 4 4 $ 'hpqhq01pp32qhqph'
)girado una vez:
rotado dos veces:
rotado tres veces:
Para explicar esto, podría ser mejor mirar una versión "con sangría" (que también funciona en todas las rotaciones):
Esta versión muestra que el programa consta de 4 partes separadas, una para cada rotación individual.
h
- establecer el flujo de control a la izquierdap
- Imprimir elemento en el ráster de datos / código debajo de élq
- salga del programafuente
Flotador - 9 × 5 = 45
Imprime 4, 1, 2 o 3 en la consola.
Tenga en cuenta que 'Black' es una instrucción válida (NOP) y es sintáctica. Sin ella, no puede encontrar la posición inicial. Por lo tanto, todas las posiciones en el rectángulo están ocupadas.
fuente
Elemento, 2x3 = 6
Esta es una mejora sobre la solución ingenua 3x3, que tiene un
`
en el medio con un número en cada lado. El caso 0, que se muestra arriba, es el más interesante, ya que el*
se usa para multiplicar el 3 por nada para obtener 0. Aparte de eso, no es tan complicado.Si encuentra el espacio incómodo, puede reemplazarlo con casi cualquier otro personaje, excluyendo
[]{}`_
.Como referencia, aquí están las otras tres rotaciones:
fuente
Chip, (2x5) 10
*
activa todos los elementos vecinos: norte, este, sur y oeste (fuente)~
si no se activa desde el oeste, activa el vecino este (puerta NO) (nunca activado aquí)t
finaliza la ejecución después de imprimir el byte actuala
establece el bit0x01
de losb
conjuntos de salida el bit0x02
de la salidae
establece el bit0x10
de la salidaf
establece el bit0x20
de la salida+
si algún vecino lo activa, active todos los demás vecinos (cable)Chip requiere ya sea el
-w
indicador (para permitir la ejecución sin entrada) o alguna entrada para poder ejecutarse.Impresiones
0
,1
,2
, o3
en ASCII. Si los puntos de código0x00
que0x03
se desea, eliminar ele
yf
, a continuación, mover el espacio para llenar la brecha.fuente
Japt , 3 * 1 = 3 bytes
Pruébelo en línea: tal como está , rotado una vez , dos veces , tres veces .
Salidas 0, 5, 2, 11 respectivamente.
La variable
B
tiene el valor 11, yNumber.z(other)
es la división del piso (aparentemente todos buscaron: p). Para el código de varias líneas, la última línea se pasa a la salida, que aquí es simplemente una constante.2 * 2 = 4 bytes
Pruébelo en línea: tal como está , rotado una vez , dos veces , tres veces .
Salidas 0, 21, 2, -1 respectivamente.
T
tiene 0 yJ
tiene -1.El truco es que, si dos literales o variables se ponen uno al lado del otro, se inserta una coma y la salida es solo la última.
La solución 2 * 2 JS también funciona en Japt.
fuente