Invertir una matriz booleana

19

Uno agradable simple

Entrada

Dada una matriz booleana (o una alternativa aceptable), puede asumir que la matriz nunca tendrá más de 32 elementos de largo.

[false, false, true, false, false]

Salida

Invierte cada elemento de la matriz y lo genera.

[true, true, false, true, true]

Reglas

  • Puedes escribir un programa completo o solo una función
  • Se aplican lagunas estándar
  • ¡El código más corto en bytes, por idioma, gana!

Casos de prueba

Input:
[true, false]
Output:
[false, true]

Input: //Example of acceptable alternative
[0,1,1]
Output:
[1,0,0]
Shaun Wild
fuente
¿Qué hay de las matrices de 0(falso, todos los 0 bits) y -1(verdadero, todos los 1 bits)?
Lynn el
55
@ Lynn Si bien es la decisión de los OP, yo diría que debería depender de si tu lenguaje considera si es verdadero / falso.
Martin Ender
Relacionado. (Dada la simplicidad de la tarea central, diría que las diferencias en el formato son lo suficientemente significativas como para que no sean duplicados)
Martin Ender
66
Esto me parece más que un código de golf: ¿cuál es el operador no en su idioma favorito? Puntos adicionales si funciona en listas.
licorna

Respuestas:

14

Gelatina , 1 byte

¬

Pruébalo en línea!

¬es lógico NO (1 si es falso-y, de lo contrario 0). C("Complemento", 1 − z ) también funciona.

Lynn
fuente
12
Creo que a @Dennis le va a costar mucho superarlo.
defecto
15
@flawr Es solo cuestión de tiempo antes de que Dennis lo haga en 0 bytes o menos.
Erik the Outgolfer
2
@EriktheGolfer "0 bytes o menos " hmm
zdimension
1
@zdimension Es Dennis, puede hacerlo más corto de lo que piensas (lee los memes).
Erik the Outgolfer
13

Javascript ES6, 15 bytes

a=>a.map(b=>!b)

No se necesita mucha explicación, supongo

f=
a=>a.map(b=>!b)

a.innerHTML = `[true, false, 1, 0] => ${ f([true, false, 1, 0]) }`
<pre id=a>

Bassdrop Cumberwubwubwub
fuente
12

Matlab, 4 1 byte

Esto debería explicarse por sí mismo.

~

Matlab tiene el operador de negación de un byte ~, si desea una función que pueda usar @not.

falla
fuente
22
obtener @rgument, negate, output, terminate, ¿verdad?
Martin Ender
2
Jaja, claro, ¡me sorprende que seas tan fluido en Matlab!
defecto
jajaja, esto suena como Borat "Esto debería explicarse por sí mismo ... NO"
user2023861
seguramente ~es una respuesta apropiada ya que es un operador que recibe un argumento. Creo que ~[1,0,0,1,0]es completamente apropiado.
Tasos Papastylianou
1
@TasosPapastylianou Los envíos de operadores son definitivamente válidos (en algunos lenguajes como Julia y Mathematica es incluso una práctica común definir sus propios operadores porque es más corto que definir su propia función), pero estoy seguro de que falla simplemente no quiere invalidar mi comentario. ;)
Martin Ender
10

Haskell, 7 bytes

map not

Ejemplo:

Prelude> (map not) [False, True, True]
[True,False,False]
Lynn
fuente
No necesitas el paréntesis en el ejemplo, ¿verdad?
flawr
99
No lo hago, pero quería demostrar en el ejemplo cómo mi respuesta es una expresión válida y no un fragmento.
Lynn
3
Hubo una edición sugerida justo ahora para hacer el código not<$>, pero esa no es una expresión válida; no puedes escribir f = not<$>y luego f [False, True, True]; los segmentos de operador necesitan paréntesis a su alrededor, lo que contribuiría al recuento de bytes.
Lynn
2
y tampoco se supone que sugiera código a través de ediciones de todos modos
undergroundmonorail
10

MATL , 1 byte

~

Pruébalo en línea!

~es el lógico no y tantas funciones, también se puede aplicar a matrices / matrices.

