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;een 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!yes el número de formas de elegirxelementosy, 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) = 10es 2 mod 4.3 rotaciones CCW
Como antes, solo el último valor evaluado de
3es 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 porqueaya^btiene la misma paridad, pero se obtienen rotaciones consecutivas (a menos queb=0, pero luegob^a=0). A los operadores booleanos les gusta<dar0y1180 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
pfunció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 pllama a la funciónpcon la variablepcomo 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ónpsin argumentos, que no hace nada y devuelvenil.p p: Imprime la variablep.p|x: Cuandopes la función, esta es idéntica anil|x, que devuelve verdadero / falso dependiendo del valor dex. Sipes 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
4312cuá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
0s (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*2es 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
printcomando 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_codese ejecuta,backward_codeforma 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=printel archivo, ya que actualmente tienes mucho espacio en blanco? (Python 3, por supuesto)p=printtambién es larga. Y lo más importante: ¡no puede reutilizarpdespué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 dePRINTvarios dialectos de BASIC. Aunque hay muchos errores de sintaxis en el código, laENDdeclaración en la primera línea evita que el intérprete los vea.fuente
ENDaunque :)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
0para9empujar 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,2o3para cada rotación.Para los
0,2y3las rotaciones, elpsimplemente hace estallar e imprime el número literal de haber sido empujado a la pila. Para la1rotación,zempuja la profundidad de la pila actual (1) a la pila, luego lapsaca e imprime.fuente
311\n0p2, ¿dónde\nestá 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í)tfinaliza la ejecución después de imprimir el byte actualaestablece el bit0x01de losbconjuntos de salida el bit0x02de la salidaeestablece el bit0x10de la salidafestablece el bit0x20de la salida+si algún vecino lo activa, active todos los demás vecinos (cable)Chip requiere ya sea el
-windicador (para permitir la ejecución sin entrada) o alguna entrada para poder ejecutarse.Impresiones
0,1,2, o3en ASCII. Si los puntos de código0x00que0x03se desea, eliminar eleyf, 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
Btiene 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.
Ttiene 0 yJtiene -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