Su objetivo es mostrar el arte ASCII de una formación en bolos donde solo quedan algunos de los bolos. Pocos bytes ganan.
Los pines de decenas están en una formación triangular:
O O O O
O O O
O O
O
Los pines están etiquetados del 1 al 10 como:
7 8 9 10
4 5 6
2 3
1
Chinchetas como O
y alfileres faltantes como .
, la formación 1 3 5 6 9 10
es:
. . O O
. O O
. O
O
Entrada:
Una cadena separada por espacios que enumera un subconjunto no vacío de los números del 1 al 10 en orden.
Salida:
Imprima la formación correspondiente o envíela como una cadena con saltos de línea.
La formación debe estar al ras con la izquierda de la pantalla. Cualquier espacio en blanco está bien siempre que la imagen visible sea correcta. Las líneas vacías antes y después también están bien.
Casos de prueba:
>> 1 2 3 4 5 6 7 8 9 10
O O O O
O O O
O O
O
>> 7 10
O . . O
. . .
. .
.
>> 3 5 7 9 10
O . O O
. O .
. O
.
>> 1
. . . .
. . .
. .
O
Respuestas:
brainfuck -
617616604 bytesEsto me llevó la mayor parte de dos días. Creo que valió la pena. Probablemente hay partes que se pueden jugar más al cambiar en qué celda se almacena algo o lo que sea, pero en este momento estoy feliz de que funcione.
Este programa tendría que ser completamente diferente si la pregunta no especificara que la entrada se ordenaría. La forma en que esto funciona es mediante la construcción de una lista de 10 pines alrededor de los que se ingresan. Eso es un poco confuso, pero tal vez esto lo explique mejor:
Mientras hace eso, recuerda cuáles de los pines puso el usuario allí y cuáles puso allí. Esta estrategia sería muy difícil de usar si la entrada no estuviera ordenada.
Otra cosa que facilita la clasificación es la detección del número 10. Dado que Brainfuck trata con bytes individuales, no con "números" per se, podría haber sido una molestia, pero la entrada clasificada me facilitó mucho el trato. con. La razón de eso tiene que ver con cómo almacené los datos en el programa. Tomo la entrada un carácter a la vez y resta 32 del resultado. Si la celda no es cero después de eso, avanzo 4 celdas. antes de repetir Esto significa que obtengo un byte de entrada no espacial cada 4 celdas, y almaceno efectivamente los pines como su número + 16. Sin embargo, 10 toma dos bytes para escribir, así que tuve que ponerlo en mayúsculas y minúsculas. Si la entrada no fue ordenada, tendría que mirar a través de los pines, pero dado que está ordenada, siempre será el último pin si aparece. Verifico si el (último byte de entrada + 1) == (el segundo último byte de entrada) y si es así, debe ser 10. Me deshago del último byte y configuro el segundo último a lo que mi sistema entiende como "10". Los caracteres
'1'
y'0'
no caben en un solo byte, ¡pero el número 26 sí!Crear trucos para hacer que algo funcione es mi parte favorita de usar este lenguaje. :)
Si está interesado en cómo funciona este programa con más detalle, puede ver el programa con los comentarios que usé mientras lo escribía para asegurarse de recordar lo que hizo todo. Incluso escribir comentarios en brainfuck es difícil, ya que no hay sintaxis de comentarios. En cambio, todos los personajes, excepto los de adentro,
<[+.,-]>
son no operativos. ¡Es fácil introducir errores al incluirlos accidentalmente.
o,
en sus comentarios! Es por eso que la gramática es tan inestable y los puntos y comas están en todas partes.EDITAR: Como ejemplo de lo fácil que es arruinarlo: ¡utilicé "no espacio" en uno de los comentarios! Cuando eliminé todos los caracteres que no son bf de la fuente, el programa que solía hacer se mantuvo en el
-
. Por suerte no rompió nada, pero ahora lo he eliminado para guardar un byte. :)EDITAR II: Ha pasado un tiempo desde que toqué este, jaja. En otra respuesta mental en este sitio, noté que accidentalmente usé una coma en la versión comentada. Como la entrada ya se había agotado, estableció la celda actual en 0 (esto depende de la implementación, pero en mi experiencia es el comportamiento más común). Arreglé el error, pero me hizo pensar. La forma idiomática de establecer una celda en 0 es
[-]
(aproximadamentewhile (*p) { *p--; }
), que es dos bytes más larga. Cada vez que se ha leído toda la entrada, puedo usarla,
. ¡Esto me ahorró 2 bytes en esa respuesta y 12 en esta!fuente
Python 2, 108 bytes
Llamada con
f("3 5 7 9 10")
.i
es el número de fila, siendo 4 la primera fila y 1 la última.z
es el enésimo pin de esa fila, con 0 significa que es el primer pin de la fila yi-1
significa que es el último pin de la fila.El truco principal es
i*~-i/2-~z
, que convierte(i, z) -> pin number
. Por ejemplo,(4, 0) -> 7
como el pin 7 es el primer pin en la fila 4 (la primera fila). La derivación es así:Queremos una función que lleve
i
al primer pin de la filai
, es decir4 -> 7, 3 -> 4, 2 -> 2, 1 -> 1
. Esto lo satisface(i**2-i)/2 + 1
y, por lo tanto,(i**2-i)/2 + 1 + z
proporciona el número de pin correcto para la entrada(i, z)
Luego simplifica:
Pyth , 33 bytes
Pruébalo en línea.
El programa se traduce aproximadamente a:
(Gracias a Isaac por los consejos)
fuente
V4
es equivalente aFNU4
, yrz7
es equivalente amvkcz\
.Pyth , 31
Pruébalo aquí .
V4
configura un bucle for, con N como la variable sobre [0,1,2,3].*dN
proporciona los espacios iniciales, porqued
es espacio.Para encontrar las ubicaciones de los pines, utiliza
+7+dZ
- 7 + d + Z.d
es:mientras que
Z
es 0 en la primera línea, -4 en la segunda, -7 en la tercera y -9 en la cuarta. Esto se debe a queZ
comienza como 0 y~Z-N4
disminuyeZ
en 4, luego en 3 y luego en 2.Luego, verifica si la ubicación del pin está en la entrada, usando
}+7+dZrz7
.rz7
son los pines deseados en forma de lista de int.Luego, crea un
O
si estaba presente, y de lo.
contrario. Este es un espacio separado, conjd
, e impreso implícitamente.fuente
Perl 5: 51 (50 + 1 para
-p
)Usando
r
flag para els///
cual es una de las adiciones recientes de perl 5.fuente
CJam,
4841 bytesWow, esto se hizo terriblemente largo
Pruébalo aquí.
Explicación
Primero generamos el diseño:
Esto produce
Y ahora reemplazamos los caracteres de dígitos de acuerdo con la entrada:
fuente
"789A456S23SS1":~S*7/N*[l~]'OerB,'.er
Es un poco más corto.er
estaba emitiendo automáticamente a la matriz en ese momento."789A456S23SS1":~S*7/N*[l~]"O"erB,"."er
funciona bien en 0.6.2.Pitón 2,
9794Esto utiliza la función de traducción, que le permite a uno hacer sustituciones de carácter por carácter en una cadena. Como tr en perl, excepto que es mucho más largo para escribir. Obtengo una lista de dígitos decimales haciendo una cadena del 9 al 99 de potencia.
fuente
Javascript, 155
Primer golf, probablemente puede ser más corto.
llamar con
EDITAR
Versión ES6, 130
EDITAR
Versión ES6, 79fallaVersión ES6,
7277, sin alerta, solo regresafuente
.match
). Este es el más elegante de todos.Ruby, 91
Simplemente sustituye los argumentos de la línea de comando con
.
sy0
s, y los imprime usando un ciclo de 4 ciclos.Versión legible
fuente
GNU sed, 75
La puntuación incluye 1 extra para la
-r
opción:Entrada a través de STDIN:
Pruébalo en línea .
fuente
l
s .0
a10
en la línea 2,1/
a la1 /
línea 5 y[0-9]
a las[0-9]+
líneas 7 y 9 , puede soltar la primera línea por 4 bytes.CJam,
4039 bytesSé que hay un camino más corto, no tengo tiempo para resolverlo en este momento.
Cómo funciona:
Pruébalo en línea aquí
fuente
APL (35)
Prueba:
Explicación:
17110357⊤⍨28/2
: la representación de 28 bits de17110357
:\⍨
: Para cada0
, dé un espacio, y para cada1
, tome un elemento de la cadena de la izquierda.⎕∊⍨⍳10
: Lea una línea desde el teclado y evalúela (⎕
), luego verifique para cada número del 1 al 10 (⍳10
) si está contenida o no en la entrada (∊⍨
).'.O'[1+
...]
: Agregue 1 a cada valor (dando 1s y 2s en lugar de 0s y 1s), y luego reemplace cada 1 por.
y cada 2 porO
.4 7⍴
: convierte la cadena generada en una matriz de 4 por 7⊖
: voltéalo horizontalmentefuente
Powershell: 109
La entrada está en $ i
Eso fue divertido. También aprendí un montón de cosas sobre cómo funciona la tubería.
fuente
Haskell:
163160 bytesEsto acepta una línea de números separados por espacios
stdin
.Sin golf:
Y una bonificación:
C: 250 bytes
Esta versión espera que sus argumentos de línea de comando sean la lista de números.
fuente
Perl, 73
Y un enfoque extra tonto que no funcionó, 90 caracteres:
fuente
Mathematica, 109 bytes
Función:
Llamado por:
Si se permiten funciones anónimas, esto se puede acortar a 105 bytes :
Si la entrada no tiene que ser una cadena delimitada por espacios, pero podría ser una matriz de números en el formulario
{3,5,7,9,10}
, esto se puede acortar aún más a 79 bytes :fuente
Pure bash (sin coreutils), 85
Reemplazo de patrón simple:
La lista se ingresa a través de los argumentos de la línea de comandos.
fuente
Rebol - 117
Sin golf:
fuente
Brainfuck, 179 bytes
Formateado:
Espera entrada sin una nueva línea final.
Pruébalo en línea.
La cinta se inicializa con diez nodos, cada uno de los cuales contiene uno seguido de un cero. El uno es el valor inicial del pin, y el cero facilita la navegación y actúa como marcador de posición para el carácter de espacio. Para cada número en la entrada, ese pin se incrementa en 3; tenga en cuenta que
ord('O') - ord('.') = 33
, y durante la fase de impresión, el valor del pin se multiplicará por 11. (Esta multiplicación también se utiliza para generar el carácter de espacio). El orden de los pines de izquierda a derecha en la cinta es simplemente1
hasta10
. Si la entrada termina con a10
, se realiza una corrección, ya10
que inicialmente se trata como un1
.Después de que la entrada ha sido procesada, se coloca una negativa después de cada fila. Luego, las filas se imprimen en un bucle, con el número de espacios iniciales determinado por el número de filas procesadas previamente.
fuente
Clojure, 216 caracteres (ugh)
Estoy seguro de que esto se puede jugar más.
Usar así:
fuente
AWK: 96 bytes
Nota:
fuente
C # - 192 bytes
Porque C #!
Comencé tratando de construir el resultado con matemáticas, pero el método simple replace-tokens-in-string parece mejor para lenguajes de nivel superior. La dependencia de Linq es larga pero aún más corta que mantener un contador y hacer comprobaciones de rango.
EDITAR: retornos de línea unix (-3 bytes)
fuente
Scala,
150148Acepta un conjunto de cadenas delimitadas por espacios
fuente
JavaScript ES6, 78 bytes
Use el siguiente fragmento para probar. Utiliza avisos y alertas y notación de funciones regulares para facilitar las pruebas.
fuente
VB / Basic-229
Mi objetivo era vencer a Java ^^
editar vbCr en lugar de chr (13)
r = r + espacio (3 - (e - b))
taquigrafía si
uso de la función en lugar de sub
sub PRINCIPAL () -> sub m ()
fuente
Java - 223 caracteres
Solía gustarme esta forma de hacerlo, luego me di cuenta de que necesitaba un pequeño truco, todavía algo así como mi solución.
fuente
K, 57 bytes
Todavía no es muy competitivo, pero es un comienzo:
Ejemplo de uso:
Comienzo evaluando la cadena de entrada con
.
: afortunadamente, los números separados por espacios son una lista literal válida en K. Al anteponer una lista vacía al resultado de eval, puedo asegurarme de que es una lista incluso en el caso de un solo pin. Luego creo un vector booleano que representa las posiciones de los pines:Luego indexo en una lista de cadenas para obtener caracteres con espacio para cada posición de pin.
Corté esa secuencia en filas (
_
), las invertí (|
) y uní cada fragmento (,/'
):Ahora está empezando a parecerse al patrón que queremos. Todo lo que queda es agregar algunos espacios iniciales a cada fila (
((!4)#\:" "),'
) e imprimir las filas en stdout (0:
).fuente
Pascal (FPC) , 165 bytes
Pruébalo en línea!
Toma números de la entrada estándar, imprime la formación a la salida estándar.
Pascal (FPC) , 175 bytes
Pruébalo en línea!
Una función que hace lo mismo, toma una matriz de posiciones de pin y devuelve una cadena formateada.
fuente
Powershell, 84 bytes
Script de prueba:
Salida:
fuente
Java -
371316294 caracteresLa primera vez que hago esto, estoy bastante seguro de que es una mierda, pero soy un novato. También funciona cuando los números no están ordenados. La numeración es incorrecta, pero no tengo tiempo para averiguar cómo solucionarlo ...
la entrada está dada por,
java B 1 2 3 5 10
por ejemplo. La salida será entonces:fuente
Japt
-Rx
,29191817 bytesIntentalo
Explicación
fuente