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 otherwisesignifica exactamente ? En Haskell, una función con tipoInt -> Intdevuelve 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 byteutiene 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
EDIregistro, siguiendo la convención de llamada System V AMD64.Inicialmente, se realiza una copia de este valor y se coloca en
EAXpara que pueda devolverse si corresponde. (LEAse usa en lugar de lo normalMOVporque necesitamos una instrucción con bytes impares).Luego, el valor en
EDIse 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
JNCinstrucció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 yEAXse devuelve el valor original (in ).Sin
JNCembargo, hay un pequeño truco con la instrucción: ¡tiene unREPprefijo! Normalmente,REPprefijos solo se usan con instrucciones de cadena, pero como los manuales de Intel y AMD coinciden en queREPse 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,REPes en sí mismo un prefijo de byte impar).Gracias a dios
RETestá 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
OUTinstrucció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 laOUTinstrucció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
DXregistro (a través delCXregistro) en la parte superior del bucle, aunque esto solo es necesario si el valor es impar, para asegurar que laJNCinstrucción tenga un desplazamiento impar. Sin embargo, dado que lo que estamos omitiendo es laOUTinstrucció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
MOVinstrucció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 F8en 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,3Do201,105,61que son todos impares.Pruébalo en línea!
Explicación
fuente
= # print without newlineque en realidad se imprime con nueva línea sin aparecerÉ×no parece funcionar):Dfrente, 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?Gse 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 7yiedls7,o 8entra en un bucle infinito.El algoritmo real es
El primer problema que enfrenté fue la falta de espacio y
(, porque una funciónoque toma un argumentomgeneralmente 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).-2es 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 auxiliarcque funciona en listas y llamadascdesde lasocuales tiene el formato correcto .fuente
\tlugar 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, noprinty 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
Noneserí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
11395105893737Este 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.Ilee un0final 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
0x80es 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),%eaxrequiere 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 laJNEinstrucció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 usarOUTpara generar valores impares, pero no se me ocurrieron buenas soluciones. La idea aquí para mí es entrar en un bucle infinito para valores pares.BTfamilia 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
MacintoshChineseTraditionalcodificación de caracteres.\[Divides]es{161, 253}(2 bytes)Versión alternativa (23 bytes)
o (se muestra en Unicode)
en
Symbolcodificació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 obtener2de\[LeftFloor]E\[RightFloor].Symbolpiso marca válida, pero no tiene niEni\[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/eereemplaza todos los caracteres[#-}]+conuc. Sin/eeesto, solo sería la cadenauc, pero/eeevalú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/eevalú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-Elugar 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\x09y\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,prealiza 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 97Segú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
fcomando 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|hy nueva línea)