Un programa de tablero de ajedrez es un programa en el que el valor ordinal de cada carácter individual alterna de par a impar, excluyendo el terminador de línea (que puede ser cualquier final de línea estándar).
Un programa triangular es un programa en el que cada línea tiene un carácter adicional que la línea anterior, y la primera línea tiene un carácter. No necesita manejar entradas vacías.
Su tarea es construir un programa que valide que la entrada dada se adhiera a esos criterios y que produzca / devuelva algo verdadero si el programa cumple con los criterios, o algo falso de lo contrario.
Su programa también debe cumplir con estos criterios.
Ejemplos de programas válidos.
G
`e
@u^
5r{B
^
cB
+$C
VA01
Reglas
- Su programa puede comenzar con un byte impar o par, siempre que la paridad de los caracteres se alterne.
- Su programa debe validar los programas que comienzan con un carácter impar o par.
- Para los caracteres unicode, los valores de byte subyacentes deben tener paridad alterna.
- Puede suponer que la entrada solo contiene caracteres imprimibles. Si su programa contiene elementos no imprimibles, aún debería poder validarse.
- Su programa puede incluir una nueva línea final, no es necesario que su validación lo permita, ya que puede suponer que se elimina antes de la validación.
- Las lagunas estándar están prohibidas.
- El código más corto en bytes, en cada idioma, gana.
code-golf
restricted-source
source-layout
Dom Hastings
fuente
fuente
E\nOE\nOEO
. ¡Espero que ayude!Respuestas:
Stax , 26 bytes
Ejecute casos de prueba en línea
Tuve que presentar 3 personajes basura.
i
es un no-op cuando está fuera de todas las construcciones de bucle.siempre es un no-op.
O
coloca un 1 debajo de la parte superior de la pila, pero el valor no se usa en el programa.Ejecute este
fuente
C (gcc), 189 bytes
Pruébalo en línea!
␉
representa un carácter de tabulación (lo siento). Tenga en cuenta que hay varios espacios / pestañas finales (lo siento más). El original con las pestañas intactas se ve mejor en vim con:set tabstop=1
(las palabras no pueden expresar cuánto lo siento).Es una función (llamada
f
, que no es inmediatamente obvia al mirarla) que toma una cadena como argumento y devuelve0
o1
.Me podría reducir esto al menos uno y probablemente dos o más líneas, pero nota que se pone cada vez más complicado y requiere poco esfuerzo hacia el final, sobre todo porque escribir dicho código horrible (incluso para los estándares PPCG) me hacía sentir como una mala persona y quería parar lo antes posible
La idea básica aquí es evitar construcciones que necesariamente romper el formato (
++
,+=
,return
, etc.). Milagrosamente, las palabras clave importantes comofor
,char
ywhile
(que no terminé usando) se ajustan a la regla de paridad alterna. Luego usé espacios (paridad par) y tabulaciones (paridad impar) como relleno para que el resto se ajustara a las reglas.fuente
Haskell ,
10801033 bytesPruébalo en línea!
Explicación
Esta ha sido una tarea bastante interesante para Haskell.
Paridad
Para comenzar, necesitamos alguna forma de determinar si un personaje tiene un punto de código par o impar. La forma normal en que se puede hacer esto es obtener el punto de código y modificarlo en 2. Sin embargo, como se puede saber, obtener el punto de código de un personaje requiere una importación, lo que debido a la restricción de origen significa que no puede ser usado. Un Haskeller más experimentado pensaría usar la recursividad.
Char
's son parte de laEnum
clase de tipos para que podamos obtener sus predecesores y sucesores. Sin embargopred
, ysucc
también son tanto inutilizable porque no hacen byte de paridad alternativo.Esto nos deja bastante atascados, prácticamente no podemos hacer ninguna manipulación con los caracteres. La solución a esto es codificar todo. Podemos representar (la mayoría) caracteres pares como literales, probabilidades con las que tenemos problemas porque
'
es extraño, por lo que no puede estar al lado del personaje en sí, haciendo que el literal sea imposible de expresar la mayoría de los caracteres impares. Así que codificamos todos los bytes pares y luego agregamos un catch all para los bytes impares al final.El problema Bytes
Puede notar que hay algunos bytes pares para los que no se pueden hacer literales envolviéndolos entre comillas simples. Son los no imprimibles, las nuevas líneas y
\
. No debemos preocuparnos por los no imprimibles, ya que siempre que no usemos ninguno de ellos no necesitamos verificarlo. De hecho, todavía podemos usar extrables no imprimibles, como tab, simplemente no termino necesitando. Newline puede ignorarse sabiamente porque de todos modos será recortado del programa. (Podríamos incluir nueva línea, porque su punto de código es bastante conveniente, pero no es necesario). Esto deja\
, ahora\
tiene el punto de código 92, que convenientemente es un número impar seguido de un número par, por lo que\92
alterna entre pares e impares , por lo tanto, el literal'\92'
Es perfectamente válido. Más adelante, cuando necesitemos representar una nueva línea, notaremos que, afortunadamente, tiene esta misma propiedad'\10'
.Problemas de espacio
Ahora, para comenzar a escribir el código real, necesitamos poder colocar una cantidad considerable de caracteres en una sola línea. Para hacer esto escribí el gorro:
La gorra no hace nada excepto ser válida Haskell. Inicialmente esperaba hacer definiciones que nos ayudaran en el código más tarde, pero no fue así. También hay formas más fáciles de hacer el límite, por ejemplo, espacios en blanco y punto y coma, pero no guardan bytes de esta manera, así que no me he molestado en cambiarlo.
Codificador duro
Entonces, ahora que tengo suficiente espacio en una línea, comienzo a codificar valores. Esto es bastante aburrido, pero hay algunas cosas de interés. Por una vez, las líneas comienzan a alargarse aún más, podemos usar
;
para poner varias declaraciones en una línea, lo que nos ahorra una tonelada de bytes.La segunda es que, dado que no siempre podemos comenzar una línea con una
g
frecuencia cada tanto, debemos sangrar un poco las líneas. Ahora Haskell realmente se preocupa por la sangría, por lo que se quejará de esto. Sin embargo, si la última línea antes de la línea con sangría termina en punto y coma, lo permitirá. ¿Por qué? No tengo nada, pero funciona. Así que solo tenemos que recordar poner los puntos y comas al final de las líneas.Bloques de construcción de funciones
Una vez que el hardcoder está listo, es fácil navegar hasta el final del programa. Necesitamos construir algunas funciones simples. Primero construyo una versión de
drop
, llamadai
.i
es diferente dedrop
eso si intentamos pasar más allá del final de la cadena, simplemente regresa"y"
.i
es diferente de soltar también en que si intenta soltar una nueva línea, volverá"y"
. Esto será útil porque más tarde, cuando verifiquemos que el programa es un triángulo, nos permitirá volverFalse
cuando la última línea no esté completa, o cuando una línea termina temprano.k
k
True
k
False
A continuación hacemos un alias para
k
,m
.m
es solok
con1
en el primer argumento, y una nueva línea antepuesta al segundo argumento.A continuación tenemos
o
.o
toma un número y una cadena. Determina si los bytes de cadena (ignorando las nuevas líneas) se alternan en paridad (usando nuestrog
) comenzando con el número de entrada.Por último, tenemos
s
cuál funcionao
con ambos1
y0
, si alguno tiene éxito, difierem
. Si falla ambos, simplemente regresaFalse
. Esta es la función que queremos. Determina que la entrada es triangular y alterna.fuente
05AB1E ,
3426 bytesPruébalo en línea!
Toma la entrada como una cadena multilínea (entrada entre "" " ). Explicaciones que vendrán más adelante.
fuente
Java 10, 209 bytes
Un lambda vacío que toma un iterable o una matriz de
byte
. Indica verdadero al regresar normalmente, falso al lanzar una excepción de tiempo de ejecución. El programa espera que la línea final se termine correctamente, es decir, que termine con un carácter de nueva línea. La línea final del programa se termina de manera similar.Todo se hace bajo UTF-8, con la interpretación de que "carácter" se refiere a puntos de código Unicode.
Las pestañas se reemplazan con espacios en esta vista.
Pruébalo en línea
Hex dump
Revertir con
xxd -p -r
en Unix.Sin golf
f
es el número esperado de caracteres en la línea actual,h
es el número de caracteres vistos hasta ahora en la línea actual,c
es el último byte visto yb
es sia
es la nueva línea.La condición
a > -65
prueba sia
es el primer byte de un carácter. Esto funciona porque los caracteres de un solo byte (ASCII) no son negativos en el complemento de dos bits de 8 bits, el primer byte de caracteres más largos tiene forma binaria11xxxxxx
(al menos -64 en el complemento de dos), y los bytes no iniciales en esos caracteres son de la forma10xxxxxx
, como máximo -65 en complemento a dos. ( Fuente )Cuando un personaje viola el patrón triangular o de tablero de ajedrez (es decir, una nueva línea aparece temprano o tarde o aparece un byte de la paridad incorrecta), la rama izquierda del ternario correspondiente (en asignación
f
aoc
) se activa y el método arroja una excepción aritmética.fuente
Python 3 (3.4?), 350 bytes
Un desafío complicado para un lenguaje tan particular sobre los espacios en blanco como Python 3. El envío se imprime
0
o se1
estandariza y se bloquea para algunas entradas. El programa espera que la línea final se termine correctamente, es decir, que termine con un carácter de nueva línea. La línea final del programa se termina de manera similar. UTF-8 se utiliza para verificar la paridad de bytes.Las pestañas se reemplazan con espacios en esta vista.
Funciona para mí con Python 3.4.2; no funciona en ningún Python 3 en TIO. Me parece que es un error en los intérpretes de TIO.
Hex Dump
Revertir con
xxd -p -r
en Unix.fuente