Su tarea es simple: escriba un programa que recibe un número entero como entrada y lo emite si era extraño, y no hace nada diferente (no se permite detener). El desafío es que solo puedes usar bytes impares.
Opcionalmente, puede agregar una nueva línea final a la salida.
Este es el código de golf, gana la respuesta más corta en bytes (impares).
Las lagunas estándar están prohibidas. Además, no puede usar versiones de idiomas, que son más recientes que la publicación de este desafío.
Ejemplo de entrada> salida:
13
> 13
42
>
code-golf
restricted-source
M.Herzkamp
fuente
fuente
does nothing otherwise
significa exactamente ? En Haskell, una función con tipoInt -> Int
devuelve un número entero o no detiene o arroja algún error. Si la entrada es par, obviamente no debería devolverse, ¿no sería aceptable detener o arrojar un error en este caso?alphabet=new Set(Array(256).fill(0).map((v,i)=>i).filter(v=>v%2).map(String.fromCharCode));
. Compruebe si la fuente es válido:[..."SOURCE CODE"].every(v=>alphabet.has(v))
. Ver caracteres no válidos en la fuente:[...new Set("SOURCE CODE")].filter(v=>!alphabet.has(v))
. Recuerde escapar de sus citas,"
=>\"
;)Respuestas:
Japt
-f
, 1 byteu
tiene un valor de código char de117
.Intentalo
fuente
Lenguage ,
645529908926937253684695788965635909332404360034079939415799150094049227072719076304944873511742697489376175615338418980647354995512293382937520069758100171520289933829375200697581001715202899Eso es aproximadamente igual a 2 duodecillones de bytes.
El archivo se traduce en el siguiente programa brainfuck:
Toma datos como un código ASCII, con un valor máximo de 256. Utiliza el ajuste.
fuente
,[<<+>+>-]<[>>+<<-]+>>[-[->]<]<[<[<]>.<]
?,[[>]++[-<]<+>>]>[<<<.<]
solo por 3452857532394791089951 bytes?,-[-->++<]>+.
funcionaCódigo de máquina x86-64, 8 bytes
Inspirado en la solución de Bruce Forte , pero ligeramente por debajo del par. :-)
Se toma un único parámetro entero en el
EDI
registro, siguiendo la convención de llamada System V AMD64.Inicialmente, se realiza una copia de este valor y se coloca en
EAX
para que pueda devolverse si corresponde. (LEA
se usa en lugar de lo normalMOV
porque necesitamos una instrucción con bytes impares).Luego, el valor en
EDI
se desplaza a la derecha por 1, lo que coloca el bit desplazado en la bandera de acarreo (CF). Este bit será 0 si el número fue par o 1 si fue impar.Luego probamos CF utilizando la
JNC
instrucción, que se ramificará solo si CF es 0 (es decir, el número fue par). Esto significa que entraremos en un bucle infinito para valores pares. Para valores impares, caemos yEAX
se devuelve el valor original (in ).Sin
JNC
embargo, hay un pequeño truco con la instrucción: ¡tiene unREP
prefijo! Normalmente,REP
prefijos solo se usan con instrucciones de cadena, pero como los manuales de Intel y AMD coinciden en queREP
se ignoran los prefijos irrelevantes / superfluos / redundantes , arrojamos uno en la instrucción de bifurcación aquí para que tenga 3 bytes de longitud. De esa manera, el desplazamiento relativo que se codifica en la instrucción de salto también es impar. (Y, por supuesto,REP
es en sí mismo un prefijo de byte impar).Gracias a dios
RET
está codificado usando un byte extraño!Pruébalo en línea!
En caso de que no piense que devolver el valor si es impar o entrar en un bucle infinito si es par (para que nunca regrese) satisfaga los requisitos de "salida" del desafío, o simplemente desea algo más interesante, aquí hay una función que genera el valor en un puerto serie (pero solo si es extraño, por supuesto).
Código de máquina x86-64 (salida al puerto serie), 17 bytes
Lo que hace que esto sea un poco más interesante es que el código hace más , lo que significa que fue más difícil hacerlo todo usando instrucciones que están codificadas usando solo bytes impares. Por supuesto, esto también significa que falla en el golf de código, por lo que es una especie de compensación: ¿desea interesante y desafiante, o quiere corto?
De todos modos, esto usa la
OUT
instrucción x86 para escribir en el puerto de E / S 0x3F8, que es el puerto serie COM1 estándar en una PC. La parte divertida, por supuesto, es que todos los puertos de E / S estándar (serie y paralelo) tienen direcciones pares, por lo que no pueden codificarse como inmediatos para laOUT
instrucción o moverse directamente a un registro. Debe inicializar con uno menos que el valor real y luego incrementar el valor en el registro. También está limitado a usar ciertos registros para la manipulación porque necesita registros que están codificados usando bytes impares en la instrucción cuando se usan como operandos.Además, tuve que inicializar el
DX
registro (a través delCX
registro) en la parte superior del bucle, aunque esto solo es necesario si el valor es impar, para asegurar que laJNC
instrucción tenga un desplazamiento impar. Sin embargo, dado que lo que estamos omitiendo es laOUT
instrucción, todo lo que hace este código es desperdiciar ciclos y registrar registros de cero; en realidad no genera nada, por lo que no rompe las reglas.Finalmente, esta función volverá (después de haber realizado o no la salida al puerto serie) con el valor de entrada restante
EAX
. Pero eso en realidad no rompe ninguna regla; todas las funciones en lenguaje ensamblador regresarán con un valor enEAX
— la pregunta es si es un valor significativo o un valor basura . Eso está determinado por la documentación de la función (esencialmente, devuelve un valor o devuelvevoid
), y en este caso, lo estoy documentando como no devuelve un valor. :-)No hay un enlace TIO para este, ya que no implementa la salida a los puertos serie. Necesitarás hierro real o imaginación.
fuente
MOV
instrucción, sus operandos también deben codificarse en bytes. En este caso, esos serían los registros de origen y destino (aunque los operandos también pueden ser valores inmediatos, que son como constantes). Los diferentes registros se asignan a diferentes bytes, y algunos de esos bytes son pares. Entonces, por ejemplo, lo que me gustaría usar seríamov eax, edi
, pero eso está89 F8
en bytes. Vea mucho más de lo que siempre quiso saber sobre codificaciones aquí, en la sección "código" . @ M.HerzkampJalea , 2 bytes
Estos caracteres corresponden a los bytes 0xF7 y 0xBF en la página de códigos de Jelly .
Pruébalo en línea!
fuente
05AB1E , 3 bytes
El código corresponde a los valores de bytes
C9,69,3D
o201,105,61
que son todos impares.Pruébalo en línea!
Explicación
fuente
= # print without newline
que en realidad se imprime con nueva línea sin aparecerÉ×
no parece funcionar):D
frente, pero eso es uniforme y no más corto. La razón por la que no funciona es que la entrada implícita repetida se toma como segundo argumento.MATL , 3 bytes
MAT utiliza caracteres ASCII, por lo que
o?G
se corresponde con bytes (en decimal)111
,63
,71
.Pruébalo en línea!
Explicación
fuente
Haskell ,
3633 bytesPruébalo en línea!
Uso:
o 7
yiedls7
,o 8
entra en un bucle infinito.El algoritmo real es
El primer problema que enfrenté fue la falta de espacio y
(
, porque una funcióno
que toma un argumentom
generalmente se define comoo m=...
oo(m)=...
. Sin embargo, descubrí que un comentario en línea también{- some comment -}
funciona como delimitador de tokens, por lo queo{--}m=...
es posible una definición bajo las reglas dadas. Editar: Ørjan Johansen señaló que se puede usar un carácter de tabulación en lugar de un espacio, ahorrando tres bytes:o m=...
El segundo problema fue la llamada recursiva
o(m-2)
.-2
es justo-1-1
, pero aquí el truco de comentarios no funciona porque los paréntesis son obligatorios. Solucioné esto dejando que la función funcionara en una lista única que contenía un número:o[m-2]
sin embargo, como esta no es una forma estándar de proporcionar información, externalicé el cálculo a una función auxiliarc
que funciona en listas y llamadasc
desde laso
cuales tiene el formato correcto .fuente
\t
lugar de{--}
.Python REPL, 38 bytes
Toma la entrada como el valor de la expresión anterior usando
_
. La salida será una cadena (la representación de cadena del entero para impar o la cadena vacía para par).Pruébalo en línea
Para ejecutarlo en un shell real, puede probarlo aquí . Escriba la entrada, presione enter. Pegue el código, presione enter.
Explicación:
Esto tomó un tiempo para darse cuenta. No hay multiplicación, sin ramificación, sin segmentación, sin comas, sin puntos, sin importaciones, sin paréntesis, no
exec
, noeval
, noprint
y sin funciones. Obtuve una solución trabajando esa salida usando stderr, pero luego me di cuenta de que teníamos que generar el entero real, no solo un valor verdadero / falso.Uso paréntesis en lugar de paréntesis con
[expression][-1]
. Simplificando eso convierte el código anterior en'%s'%(['']+[_])[_%(1+1)]
.Como no puede haber comas, utilicé la adición de listas para crear
['',_]
. Usando el formato de cadena, se obtiene el resultado deseado.fuente
None
sería una coincidencia aún mejor que''
. De todos modos, eso es 10000 veces mejor que cualquier cosa que se me ocurra.False
. Sin embargo, no sé cómo podrías llegarNone
.CJam, 6 bytes
113
95
105
89
37
37
Este programa toma el mod 2 de la entrada (llámelo r ) e imprime cada r ésimo carácter en la cadena de entrada. Si el número de entrada es impar, imprime la cadena completa, pero si se le pide que imprima cada carácter 0, el programa arroja un error.
Pruébalo aquí
fuente
qi_Y%]W%{}/M?
y luego vi esto.Cubix ,
231917 bytes¡Intentalo!
@
, que finaliza un programa Cubix, es ascii 64, por lo que desafortunadamente esto solo entra en un bucle infinito después de probar la rareza. No hay enlace TIO ya que se agota el tiempo de espera.=
(ascii 61) es un no-op en Cubix.Esta es una ligera modificación del algoritmo anterior (mismo número de bytes) que realmente funciona para enteros negativos.
Versión de cubo:
Algoritmo:
I
(73)
: leer en la entrada como número1
(49)
: empuje 1)
(41)
: incremento%
(37)
: toma el mod/
(47)
: girar a la izquierda!
(33)
: omita la siguiente instrucción si es impar1;;/;
;
es(59)
: prepara la pila para la salidaO
(79)
: Salida como un número.I
lee un0
final de entrada, por lo que tenemos la garantía de ingresar la rama paru
(117)
: giro a la derecha;;;!I
: bucle, efectivamente no hacer nada.fuente
?
Carbón de leña , 9 bytes
Pruébalo en línea!
Básicamente imprime hacia la derecha la entrada si no es un múltiplo de 10/5 (el
²
carácter está incluso en la página de códigos de carbón ). Los caracteres utilizados son:¿
: códigoBF
.﹪
: códigoA5
.I
: códigoC9
.θ
: códigoF1
.÷
: códigoAF
.χ
: códigoE3
.⁵
: códigoB5
.→
: código13
.De hecho,
→
casi al final es redundante, pero luego vi que la respuesta tenía que tener una longitud extraña ...Explicación:
fuente
→θ
.Código de máquina x86_64 (Linux),
1211 bytesLamentablemente
0x80
es par, pero aún funcionó (suponiendo que "no hace nada" significa no volver):-1 byte, gracias @CodyGray!
Pruébalo en línea!
fuente
lea (%edi),%eax
requiere un prefijo de reemplazo de tamaño de dirección (0x67
) cuando la fuente es un registro de 32 bits. Puedes eliminar eso haciendolea (%rdi),%eax
. Eso ahorra un byte, y en realidad haría que el código sea un poco más eficiente (los prefijos ralentizan la decodificación y llenan el i-cache). Hay otras cosas que puede hacer para acortar esto aún más, pero eso esencialmente constituye una reescritura completa, por lo que publicaré mi propia respuesta. :-) ¡También he votado sobre esto, por supuesto! (Oh, acabo de dar cuenta que ya ha usado el prefijo para hacer el desplazamiento extraño salto Bueno, necesitará más magia..)F6
) para laJNE
instrucción porque tiene un desplazamiento uniforme. Eso es lo que quise decir con el último paréntesis que edité en mi primer comentario. Realmente necesitas ese prefijo para crear una alineación extraña. O tienes que reescribir el código de alguna otra manera. Jugué con un montón de variaciones diferentes. De hecho, miré esto anoche y estaba tratando de encontrar una buena manera de usarOUT
para generar valores impares, pero no se me ocurrieron buenas soluciones. La idea aquí para mí es entrar en un bucle infinito para valores pares.BT
familia de instrucciones, que nadie usa nunca (desafortunadamente, todas las codificaciones de registro son incluso bytes). Pensé que podría ser más interesante escribir código que salga a un puerto serie, en lugar de simplemente devolver un valor o lo que sea, pero eso hace que el byte cuente allí (¡especialmente porque las direcciones de puerto serie en hexadecimal son pares!), Así que renunció a eso.Mathematica, 20 bytes
Parece ser la primera solución en un lenguaje que no es de golf.
En
MacintoshChineseTraditional
codificación de caracteres.\[Divides]
es{161, 253}
(2 bytes)Versión alternativa (23 bytes)
o (se muestra en Unicode)
en
Symbol
codificación de caracteres. (use solo caracteres de 1 byte)La solución define una función
g
(oΓ
) que evalúa la entrada cuando la entrada es impar y literalmente "no hacer nada" (no evalúa) cuando la entrada es par.fuente
;
al final) si el número de bytes debe ser par; y\[Divides]
también tienen un punto de código Unicode extraño.I[1+1]
, solo puedes usar{1+1}
. Además, ¿ha verificado si los bytes de los soportes de piso son válidos? Si es así, puede obtener2
de\[LeftFloor]E\[RightFloor]
.Symbol
piso marca válida, pero no tiene niE
ni\[ExponentialE]
.D
;v
; nid
, ya que tienen un valor de byte par .. :(\[Divides]
es un solo carácter en Mathematica, que está representado por 2 bytes{161, 253}
.Perl, 54 bytes
Requiere
-E
.Realmente disfruté este desafío, creo que me gustaría intentar mejorar esta respuesta, pero creo que es lo más corto que puedo hacer por ahora. He estado jugando con estas respuestas por unos días, ¡pero siento que estoy contento con la solución de 54 bytes!
Pruébalo en línea!
Explicación
Por defecto, la mayoría de las funciones de cadena de Perl funcionan
$_
, que está vacía para comenzar.Primero,
s//A_=Y[;A_=A_%O?A_W''/
reemplaza la cadena vacía$_
conA_=Y[;A_=A_%O?A_W''
, luegoy/#A-_/#-A/
reemplaza los caracteres según la siguiente lista (char arriba se convierte en char debajo):qué actualizaciones
$_
contener$_=<>;$_=$_%2?$_:''
. Luegos/[#-}]+/uc/ee
reemplaza todos los caracteres[#-}]+
conuc
. Sin/ee
esto, solo sería la cadenauc
, pero/ee
evalúa el contenido de la cadena dos veces. La primera evaluación devuelve el resultado deuc
, que es una versión en mayúscula de,$_
pero dado que$_
no contiene caracteres alfabéticos, solo devuelve la cadena completa, luego la segunda/e
evalúa la cadena nuevamente, que se establece$_
en$_
(el número de entrada) o''
dependiendo de si No el número es par o impar.Finalmente, dado que
$_
ahora contiene lo que queremos, llamamossay
(que es lo que requiere en-E
lugar de-e
) qué impresiones$_
seguidas de una nueva línea.Perl alternativo, 93 bytes
Código de 92 bytes + 1 para
-p
, que creo que lo haría no competitivo.Contiene una pestaña y una pestaña vertical en el
y///
, indicado como\x09
y\x0b
.Pruébalo en línea!
fuente
LOGOTIPO ,
390465250 bytesEsa es una lista de plantillas que devuelve la entrada si la entrada es impar, y causa un error si la entrada es par.
Uso:
salida
ya que 5 es impar, y
causará un error porque 6 es par.
fuente
TI-BASIC, 14 bytes
Esto arroja un error de dominio (no imprime nada en la pantalla de inicio) en un número par.
fuente
Pyth ,
1411109 bytesBanco de pruebas .
fuente
I%Qy1Q
?y1
... Sin embargo%
, lamentablemente no está permitido.%
tiene un valor ascii 37 y es impar.Japt , 4 bytes
Japt usa ISO / IEC 8859-1 , por lo que corresponde a (en decimal)
117 41 231 85
.¡Pruébelo en línea!
Explicación
Primero probé soluciones usando
p
, que es básicamenteç
con argumentos invertidos. Sin embargo,p
realiza exponenciación si su argumento izquierdo es un número, por lo que tendríamos que convertirlo explícitamente en una cadena. Esta solución resulta ser en realidad un byte más corto, además de no contener bytes impares.fuente
dc , 21 bytes
Decimal:
91 99 93 115 97 63 107 75 75 67 73 45 49 59 49 107 37 49 33 61 97
Según este valor predeterminado de IO, este programa deja la entrada en la pila principal si es impar y vacía la pila de lo contrario. Esto se puede confirmar agregando el
f
comando de depuración al final del programa como es el caso en la página TIO.Pruébalo en línea!
Explicación
fuente
TI-Basic, 18 bytes
Guardado 2 bytes gracias a lirtosiast
en bytes (+2 líneas nuevas = 3F)
Ver http://tibasicdev.wikidot.com/one-byte-tokens
fuente
Input Q[newline]sinֿ¹(gcd(Q²,int(e[newline]Q
(14 bytes). ¿Puedo publicar como respuesta por separado?MathGolf , 3 bytes
Pruébalo en línea!
Los bytes utilizados son
157, 123, 107
.Explicación
fuente
Bash , 31 bytes
Pruébalo en línea!
Explicación:
fuente
rd $20|h
y nueva línea)