Su tarea es escribir un programa no vacío / función de la cuenta de bytes L , la cual, cuando se repite M veces, comprueba si un positivo dado número entero N es igual a L x M .
Debería, en teoría, admitir un número arbitrario de repeticiones (un valor entero positivo arbitrario de M ), pero está bien si, debido a las limitaciones del lenguaje, no puede funcionar por encima de un cierto umbral. Está estrictamente prohibido leer el código fuente de su programa o acceder a información al respecto .
Para proporcionar resultados, debe elegir un valor consistente para uno de los estados (verdadero o falso) y usar cualquier otro resultado posible (no necesariamente consistente) para el otro estado ( Discusión ).
Sus respuestas se puntuarán según la longitud L de su programa inicial (en bytes), con menos bytes mejor.
Ejemplo
Digamos que su programa (inicial) es ABCDE
. Luego:
ABCDE
(1 repetición) debe verificar si la entrada es igual a 5 .ABCDEABCDE
(2 repeticiones) debe verificar si la entrada es igual a 10 .ABCDEABCDEABCDE
(3 repeticiones) debe verificar si la entrada es igual a 15 . Etc ...
La puntuación de este código de muestra sería 5 , ya que la fuente inicial tiene 5 bytes de longitud.
fuente
L
concatenado después de sí mismoM
debería devolver si su entradaN
es igual aL*M
?Respuestas:
Gelatina , 1 byte
La salida es 0 para una coincidencia, no cero para una no coincidencia.
Pruébalo en línea!
Cómo funciona
Esto aprovecha el formato de salida excesivamente liberal. La repetición de
’
M veces simplemente disminuye la entrada M veces, por lo que el resultado será cero si y solo si la entrada es LM , donde L = 1 .fuente
Haskell, 8 bytes
Pruébalo en línea!
Como muchas otras respuestas, devuelve 0 para verdadero y no 0 para falso al restar repetidamente la longitud del código del número de entrada.
fuente
Retina ,
2120 bytesPruébalo en línea! Simplemente repita la parte en la ventana Código para ver cómo maneja los múltiplos.
Da
0
los enteros múltiples y positivos correctos para todo lo demás.Explicación
Veamos primero el programa único:
Esto convierte un número decimal a unario (utilizando
_
como dígito unario).Si la cadena está vacía (lo que no puede suceder en este momento, porque se garantiza que la entrada sea positiva), la reemplazamos con una sola
_
.Ahora nos deshacemos de los primeros 20 guiones bajos. Si la entrada fue
20
, esto da como resultado una cadena vacía.Y finalmente contamos el número de guiones bajos en el resultado, que es cero si la entrada fuera
20
.Ahora, ¿qué sucede cuando repetimos el código fuente? Como no insertamos un salto de línea al unirnos a los programas, la primera línea irá directamente al final de la última línea, obtenemos esto cuando duplicamos el programa:
Ahora, en lugar de contar los guiones bajos, terminamos con la siguiente etapa:
Esta etapa no hace nada, porque no hay más dígitos en la cadena de trabajo en este punto, por lo que la expresión regular no puede coincidir.
Ahora esta etapa se vuelve relevante. Si la entrada fue un múltiplo más pequeño de 20, la cadena se ha vaciado por la copia anterior del código fuente. En ese caso, lo convertimos en un solo guión bajo, que sabemos que nuestro programa nunca podrá volver a convertir en una cadena vacía. De esta manera nos aseguramos de que solo se acepte el M th múltiplo (y no todos los múltiplos hasta el M ª).
Eliminamos los primeros 20 guiones bajos una vez más. Entonces, M repeticiones del código fuente eliminarán 20M guiones bajos de la cadena, si es posible.
Y cuando llegamos al final del programa, todavía contamos los guiones bajos para que las entradas válidas den cero.
fuente
Fragmento de código de máquina x86 de 32 bits, 1 byte
Entrada en EAX, salida en EAX: 0 para verdadero, no cero para falso. (También deja el indicador ZF establecido en verdadero, sin establecer en falso, para que pueda
je was_equal
). Como "bono", no tiene que preocuparse por la envoltura; El x86 de 32 bits solo puede direccionar 4GiB de memoria, por lo que no puede hacer que M sea lo suficientemente grande como para envolverlo todo y encontrar1 == 2**32 + 1
o algo así.Para realizar una función invocable, agregue una
0xC3
ret
instrucción después de repetir0x48
M veces. (No se cuenta en el recuento total, porque muchos idiomas necesitan repetir solo el cuerpo de la función, o una expresión, para poder competir).Se puede comercializar desde GNU C con el prototipo
__attribute__((regparm(1))) int checkeqM(int eax);
deregparm
atributo de función x86 de GNU C , como-mregparm
, usa EAX para pasar el primer argumento entero.Por ejemplo, este programa completo toma 2 args, y JITs M copias de la instrucción + a
ret
en un búfer, y luego lo llama como una función. (Requiere montón ejecutable; compilar congcc -O3 -m32 -z execstack
)los ejecutables que no son PIE se cargan más abajo en la memoria virtual; puede hacer un malloc contiguo más grande.
Tenga en cuenta que GNU C no admite tamaños de objeto mayores que
ptrdiff_t
(con signo de 32 bits), peromalloc
ymemset
hacer aún el trabajo, por lo que este programa tiene éxito.Fragmento de código de máquina ARM Thumb, 2 bytes
El primer argumento de entrada
r0
y valor de retornor0
es la convención de llamada ARM estándar. Esto también establece banderas (els
sufijo). Hecho de la diversión; la no versión de establecer -flag desub
es una instrucción de 32 bits de ancho.La instrucción de devolución que debe agregar es
bx lr
.Fragmento de código de máquina AArch64, 4 bytes
Funciona para enteros de 64 bits. Entrada / salida en
x0
, según la convención de llamada estándar.int64_t foo(uint64_t);
AArch64 no tiene un modo Thumb (todavía), por lo que 1 instrucción es lo mejor que podemos hacer.
fuente
__builtin___clear_cache
solo es necesaria porque está ejecutando la memoria de la que recibiómalloc
. Si obtuviste la memoriammap
, la optimización no ocurre.V , 16 (o 1) bytes
Respuesta aburrida:
un byte
Respuesta menos aburrida:
Pruébalo en línea!
Hexdump:
De hecho, escribí esto unos 5 minutos después de que salió el desafío. Me tomó 30 minutos arreglar este horrible montón de código de espagueti que llamo un idioma .
fuente
Perl 5
-p
, 6 bytesPruébalo en línea!
usos
0
para igualfuente
-p
solución válida de Perl 6 .Brachylog , 2 bytes
Pruébalo en línea!
fuente
Python 3 , 27 bytes
Pruébalo en línea!
Código repetido dos veces:
Pruébalo en línea!
fuente
Brain-Flak , 24 bytes
Pruébalo en línea!
Devuelve
0
para igual y algo más para no igual.Cómo funciona:
Los
n
tiempos de ejecución de este código se restaránn * 24
de la entrada, dando 0 solo cuando la entrada =n*24
.fuente
Stax , 1 byte
Pruébalo en línea!
fuente
TI-Basic (serie 83), 4 bytes
Toma entrada
Ans
: por ejemplo, puede escribir17:prgmCODEGOLF
para ejecutar esto con una entrada de17
. Imprime (y devuelveAns
) el valor0
si la entrada es igual a L × M , y un valor distinto de cero de lo contrario.Tenga en cuenta que
:
es parte del código, por lo que si ingresa esto en el editor de programas, debería versi lo ingresas una vez y
si lo ingresas tres veces.
fuente
Haskell , 12 bytes
Pruébalo en línea!
Salidas
0
para la verdad y algún número entero distinto de cero para la falsedad.Solución alternativa, 12 bytes.
Pruébalo en línea!
fuente
Befunge-98 , 15 bytes
Pruébalo en línea!
¡Pruébalo doblado!
Utiliza 0 para igual y cualquier otra cosa para desigual.
Explicación:
Este código repetido muchas veces se verá así:
]
vuelta a la derecha. Envía la IP hacia abajo.>
moverse hacia el este Envía el derecho de propiedad intelectual.f
empujar un 16.v
moverse hacia el sur Envía la IP hacia abajo. Si es la última vez, vaya al paso 8.]
vuelta a la derecha. Envía la IP a la izquierda.+
añadir. Agrega el 16 a la parte superior de la pila.v
moverse hacia el sur Envía la IP hacia abajo. Ir al paso 2.<
moverse hacia el oeste Envía la IP a la izquierda.#
omitir. salta sobre]
y envuélvete hasta el final.+
añadir. Agrega el 16 a la parte superior de la pila.&
entrada. Empuje un número del usuario.-
sustraer. obtener la diferencia de suma en la que estábamos trabajando y la entrada..
impresión. Imprime el resultado.@
final.fuente
Pure Bash , 15
Entrada dada como un parámetro de línea de comando. Salida como un código de salida de shell -
1
para VERDADERO y0
para FALSO.fuente
Carbón , 13 bytes
Pruébalo en línea! Según mi respuesta a Doblo la fuente, ¡tú doblas la salida! Explicación:
Se las arregla para dar salida
1
a la verdad y0
a la falsedad. Repeticiones posteriores comparan contra la entrada13
,26
,39
,52
etc, pero cada vez la respuesta se sobreimprime tan sólo se ve la respuesta final.fuente
JavaScript ES6, 32 bytes
si verdadero es 0 y falso como otros, 31 bytes
fuente
MIPS, 4 bytes
Usos
$a0
como argumento y valor de retorno.MIPS, 8 bytes (utilizando la convención de llamadas MIPS)
x86, 5 bytes
Esta es mi primera respuesta x86, por lo que sus comentarios son bienvenidos. Utiliza la convención _fastcall con ecx como primer argumento.
Peter Cordes tiene una solución de 1 byte en los comentarios.
Comentario Brainfuck : La parte difícil es conseguir que devuelva un solo valor. De lo contrario, algo como esto sería fácil.
fuente
sub $4, %al
/mov %al, %dl
. O aún regrese en AL / EAX y luego obtenga la solución de Dennis, condec %eax
(1 byte en modo de 32 bits). Y sí, las convenciones de llamadas personalizadas están bien para asm. Es asm, no solo "asm que es fácil llamar desde C"; el código real escrito en asm usa convenciones de llamadas personalizadas donde ayuda, por lo que esto es totalmente justificable.r0
que también es el retval, por lo que Thumbsub r0, #2
es de 2 bytes.ret
al final del bloque de repetición antes de que pueda llamarlas. Normalmenteret
incluyo los recuentos en bytes para mis respuestas asm x86. Pero creo que doblar las reglas aquí solo para el cuerpo de la función tiene sentido, de lo contrario, muchos lenguajes no pueden competir en absoluto.xchg %eax, %ecx
/sub $4, %al
/xchg %eax, %ecx
Es de 4 bytes, y sigue la convención _fastcall. Usando AL, las codificaciones cortas imm8 y xchg-with-eax a menudo son útiles para el golf de código.objdump -drwC -Mintel
para obtener un hexadecimal de los bytes del código de máquina.add r32, imm8
también es de 3 bytes: opcode + ModR / M + imm8. Todas las instrucciones que pueden tomar un imm32 tienen un código de operación alternativo que toma un imm8 con signo extendido. Ver felixcloutier.com/x86/ADD.html por ejemplo; Todas las instrucciones ALU "clásicas" (pero no MOV) que datan de 8086 tienen todas esas codificaciones, incluidas las AL / AX / EAX especiales sin modr / m, solo op + imm8 / 16/32. Esta respuesta tiene ejemplosOctava: 23 bytes
Si N = L * M, la expresión devuelve
0+i
(es decir, un número puramente imaginario), de lo contrario, la expresión da como resultado un número complejo con un componente real.Para obtener un resultado ligeramente más agradable a costa de un byte adicional:
Si N = L * M, la expresión devuelve
-1
; de lo contrario, un número positivo.Manifestación:
PD, puedes obtener el mismo resultado con
+24;if N==ans;-1;end;ans
pero el bytecount es el mismofuente
Lua,
5646 bytesEmite un 0 (sin una nueva línea final) si es igual y nada o una serie de números negativos (con cero anterior en algunos casos) si no es igual.
Solo: ¡ Pruébelo en línea!
Repetido muchas veces: ¡ Pruébelo en línea!
Explicación
En la primera iteración (cuando
a
aún no se ha definido y, por lo tantonil
, está ), se establecea
en un número tomado de la entrada, de lo contrario a sí mismo. En ambos casos, 46 se resta dea
.Esto solo se imprime
a
si es menor que (para ocuparse de los casos en que la entrada fue mayor que la longitud total) o igual a cero, y la cadena vacía de lo contrario.-10 bytes para recordar que Lua realiza conversiones entre números y cadenas automáticamente. Whoops
fuente
JavaScript (ES6), 47 bytes
Esto está utilizando la misma técnica que Benoit Esnard en esta respuesta (de doble de la fuente, ¡duplica la salida! ).
Imprime 0 si n = 47 * M , o un valor distinto de cero de lo contrario.
Demostración para M = 1
Demo para M = 2
fuente
Brain-Flak , 24 bytes
Pruébalo en línea!
Solo resta 24 de la entrada. Salidas
0
para verdadero y cualquier otra cosa para falso.Brain-Flak , 68 bytes
Pruébalo en línea!
Este es más sofisticado, da como resultado
1
verdadero y0
falso.fuente