falla
fuente
2
Funciona en APL también.
Adám
10

C, 46 Bytes versión recursiva

f(char*s){*s?putchar(*s&72?*s:*s^1),f(++s):0;}

C, 47 bytes versión iterativa

f(char*s){for(;*s;putchar(*s&72?*s:*s^1),s++);}

Ejecute con esta función principal

main(c,v)char**v;
{
    f(v[1]);
}

y entrada como esta

a.exe [1,0,1,1,0]
[0,1,0,0,1]
cleblanc
fuente
Más corto de lo que esperaba ver para C!
Chris Jefferson
10

R, 1 byte

!

Ejemplo:

> !c(TRUE, FALSE)
[1] FALSE  TRUE

También funciona con entrada numérica:

> !c(1, 0)
[1] FALSE  TRUE

Tampoco estamos restringidos a matrices unidimensionales. Hagamos una matriz y rellene al azar con 0s y 1s:

> mat = matrix(rbinom(16, 1, .5), ncol=4)
> mat
     [,1] [,2] [,3] [,4]
[1,]    0    1    1    1
[2,]    0    1    0    0
[3,]    0    0    0    0
[4,]    1    1    1    0

Podemos invertir esto con la misma facilidad:

> !mat
      [,1]  [,2]  [,3]  [,4]
[1,]  TRUE FALSE FALSE FALSE
[2,]  TRUE FALSE  TRUE  TRUE
[3,]  TRUE  TRUE  TRUE  TRUE
[4,] FALSE FALSE FALSE  TRUE

Podemos continuar haciendo esto para números arbitrarios de dimensiones. Aquí hay un ejemplo en una matriz de cuatro dimensiones:

> bigarray = array(rbinom(32, 1, 0.5), dim=c(2,2,2,2))
> bigarray
, , 1, 1

     [,1] [,2]
[1,]    0    0
[2,]    0    0

, , 2, 1

     [,1] [,2]
[1,]    1    0
[2,]    0    0

, , 1, 2

     [,1] [,2]
[1,]    0    1
[2,]    0    1

, , 2, 2

     [,1] [,2]
[1,]    1    0
[2,]    1    1

> !bigarray
, , 1, 1

     [,1] [,2]
[1,] TRUE TRUE
[2,] TRUE TRUE

, , 2, 1

      [,1] [,2]
[1,] FALSE TRUE
[2,]  TRUE TRUE

, , 1, 2

     [,1]  [,2]
[1,] TRUE FALSE
[2,] TRUE FALSE

, , 2, 2

      [,1]  [,2]
[1,] FALSE  TRUE
[2,] FALSE FALSE

No funciona para los personajes, me temo.

> !"Hello world"
Error in !"Hello world" : Invalid argument type.
rturnbull
fuente
1
Para ahorrar en el envío de respuestas idénticas, esto también funciona en Julia (excepto que no funciona en la entrada numérica allí)
Sp3000
8

Perl 6 , 4 bytes

Versión "francesa" / Unicode:

!«*

Versión "Texas" / ASCII:

!<<*

La entrada es un valor único que puede tratarse como una lista.

Esto es aa Cualquiera que sea lambda ( *) con el operador lógico no prefijo ( !) combinado usando el prefijo hiper operador ( «) .

Efectivamente, esto es lo mismo que:

-> $_ { $_.values.hyper.map: &prefix:<!> }
# ( currently the Rakudo implementation doesn't actually do the 「.hyper」 call,
#   but prefix 「«」 is specifically designated for doing things in parallel )

Uso:

# pretend it's a method
say (True,False,True,True).&( !«* );
# (False True False False)

say ( !«* )( (False,False,True,False,False) );
# (True True False True True)


# give it a lexical name
my &list-invert = !«*;

#              v¯¯ a space is necessary here
say list-invert (True,False);
# (False True)

say (False,True).&list-invert;
# (True False)
Brad Gilbert b2gills
fuente
Solo estaba tratando de descifrar lo mismo. Solo llegué hasta {!«@_}:)
hobbs
!**también debería funcionar
Jo King
7

