El lenguaje del compilador sin acrónimo pronunciable, abreviado INTERCAL , es un lenguaje de programación muy exclusivo. Entre sus cualidades irreproducibles están sus operadores binarios.
Los dos operadores binarios de INTERCAL son intercalar (también conocido como mingle ) y select . Intercalar se representa con un cambio (¢), y seleccionar se representa con un sqiggle (~).
Interleave funciona tomando dos números en el rango 0-65535 y alternando sus bits. Por ejemplo:
234 ¢ 4321
234 = 0000011101010
4321 = 1000011100001
Result: 01000000001111110010001001
Output: 16841865
Select funciona tomando dos números en el rango 0-65535, tomando los bits en el primer operando que están en la misma posición que 1s en el segundo operando, y colocando esos bits a la derecha.
2345 ~ 7245
2345 = 0100100101001
7245 = 1110001001101
Taken : 010 0 10 1
Result: 0100101
Output: 37
En este desafío, se le dará una expresión binaria utilizando la operación intercalar o seleccionar. Debe calcular el resultado, utilizando la menor cantidad de bytes posible.
La expresión se dará como una cadena separada por espacios, que consta de un número entero en 0-65535, un espacio, uno ¢
u ~
otro, y un número entero en 0-65535.
La entrada y salida pueden realizarse a través de cualquier sistema estándar (STDIN, función, línea de comando, etc.). Lagunas estándar prohibidas.
Ejemplos:
5 ¢ 6
54
5 ~ 6
2
51234 ¢ 60003
4106492941
51234 ~ 60003
422
Este es el código de golf: menos bytes gana. Buena suerte.
EDITAR: Dado que algunos idiomas no admiten el símbolo de cambio (¢) de INTERCAL, puede utilizar el símbolo de dinero grande ($) en su lugar, con una penalización de 5 bytes.
$
.FIVE ONE TWO THREE FOUR
? ¿Y no debería ser la salida en números romanos?Respuestas:
Pyth,
323129 bytesPruébelo en línea: Regular Input / Test Suite
Gracias a @isaacg por jugar golf en un byte.
Explicación:
fuente
hMfeT
asmmFd
y luego mover el duplicados
fuera del ternario. Además, su código actual es de 32 bytes, no 33.Python 2,
115112 bytesLa cadena en la segunda línea contiene un único carácter no imprimible
\x7d
, el siguiente carácter después~
.Todas las esperanzas de una bonita y única lambda quedan aplastadas por el formato de entrada. Probablemente haya una mejor manera de leer en la entrada. Entrada como a
"51234 ¢ 60003"
través de STDIN.La función
f
combina las siguientes dos funciones recursivas:(-3 bytes con la ayuda de @xnor)
fuente
(a%2*2+b%2)/3**d
guarda 3 caracteres pero usa el complementod=1-c
. ¿Tienes una manera de hacer-~(3*c|b%2)
con el complemento? En el peor, pierde 2 caracteres con3-3*d
. Además, el formatoand-~x+y
puede serandy-~x
tan largo comoy
comienza con un símbolo o número.(b%2+5&4-d)
. ¡Gracias!CJam, 31 bytes
Pruébelo en línea en el intérprete de CJam .
Cómo funciona
fuente
JavaScript (ES6), 103
117 119 124Edite ahora trabajando con números en lugar de cadenas
(sin contar espacios iniciales, líneas nuevas y comentarios)
Pruebe a ejecutar el fragmento en cualquier navegador compatible con EcmaScript 6 (en particular, no Chrome ni MSIE. Probé en Firefox, Safari 9 podría funcionar)
fuente
Matlab,
119113bytesSin golf:
Ejemplos:
fuente
R, 145 bytes
Ungolfed + explicación:
fuente
Python 3,
174166148126Bastante sencillo, operaciones de cadena, luego conversión a entero.
Limitado a números que en binario tienen 99 dígitos (máximo 2 ^ 99-1 = 633825300114114700748351602687).
Gracias, Sp3000 y Vioz!
O 165 caracteres, sin límite:
Sin golf:
fuente
zfill
lugar derjust
a,b
, sólo hay que poner en elzip
con un*
splat, 2)(i if j=='1'else'') -> i[:j>'0']
3) Se puede utilizar este truco para ahorrar en la otraif/else
Pyth, 43 bytes
Una parte de mí se siente nerviosa al publicar una respuesta tan larga de Pyth a la pregunta de Isaac ...: oP
Explicación:
fuente
C,
127123 bytes + 5 penalizaciones = 128scanf
cuenta el símbolo Unicode como más de un carácter que complica mucho las cosas, por lo que estoy aplicando la penalización de 5 bytes por usar$
.Los cambios de la versión original son:
-La prueba de $ o ~ ha sido revisada de
q&2
aq%7
. Esto invierte los valores verdadero / falso, permitiendo que el código para el operador $ vaya antes del:
que significa que se puede eliminar un conjunto de paréntesis.-El
i
ciclo ahora cuenta regresivamente en potencias de 2, que es más largo, pero permite>>
ser sustituido por/
y guarda algunos paréntesis.Versión original 127 bytes
Fui con un solo bucle con los condicionales dentro para evitar la sobrecarga de dos bucles. En ambos casos, desplazo los bits de los operandos hacia abajo hasta el bit del 1, y construyo el resultado del bit más significativo al menos significativo, desplazando a la izquierda el resultado (multiplicándolo por 2 o 4) a medida que avanzo.
fuente
main
causasq
se corrompe en mi máquina, lo cual es extraño. Espero que el verdadero problema sea conscanf
, pero por eso los he dejado como declaraciones normales.q
se garantiza que sea cero, pero con la declaración como parámetro de funciónq
contiene basura de 32 bits. Eso no sería un problema si me asignaron un valor aq
, peroscanf
con la"%c"
única sobrescribe los bits menos significativos 8 de la basura, dejando el otro 24 sin definir. ¡Podría tener suerte con otro compilador!K5,
5352 bytesVersión de 53 bytes:
Todavía necesita un poco más de golf.
fuente
CJam,
6150464134 bytesGracias @Dennis por señalar un campo de golf de 4 bytes.
Pruébalo en línea .
fuente
]{}/
Es un noop.Haskell, 77
la entrada se da aplicando la entrada a las funciones / operadores
?
y¢
define en el código (Haskell no puede definir un operador~
por razones técnicas).básicamente funciona el viejo enfoque recursivo.
fuente
J 173
espera una línea de entrada
Se espera que la entrada termine después de una nueva línea con EOF
fuente
Javascript ES6 (3 argumentos)
141138136121119 bytesPrueba:
Javascript ES6 (1 argumento)
135133 bytesPrueba:
PD: la nueva línea se cuenta como 1 byte, ya que se puede reemplazar por
;
.fuente
Python 3, 157 bytes
La versión completa y explicativa se puede encontrar en mi pastebin .
fuente
e
una vez, ¿no puede simplemente en línea?Mathematica, 155 bytes
Evalúa una función anónima tomando la cadena como entrada. Saltos de línea añadidos para mayor claridad.
f
yg
convertir a / desde la base 2.Riffle
hace exactamente lo que se supone intercalar . Quería usarSelect
para seleccionar, peroCases
desafortunadamente es mejor. La última línea es un poco engañosa; se cambian los espacios,~
que es el operador infijo de Mathematica, luego se evalúa la cadena.fuente