Escriba un bloque rectangular de texto que, cuando se arregla en una alfombra Sierpinski , utilizando bloques de espacios del mismo tamaño para las porciones vacías, crea un programa que genera el número de iteración de la alfombra.
Por ejemplo, si su bloque de texto es
TXT
BLK
luego ejecuta el programa
TXTTXTTXT
BLKBLKBLK
TXT TXT
BLK BLK
TXTTXTTXT
BLKBLKBLK
debería salir 1
porque la forma del programa representa la primera iteración de la alfombra Sierpinski.
Del mismo modo, corriendo
TXTTXTTXTTXTTXTTXTTXTTXTTXT
BLKBLKBLKBLKBLKBLKBLKBLKBLK
TXT TXTTXT TXTTXT TXT
BLK BLKBLK BLKBLK BLK
TXTTXTTXTTXTTXTTXTTXTTXTTXT
BLKBLKBLKBLKBLKBLKBLKBLKBLK
TXTTXTTXT TXTTXTTXT
BLKBLKBLK BLKBLKBLK
TXT TXT TXT TXT
BLK BLK BLK BLK
TXTTXTTXT TXTTXTTXT
BLKBLKBLK BLKBLKBLK
TXTTXTTXTTXTTXTTXTTXTTXTTXT
BLKBLKBLKBLKBLKBLKBLKBLKBLK
TXT TXTTXT TXTTXT TXT
BLK BLKBLK BLKBLK BLK
TXTTXTTXTTXTTXTTXTTXTTXTTXT
BLKBLKBLKBLKBLKBLKBLKBLKBLK
debería dar salida 2 porque esta es la forma de la segunda iteración de la alfombra Sierpinski.
Ejecutando el bloque de texto como está
TXT
BLK
debería salir 0
porque puede considerarse la iteración cero.
Esto debería funcionar para todas las iteraciones posteriores. (Al menos en teoría, suponiendo que la computadora tenga la memoria y todo).
Detalles
- Los programas no pueden leer o acceder a información sobre su código fuente. Trate esto como un estricto desafío de quine.
- La salida va a stdout o una alternativa similar. Solo muestra el número y una nueva línea final opcional. No hay entrada
- El bloque de texto puede contener caracteres que no se consideran terminadores de línea . El bloque de texto puede contener espacios.
- El "espacio vacío" en la alfombra debe consistir completamente en caracteres espaciales .
- Opcionalmente, puede suponer que todos los programas tienen una nueva línea final.
Puede usar este fragmento de pila para generar una alfombra para un bloque de texto dado en cualquier iteración:
<style>#o,#i{font-family:monospace;}</style><script>function c(e){e=e.split("\n");for(var n=new Array(3*e.length),t=0;t<n.length;t++){var l=t%e.length;n[t]=e[l]+(t>=e.length&&t<2*e.length?e[l].replace(/./g," "):e[l])+e[l]}return n.join("\n")}function f(){for(i=document.getElementById("i").value,n=parseInt(document.getElementById("n").value);n>0;)i=c(i),n--;document.getElementById("o").value=i}</script><textarea id='i'placeholder='code block...'rows='8'cols='32'></textarea><br>Iterations <input id='n'type='text' value='1'><br><br><button type='button'onclick='f()'>Generate</button><br><br><textarea id='o'placeholder='output...'rows='8'cols='32'style='background-color:#eee'readonly></textarea>
Puntuación
El envío cuyo bloque de texto inicial es más pequeño por área (ancho por alto) es el ganador. El TXT\nBLK
ejemplo es 3 por 2 para una puntuación de 6. (Básicamente gana el código más corto, de ahí la etiqueta de código de golf).
Tiebreaker va al envío que utiliza la menor cantidad de caracteres distintos en su bloque de texto. Si todavía está empatado, la respuesta obtuvo las primeras victorias.
fuente
Perl, 30 (15 × 2)
En primer lugar, voy a afirmar que 10 iteraciones es un límite razonable, no 2 32 . Después de 10 iteraciones, un programa que consta de N bytes se habrá expandido a ( N × 3 20 ) bytes (más saltos de línea), que es más de 3 gigabytes incluso para N = 1. Una arquitectura de 32 bits sería completamente incapaz de manejar 11 iteraciones. (Y obviamente no hay suficientes partículas en el universo para 2 32 iteraciones).
Así que aquí está mi solución:
Esto funciona incrementando la variable
$n
en la primera línea y calculando su logaritmo en cada paso. La segunda línea imprime la parte entera de este logaritmo y se cierra.Un logaritmo simple para la base e (2.718 ..) está lo suficientemente cerca como para dar resultados correctos para las primeras 10 iteraciones.
fuente
Golfscript, 9 * 2 = 18
(Tenga en cuenta que la primera línea tiene espacios finales para que sea rectangular)
No pude encontrar una función de registro para Golfscript, así que
base
tuve que hacerlo.Golfscript comienza con una cadena vacía, por lo que
0+
solo aumenta la longitud de la cadena en 1 (por coerción). Para cuando termine la primera línea, la pila tendrá una cadena de longitud3^n
, de la cual tomaremos la base de registro 3 antes de hacer un super comentario.n
luego se imprime automáticamente.fuente
,
en la segunda línea. Primera línea:0or)
; segunda linea3base,(}
. El otro objetivo obvio es el(
de la segunda línea. Esto es más complicado, pero también se puede eliminar reemplazando la primera línea con1+~abs(
un rectángulo de 7 * 2.C, 12x8 = 96
Inspirado por @ciamej, lo he reducido. Utiliza ese truco de dividir por 3, más la comprensión de que la alfombra convierte efectivamente un bucle if en un while.
El código fue probado en gcc / Ubuntu para iteraciones de hasta 3.
Solución anterior: C, 11x12
No es un ganador del tamaño, pero bueno, es C.
Encuentra log2 de la cuenta de bloque mediante desplazamiento de bits, luego usa algunos números mágicos y truncamiento int para estimar log3. Las matemáticas deberían funcionar hasta 26 iteraciones (un número de 42 bits).
fuente
CJam, 9 bytes
La idea de usar
]
es de Optimizer, pero utiliza un método muy diferente para contar.Pruébalo en línea
Cómo funciona:
Otras dos soluciones de 9 bytes
fuente
Pitón 2, 15 * 3 = 45
Otra implementación de la idea contar-primera-fila-luego-registrar-tres-y-salir. Probablemente todavía se pueda jugar al golf un poco más.
fuente
a. C., 2 * 16 + 1 = 33
El +1 adicional en el puntaje se debe a que
-l
se requiere la opción bc:fuente
Golfscript, 7 * 2 = 14
Esto está inspirado en la respuesta de Sp3000 y, en particular, en el deseo de optimizar la larga segunda línea.
3base,
es tan corto como un logaritmo de base 3 se obtendrá en GS, y el súper comentario}
es claramente óptimo.Lo que se requiere para la primera línea es mapear la cadena vacía
''
del stdin inicial a 0, y luego mapear cada entero no negativo a su sucesor. De esta manera terminamos la primera línea con3^n - 1
en la pila, y3base,
no requiere ningún decremento.fuente
C, 13x8
fuente
Perl, 76
Sé que probablemente no tenga mucho sentido publicar esto ya que ya ha sido completamente superado, pero de todos modos esta es mi solución actual.
fuente
> <> (Pez), 12 * 3 = 36
Una solución más sencilla> <>:
Primero ejecutamos la fila superior de los bloques superiores.
'v'00p
se colocav
en la primera posición de todo el programa dirigiendo el puntero del programa hacia abajo cuando vuelve al inicio después de llegar al final de la línea. Antes de eso, cada bloque empuja 0 y la longitud de la pila + 1 sobre él. (pila será0 2 0 4 0 6 ...
)En la primera mitad del segundo y tercero contamos cuántas veces podemos dividir el elemento de la pila superior antes de obtener 2 (almacenamos esto en el segundo elemento superior).
Al final sacamos el segundo elemento superior de la pila.
fuente
Lua, 3 * 17 = 51
La misma estrategia que la mayoría de las personas:
fuente
PHP, 22 × 2 = 44
27 × 2 = 54Solo otra versión de count-log3-out. No muy pequeño, pero mi primer golf;)
fuente