Laberinto , 9 bytes

,$:)%#$.,

Pruébalo en línea! Asume una entrada separada por nueva línea con una nueva línea final. Gracias a @MartinEnder por su ayuda con el golf.

Este programa es un poco extraño para un programa Labyrinth: no hace uso de la naturaleza 2D del lenguaje, y en realidad rebota de un lado a otro. En el primer viaje de ida, tenemos:

[Moving rightward]
,            Read char c of input
 $           XOR c with implicit 0 at bottom of stack
  :)%        Calculate c % (c+1), erroring out if c == -1 from EOF, otherwise returns c
     #$      XOR with (length of stack == 1)
       .     Output (c^1) as char
        ,    Read newline

[Moving leftward]
       .     Output newline
      $      XOR two implicit 0s, stack [0]
    %#       Mod with (length of stack == 1), giving stack [0]
 $:)         Increment, duplicate then XOR, stack still [0]
,            Read char c of input

La siguiente aparición de $XOR entonces el 0 existente en la pila con c, a diferencia de un 0 implícito en la parte inferior de la pila como en la primera ejecución. Ambas situaciones dejan la pila como [c], y el programa se repite a partir de entonces.

Alternativa de 9 bytes:

,:):/$.:,
,::)/)$.,
,:):%)$.,
Sp3000
fuente
2
Este efecto de avance hacia atrás es realmente genial.
DLosc
Me gusta esta respuesta Es feliz :)
Financia la demanda de Mónica el
6

Mathematica, 7 bytes

Not/@#&

o sin letras:

!#&/@#&

En cuanto al azúcar sintáctico: &marca el extremo derecho de una función sin nombre y tiene muy poca precedencia. #se refiere al primer argumento del más cercano y delimitador &. !es el operador para Not. Entonces, !#&es solo una función sin nombre que niega su argumento, en otras palabras, es idéntico al incorporado Not. /@es el operador para Map. Entonces el código también sería equivalente al algo más legible Map[Not, #]&.

Martin Ender
fuente
11
¿Cómo se !#&/@#&supone que debo leer eso? :)
Lynn
1
@ Lynn ¿Eso ayuda? :)
Martin Ender
44
Me sorprende que eso Notno sea listable
Un Simmons
@ASimmons Sí, yo también.
Martin Ender
6

Python, 27 25 24 bytes

Gracias a Lynn por jugar golf en dos bytes, y xnor y Mego por jugar golf en otro.

lambda a:[b^1for b in a]
Steven H.
fuente
1
Las matrices de 0/ 1están permitidas y 1-bes más corta que not b. Le pregunté al OP si se permiten matrices de 0/ -1, en cuyo caso ~bes aún más corto.
Lynn el
2
b ^ 1 también funciona.
xnor
@xnor Y eso en realidad sería mejor, porque entonces el espacio antes del forpodría ser eliminado.
Mego
No me di cuenta de que 1forse analizaría como dos fichas separadas. Huh, TIL.
Steven H.
6

C #, 19 bytes

como una función anónima, toma un bool [] y devuelve un IEnumerable

b=>b.Select(x=>!x);

o en 36 bytes con

dynamic f(bool[]b)=>b.Select(x=>!x);
hstde
fuente
5

Fórmula IBM / Lotus Notes, 2 bytes

!a

Uso:

Cree un formulario de Notas con dos campos llamados a y b.

a (entrada) = editable, número, valor múltiple, separados por comas

b (salida) = calculado, número, multivalor, separado por comas

Pegue la fórmula anterior en b y proporcione un valor predeterminado de 0.

Cree un nuevo documento con el formulario, ingrese una lista binaria en ay presione F9 para actualizar la salida.

Ejemplos:

ingrese la descripción de la imagen aquí

ingrese la descripción de la imagen aquí

ingrese la descripción de la imagen aquí

Funciona porque, dada una lista como entrada, la fórmula de Notes aplicará cualquier acción especificada a cada elemento de la lista.

