¡Creo que no hay suficientes preguntas fáciles aquí que los principiantes puedan intentar!
El desafío: dada una cadena de entrada aleatoria de 1 y 0, como:
10101110101010010100010001010110101001010
Escriba el código más corto que genera el inverso de bits de la siguiente manera:
01010001010101101011101110101001010110101
=&'0'
funciona para la misma cantidad de bytes.GolfScript , 5 bytes
Pruébalo en línea.
Cómo funciona
GolfScript lee toda la entrada de STDIN y la coloca en la pila como una cadena.
{}%
pasa por todos los caracteres de la cadena y ejecuta el bloque de código para todos ellos.1^
calcula el OR exclusivo del código ASCII de caracteres con 1. "0" corresponde al código ASCII 48, "1" al código ASCII 49.Dado
48 ^ 1 = 49
y49 ^ 1 = 48
, esto resulta de 0 a 1 y de 1 a 0 de de.Una vez terminado, GolfScript imprime la cadena modificada.
fuente
CJam - 4
Este xor es cada carácter con 1.
A diferencia de la otra respuesta de CJam, no estoy asumiendo que la entrada ya está en la pila.
Pruébalo en http://cjam.aditsu.net/
fuente
f
.código de máquina x86 en DOS -
141311 bytesBueno, ¡se acortó de nuevo! Después de escribir una solución para un desafío no relacionado , noté que el mismo truco podría aplicarse incluso aquí. Así que, aquí vamos:
Asamblea comentada:
Solución anterior - 13 bytes
Creo que no se acorta mucho más que esto.En realidad, lo hizo! Gracias a @ninjalj por eliminar un byte más.Esta versión presenta interactividad avanzada ™ : después de ejecutarla desde la línea de comandos, escupe los caracteres "invertidos" siempre que escriba los dígitos de entrada (que no tienen eco); para salir, solo haz Ctrl-C.
A diferencia de la solución anterior, esto tiene algunos problemas para ejecutarse en DosBox, ya que DosBox no admite Ctrl-C correctamente , se ve obligado a cerrar la ventana de DosBox si desea salir. En cambio, en una máquina virtual con DOS 6.0, se ejecuta según lo previsto.
Fuente NASM:
Vieja solución -
272522 bytesEsto aceptó su entrada desde la línea de comando; funciona sin problemas como un archivo .COM en DosBox.
Entrada NASM:
fuente
xchg dx,ax
es 1 byte más corto quemov dl,al
Bash + coreutils, 8 bytes
Toma información de STDIN.
O
sed, 8 bytes
fuente
y 01 10
tr
...CJam , 4 bytes
Asume que la cadena original ya está en la pila. Imprime la cadena modificada.
Pruébelo en línea pegando el siguiente código :
Cómo funciona
:~
evalúa cada carácter de la cadena, es decir, reemplaza el carácter 0 con el entero 0.:!
calcula el NOT lógico de cada entero. Esto convierte 0's en 1's y 1's en 0's.fuente
Brainfuck (
7071)Explicación:
fuente
a
para11
.PHP - 19 bytes
Sí, no muy original, supongo!
fuente
Pila de panqueques , 532 bytes
Se supone que la entrada termina con un carácter nulo. La estrategia es la siguiente:
1
.0
(dando un1
si lo tuviéramos0
, o un0
si lo tuviéramos1
)0
a ellafuente
C: 29
Pruébelo en línea aquí .
Gracias por señalar el truco XOR, Dennis.
fuente
i(char*s){while(*s)*s++^=1;}
while
con unfor
resultado fijo de una longitud de 28 caracteres.Python 2.7 - 34 *
Oh, cuánto apesta este primero. Bastante feo, este es. 63 caracteres
Este es un poco mejor, pero aún no es tan elegante. 44 caracteres.
Desde
int(x) and 1
devuelveint(x)
si no es 0 y de lo contrario es falso. La solución se puede reducir aún más a 36 caracteres.Como
join()
lleva un generador, los soportes se pueden quitar. 32 caracteresY se pueden usar backticks en lugar de
str()
Reducido a 44 de 34 gracias a los punteros de @TheRare
Encontrar el complemento de uno es difícil en python ya que
bin(-int)
devuelve -0bxxx, de ahí lo anterior.fuente
(int(x) and 1) == int(x)
'' == False
y'hi' == True
''.join(`1-int(x)`for x in'')
repr(x)
para x <maxint es igual astr(x)
Perl, 9 caracteres
El noveno personaje es la bandera 'p'
Uso:
fuente
y/10/01/
, pero con un carácter más corto, ya que no necesita ningún banderasJavascript ( ES6 ) 36
fuente
s
,s.replace(/./g,x=>x^1)
son 22 caracteres.p=prompt(p().replace(/./g,x=>x^1))
(p=prompt)(p().replace(/./g,x=>x^1))
y esa es la misma longitud.Laberinto , 6 bytes
(El laberinto es más nuevo que este desafío, por lo que esta respuesta no compite, no es que esté ganando de todos modos ...)
Este código supone que STDIN contiene solo los dígitos (en particular, sin línea nueva final).
El puntero de instrucciones (IP) comienza en la esquina superior izquierda hacia la derecha. Si bien hay dígitos para leer, se desplazará en un ciclo cerrado a través del bloque izquierdo de 2x2:
1
presione un 1,,
lea un dígito,$
XOR con 1 para alternar el último bit,.
imprima el resultado. La IP toma este bucle porque la parte superior de la pila es positiva después del XOR, de modo que tomará un giro a la derecha. Cuando golpeamos EOF,,
regresa en su-1
lugar. Luego, el XOR cederá-2
y con este valor negativo, la IP girará a la izquierda@
y el programa finalizará.Esta solución debería ser óptima para Labyrinth: necesita
,
y.
para un bucle de E / S y@
para finalizar el programa. Necesita al menos dos caracteres (aquí1
y$
) para alternar el último bit. Y necesita al menos una nueva línea para un bucle que se puede terminar.A menos que ... si ignoramos STDERR, es decir, permitimos terminar con un error, podemos guardar el
@
y tampoco necesitamos ninguna forma de cambiar entre dos rutas. Seguimos leyendo e imprimiendo hasta que accidentalmente intentamos imprimir un valor negativo (el-2
). Esto permite al menos dos soluciones de 5 bytes:fuente
Rubí: 23
fuente
Código de máquina de Turing, 32 bytes (1 estado - 3 colores)
Usando la sintaxis de la tabla de reglas requerida por este simulador de TM en línea. Tomado prestado de una publicación que hice en mi blog de usuarios de Googology Wiki hace unos meses.
También puede probar esto usando esta implementación de Java.
fuente
Python 2.x - 44 bytes
¿Por qué hacerlo complejo o usar algunas variables engañosas?
fuente
print''.join('1-int(x)'for x in'input()')
. No pude obtener los backticks en el código de comentario, así que los sustituí por '.`a\`b`
->a`b
.R, 27 caracteres
Uso:
fuente
APL (Dyalog Unicode) , SBCS de 7 bytes
Programa completo Indica stdin.
Pruébalo en línea!
⍞
pronta stdin⍎¨
ejecutar cada personaje~
NO lógico⍕¨
formatee cada carácter como texto∊
ϵ nlist (aplanar)fuente
PHP> 5.4 - 37 caracteres
$s
es la entradaTry it online
fuente
<kbd>
etiqueta.TI-BASIC, 7 bytes
Esta es una función que toma una cadena binaria (a través
Ans
) como entrada y devuelve la salida como una cadena invertida (no invertida), como se especifica. Para obtener más ayuda, puede leer la aplicación de la listanot(
en el wiki de TI-BASIC. Estoy usando la versión compilada porque es más pequeña:En hexadecimal:
Explicación
»*r
- Tome la entrada de función como cadena y conviértala en lista>
- Tubería de la lista dada a los siguientes operadoresÕ¸r
- Devuelve el inverso de la listafuente
»*r>Õ¸r
?expr(Ans:Returnnot(Ans
; 2. Debido a que la cadena no está separada por comas y no comienza con a{
, se evaluará a un número entero como 1000010011, no una lista; 3.Return
no funciona como lo escribiste; 4. Esto da salida como una lista, no una cadena.Haskell, 22 bytes
Me sorprendió la falta de soluciones de Haskell para este desafío, así que aquí hay una. Se evalúa como una función que toma una cadena y devuelve su inverso.
Explicación
Nada lujoso aquí.
fuente
Befunge 93, 25 bytes
Suponiendo que la pila vacía y EOF leen -1.
0
empuja a \ 0 como un terminador nulo>~1+:#v_
es un bucle de entrada, lee ascii, agrega 1, comprueba EOF + 1 = 0,^ -1<
de lo contrario, resta 1 y deja el valor ascii empujado en la pila.$>:#,_@
suelta la copia adicional de cero en la parte superior de la pila, luego imprime la cadena binaria de arriba a abajoSi la pila vacía lee 0, guarde 2 bytes con
Es posible una versión de alrededor de 15 bytes usando este mismo algoritmo si EOF = 0, pero no tengo una implementación tan práctica para probar.
fuente
Javascript ES6, 26 caracteres
fuente
Befunge-98 (PyFunge) , 7 bytes
Para cada carácter,
c
en la entrada, imprime el carácter con un valor ascii de94 - c
, donde 94 es el valor de '0' + '1' o 'a'Pruébalo en línea!
fuente
Python3, 39
Methinks Python no es el mejor lenguaje para esto. :)
Si le importa tener una nueva línea después de la salida, aquí hay una alternativa de 43 caracteres:
fuente
end=''
sólo,
va a hacer :) - a menos que se preocupan por estar allí sin espaciosprint
función de Python3 requiere ajustar elend
parámetro para suprimir una nueva línea al final de cada impresión. Además, según la especificación de OP, creo que me importa que no haya espacios. :) Gracias por el comentario, sin embargo!J - 11 caracteres
Los valores booleanos en J se representan como enteros
0
y1
, por supuesto, también son índices válidos en matrices (en este caso, la matriz de 2 caracteres'01'
)fuente
C #, 131 bytes
Un poco tarde para la fiesta, pero aquí está el mío. :)
fuente
MATLAB, 13 bytes
Después de ejecutar lo anterior, simplemente llame a la función con su cadena de entrada para obtener la cadena invertida. Por ejemplo ejecutando:
huellas dactilares:
fuente
BotEngine , 4x8 = 32
Sin competencia ya que el lenguaje es posterior a la pregunta.
Con resaltado:
fuente