ElPedro
fuente
2
Oh, Dios mío ... Mi compañía se alejó de las notas de loto; Tenía la esperanza de no volver a verlo nunca más. +1 por ese retroceso.
Magic Octopus Urn
Creo que muchas empresas son @carusocomputing y probablemente con razón. He estado trabajando con él durante más de 20 años y todavía me sorprende lo que el lenguaje de fórmulas puede hacer con las iteraciones de lista a veces. Es divertido abrir un diseñador de vez en cuando y ver cuánto puedo recordar :-)
ElPedro
5

J, 2 bytes

-.

Este es el verbo de negación.

Caso de prueba

   -. 0 1 0 0 1
1 0 1 1 0
Conor O'Brien
fuente
5

Swift 3 (7 bytes)

.map(!)

p.ej

[true, false].map(!)

Explicación

Parece bastante obvio. Llamadas mapen la matriz [true, false]. El único "problema" es que, en Swift, los operadores son solo funciones y se pueden pasar como argumentos. Esto significa que map(!)está pasando la función "no" !a map.

mklbtz
fuente
Una respuesta impresionantemente corta para un idioma que es terrible para jugar al golf. :)
DJMcMayhem
Siento que violé una regla o algo así. No estoy seguro de cómo se juzgan estos. : D
mklbtz
Esto es asombroso
JAL
5

Lenguaje de programación Shakespeare , 240 bytes

.
Ajax,.
Puck,.
Act I:.
Scene I:.
[Enter Ajax and Puck]
Puck:
Open your mind.Is hog as big as you?If so, let us return to scene II.You be sum of difference of zero and you and cat.Open thy heart!Let us return to scene I.
Scene II:.
[Exeunt]

Toma de entrada como una cadena de \0y \1caracteres de control. Salidas como una cadena de 0o 1. Si la entrada debe ser la misma que la salida, reemplace Open thy heartcon Speak thy mindpor ningún cambio en ByteCount. Si \0y \1no se pueden utilizar, hacer lo anterior, sino también sustituir Open your mindcon Listen to thy heartuna pena de 5 bytes.

Sin golf:

The Invertion of Veronan Arrays.

Romeo, who stores the element.
Juliet, who lectures him.

Act I: In which an array is inverted.

Scene I: A silent entrance.

[Enter Romeo and Juliet]

Scene II: In which Juliet pours out her heart to Romeo.

Juliet:
  Open your mind. Is nothing better than thee? If so, let us proceed to scene III. 
  Thou art as good as the sum of the difference between nothing and thee and my 
  cat. Open your heart! Let us return to scene II.

Scene III: Finale.

[Exeunt]

Esto se traduce aproximadamente al siguiente pseudocódigo C:

int romeo;

Scene1:
romeo = getchar();
if (0 > romeo) goto Scene2;
romeo = 0 - romeo + 1;
printf("%d", romeo);
goto Scene1;

Scene2:;

Estoy usando este intérprete . Ejecución de muestra:

$ python splc.py invert.spl > invert.c
$ gcc invert.c -o invert.exe
$ echo -ne "\x00\x01\x00" | ./invert
101
Cobre
fuente
4

JAISBaL , 1 byte

!

Como todas las otras respuestas de 1 byte, este es el operador de negación, que puede operar sobre una matriz si es necesario. Esto deja la salida en la pila, que se imprime al final del programa.

Para dos bytes, la matriz se puede imprimir explícitamente:

La entrada está en el formato de matriz increíblemente extraño de JAISBaL (que inventé, pero no me gusta ...).

Casos de prueba (Salida del intérprete de Java, 3.0.5):

Enter a value > [true][false]


--------------------
Stack: [[false, true]]
Locals: {}
----------------------------------------
Enter a value > [false][false][true][false][false]


--------------------
Stack: [[true, true, false, true, true]]
Locals: {}
Fénix Socrático
fuente
4

PowerShell, 15 bytes

$args[0]|%{!$_}

Creo que esto incluso puede funcionar en v1, por lo tanto, dejé el número de versión fuera del título. Recorre la entrada $argsy niega cada elemento por turno. Esa matriz resultante se deja en la tubería.

Sin embargo, lo bueno es que PowerShell es tan flexible en sus requisitos de conversión que puede hacer una entrada completamente mixta y obtener una salida booleana adecuada. Por ejemplo, aquí están los valores booleanos literales $false/ $true, los números 0 1y 123456789como enteros, una cadena vacía, una cadena no vacía, una matriz vacía y una matriz no vacía:

PS C:\Tools\Scripts\golfing> .\invert-a-boolean-array.ps1 @($false,$true,0,1,123456789,'','foo',@(),@(1,1))
True
False
True
False
False
True
False
True
False
AdmBorkBork
fuente
4

Perl, 7 bytes

Incluye +2 para -lp

Dé a cada valor booleano como 0 o 1 en su propia línea

invert.pl
1
1
0
^D

invert.pl:

#!/us/bin/perl -lp
$_^=1
Ton Hospel
fuente
3

Cheddar, 10 bytes

@.map((!))

Espero haber contado bien mientras escribo desde el teléfono

Downgoat
fuente
1
Creo, de manera equivalente, fn.vec((!))si alguna vez se lanzó: P
Conor O'Brien
3

Java, 58 bytes

void f(boolean[]a){for(boolean i:a)System.out.print(!i);}
Nudo numérico
fuente
Formas de golf: cambie arra a(ahorra 4 bytes), escriba en int[]alugar de int a[](ahorra 1 byte),
Olivier Grégoire
¡Uy! ¿Cómo lo olvido ?, qué loco estoy. y gracias @ OlivierGrégoire
Numberknot
3

brainfuck (58 bytes)

-[>+<-----]>--->,[<[->->+<<]>[--<]>[>]<[-<+<+>>]<+.[-]<>,]

Pruébalo aquí

Sin golf

-[>+<-----]>---     Number 48 (stands for 0)
>,                  Read in first point
[               
    <[->->+<<]      Subtract 1 from 48 flag, subtract 1 from read data, add 1 for new flag
    >           
    [--<]           If sitting on 1 (true) subtract 2 and move left)
        >[>]<       Move to 48 flag
        [-<+<+>>]   Add 48 to data point
        <+.[-]<     Add 1 move print, zero cell, move to new 48 cell
        >,          Read in next point
]                   Loop if input remaining

Toma una entrada de 1s o 0s no divididos (11001).

gtwebb
fuente
3

Logicode , 9 8 bytes

out!binp

Simple, de verdad.

Toma la entrada como una cadena binaria, ya que Logicode no tiene soporte para listas (por [true, false]lo que sería10 ).

los out emite el resultado de la línea.

El !comando calcula el NOT de cada bit en la cadena, por lo que algo así !111sería 000.

La binpentrada es binaria.

1 byte guardado gracias a @daHugLenny

clismique
fuente
Creo que puedes eliminar el espacio entre outy !binp.
acrolith el
@daHugLenny Huh, no sabía que pudieras hacer eso. ¡Gracias!
clismique
2

Japt, 3 bytes

¡!X

Japt no tiene entrada booleana, por lo que la entrada es una matriz de 0s y 1s. ¡Pruébelo en línea!

Cómo funciona

¡    // Map each item X in the input to
 !X  //  the boolean NOT of X.
     // Implicit output
ETHproducciones
fuente
2

Python 2, 24 bytes (no competitivos)

lambda a:[i-1for i in a]

La lógica es similar a la de Steven, pero traté de usar la idea de este comentario, pero diferente, porque todavía toma 0/ 1arrays, no 0/ -1. No hay afeitado de bytes para usar 0/ -1, así que seamos cuerdos. Tenga en cuenta que esto no es competitivo, hasta que Steven o Lynn me permitan usar la idea. Si es así, podría eliminar la marca no competitiva. Tenga en cuenta que este código no se puede robar descaradamente, todavía está aquí. Solo Steven puede usarlo para su respuesta.

Erik el Outgolfer
fuente
2

Rubí, 14 bytes.

Función anónima:

->a{a.map &:!}

Pruébalo:

->a{a.map &:!}.call([true, true, false, true, false, true, true])
# => [false, false, true, false, true, false, false]
daniero
fuente