El booleano redundante

19

Introducción

Clásicamente, los booleanos son un bit; trueo false, 1o 0. Los ceros a la izquierda serían redundantes. Por ejemplo, 001significa lo mismo que 00001o simplemente 1.

El booleano de 32 bits

Dado un valor verdadero / falso, genera el booleano equivalente de 32 bits como una cadena. (O como un número si, por alguna razón, su idioma admite ceros a la izquierda).

Su programa no tiene que funcionar para todos los tipos de verdad / falsedad, solo para lo que su lenguaje de programación funciona mejor.

Ejemplo de E / S

Input >> Output

truthy >> 00000000000000000000000000000001
falsey >> 00000000000000000000000000000000

Este es el , por lo que gana los bytes más bajos.

Graviton
fuente
66
¿Necesitamos manejar cualquier posible valor verdadero o falso, o simplemente booleanos?
xnor
Si mi idioma admite tipos y tiene booleano, ¿puedo usar 1 (int) como verdadero?
LiefdeWen
@LiefdeWen, por supuesto
Graviton
1
Ya no se duplica ya que las entradas de verdad / falsedad pueden ser diferentes para cada respuesta / idioma.
Graviton
No veo por qué, pero eh, está bien ~
V. Courtois

Respuestas:

10

Python 3 , 33 25 18 15 bytes

Gracias @ jurjen-bos por el __mod__consejo.

'%.32d'.__mod__

Pruébalo en línea!

wrymug
fuente
Funcionaria lambda b:'%0.32d'%b?
ბიმო
Oh, ¿es None verdad o falso ?
ბიმო
@BruceForte Falsey
wrymug
1
también 25 bytes, pero para python3.6 +: lambda b:f'{bool(b):032}'olambda b:f'{not b<1:032}'
Felipe Nardi Batista
1
Puede guardar 1 byte eliminando el cero inicial 0.32d.
GarethPW
9

Código de máquina x86-16 (DOS), 16 bytes

B4 02          mov  ah,  2
B2 30          mov  dl, '0'
B9 1F 00       mov  cx, 31

            PrintZeros:
CD 21          int  0x21
E2 FC          loop PrintZeros

00 CA          add  dl, bl
CD 21          int  0x21
C3             ret

La función anterior recibe un valor booleano (0 == falsey, 1 == verdad) en el BLregistro (byte bajo de BX) e imprime una cadena "booleana redundante" en la salida estándar.

Funciona invocando una interrupción (0x21) para realizar una llamada a la función de DOS (seleccionada mediante la configuración AHde 2) que imprime un solo carácter (entrada DL) en la salida estándar.

Primero, se carga el carácter ASCII '0' DL, el contador ( CX) se establece en 31 y se repite para imprimir los bytes "redundantes". Luego, el valor booleano de entrada se agrega a DL(si BLes falsey, agregar 0 dejará DLsin cambios como ASCII '0'; si BLes verdadero, DLse incrementará en uno a ASCII '1'), y se imprimirá el byte final.

La función no devuelve un valor.

Bastante decente para un lenguaje que realmente no hace cadenas.


Programa completo, 21 bytes

Si desea convertirlo en un programa completo, solo se requieren 5 bytes más. En lugar de pasar la entrada en un registro, esto lee la entrada de los argumentos pasados ​​en la línea de comando al invocar la aplicación. Un argumento de 0 se interpreta como falsey, como lo es la falta total de argumentos; Un argumento mayor que 0 se interpreta como verdadero.

Simplemente ensamble el siguiente código como un programa COM y luego ejecútelo en la línea de comando.

B4 02            mov   ah,  2
B2 30            mov   dl, '0'
B9 1F 00         mov   cx, 31

               PrintZeros:
CD 21            int   0x21
E2 FC            loop  PrintZeros

3A 16 82 00      cmp   dl, BYTE PTR [0x82]  ; compare to 2nd arg, at offset 0x82 in PSP
D6               salc                       ; equivalent to sbb al, al
28 C2            sub   dl, al
CD 21            int   0x21
C3               ret                        ; you can simply 'ret' to end a COM program

Salida de muestra:

C:\>bool.com
00000000000000000000000000000000
C:\>bool.com 0
00000000000000000000000000000000
C:\>bool.com 1
00000000000000000000000000000001 
C:\>bool.com 2
00000000000000000000000000000001
C:\>bool.com 7
00000000000000000000000000000001

¿Como funciona? Bueno, es básicamente lo mismo, hasta llegar a las CMPinstrucciones. Esto compara el argumento de la línea de comandos con el valor del DLregistro (que, recuerda, contiene un ASCII '0'). En un programa COM, los bytes de código se cargan en el desplazamiento 0x100. Precedente es el prefijo de segmento de programa (PSP) , que contiene información sobre el estado de un programa DOS. Específicamente, en el desplazamiento 0x82, se encuentra el primer argumento (en realidad el segundo, ya que el primero es un espacio) que se especificó en la línea de comando cuando se invocó el programa. Entonces, solo estamos comparando este byte con un ASCII '0'.

La comparación establece los indicadores, y luego la SALCinstrucción (un código de operación no documentado antes del Pentium, equivalente a sbb al, al, pero solo 1 byte en lugar de 2) se establece ALen 0 si los dos valores eran iguales, o -1 si eran diferentes. Es entonces evidente que cuando se resta ALde DL, esto resulta en ASCII '0' o '1', según el caso.

(Tenga en cuenta que, irónicamente, lo romperá si pasa un argumento con un 0 01inicial en la línea de comando, ya que solo se ve en el primer carácter. Por lo tanto , se tratará como falsey. :-)

Cody Gray
fuente
8

Python 3 , 23 bytes

lambda n:'0'*31+'01'[n]

Pruébalo en línea!

C McAvoy
fuente
8
'10'[not n]sería suficiente si esos necesitan ser apoyados.
Anders Kaseorg
'{:032}'.formatpara 15 bytes y funciona igual que su solución actual
Felipe Nardi Batista
@rosslh bool(n)sería suficiente
Felipe Nardi Batista
7

Javascript, 23 bytes

a=>'0'.repeat(31)+ +!!a

!!a coacciona a en booleano, que el plus unario se convierte en int.

SuperStormer
fuente
a=>'0'.repeat(31)+(+a)es un byte más corto.
Kritixi Lithos
@Cowsquack que falla en cadenas, matrices vacías, NaN, funciones y otros valores donde la coerción en un número no resulta en 0 o 1
SuperStormer
también objetos vacíos, matrices, infinito e indefinido
SuperStormer
1
... pero ahora ...Your program doesn't have to work for every truthy/falsy type, only what your programming language work best for.
edc65
1
a=>'0'.repeat(31)+~~afunciona con verdadero, falso, 1,0
edc65
6

V , 8 bytes

32é0Àñl

Pruébalo en línea!

Explicación:

32é0            " Insert 32 '0's
    Àñ          " Arg1 times...
      <C-a>     "   Increment the number under the cursor
           l    "   Move one char to the right. This will break the loop since there is 
                "   no more room on this line
DJMcMayhem
fuente
5

Neim , 6 5 bytes

ᛝΨβ_I

Pruébalo en línea!

Explicación:

 ᛝ        # Constant 31
  Ψ       # Apply next token to all in list
    β     # Constant 0
     _    # Push each element to stack
      I   # Take Line of input.

Guardado un byte gracias a Okx

LiefdeWen
fuente
5 bytes -ᛝΨβ_I
Okx
no está en el wiki, ¿dónde lo encontraste?
LiefdeWen
1
Está en la lista de variables
Okx
@ Ok Ok, gracias por el consejo.
LiefdeWen
4

Octava , 17 bytes

@(n)dec2bin(n,32)

Función anónima. Funciona en MATLAB también.

Pruébalo en línea!

Luis Mendo
fuente
1
Seré condenado ...
Stewie Griffin
4

ArnoldC , 369 bytes

IT'S SHOWTIME
HEY CHRISTMAS TREE A
YOU SET US UP 0
GET YOUR ASS TO MARS A
DO IT NOW
I WANT TO ASK YOU A BUNCH OF QUESTIONS AND I WANT TO HAVE THEM ANSWERED IMMEDIATELY
BECAUSE I'M GOING TO SAY PLEASE A
TALK TO THE HAND "00000000000000000000000000000001"
BULLSHIT
TALK TO THE HAND "00000000000000000000000000000000"
YOU HAVE NO RESPECT FOR LOGIC
YOU HAVE BEEN TERMINATED

Pruébalo en línea!

TemporalWolf
fuente
2
Bienvenido a PPCG!
Stephen
4

Brainfuck , 61 60 36 bytes

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

Estoy seguro de que hay una forma inteligente de no moverse tanto con los punteros.

Yo tenía razón. Había. ¡Gracias a @Graviton por darme la idea!

Siguiente paso: ¡Obtenga los valores 32 y 48 más rápido!

Pruébalo en línea!

++++        - Increment 1st slot by 4
[           - Loop until 4 becomes 0
    >++++   - Add 4 to 2nd slot
    <-      - Decrement loop
]           - At this point, we point to slot 1 and slot 2 contains 16, which is the Greatest Common Divisor of 48 (value 0 in ASCII) and 32 (final length of answer)
>           - Point to value 16 (slot 2)
[           - Start loop to get our target values 32 and 48
    >++     - Point to slot 3 and multiply 16 by 2 = 32
    >+++    - Point to slot 4 and multiply 16 by 3 = 48
    <<-     - Decrement the loop so that slot 2 becomes 0
]           - We now point slot 2
>-          - Move to slot 3 and remove one so we can spam (output) 31 zeroes
[           - Start outputting until slot 3 is empty
    >.      - Move to slot 4 where our ASCII value for 0 is
    <-      - Decrement the loop so that slot 3 becomes 0
]           - We are now at slot 3 and it is empty.
,.          - We can now gather input from the user and output it.

Fue divertido para un primer golf!

Ha llegado demasiado tarde ahora. ¿Qué estoy haciendo?

Raphaël Côté
fuente
Gracias a la entropía, lo hice 1 byte más corto para llegar al número 16.
Raphaël Côté
Solo por diversión, aquí hay una versión de 60 bytes: >-[-[-<]>>+<]>--<<-[>+<-----]>--->[-<.>],.(toma la entrada como 0 o 1) ¡ Pruébelo en línea!
Graviton
Bueno, muchas gracias @Graviton. Me hiciste darme cuenta de que estaba poniendo demasiado esfuerzo en dejar caer el valor ASCII a 0 mientras solo tenía que generarlo.
Raphaël Côté
3

Scala, 32 bytes

Lo siento, pero me vi obligado a hacerlo en 32 bytes> _ <

var s=t
for(u<-0 to 30)s="0"+s
s

Está encerrado por una función que toma tcomo parámetro (como un stringque puede ser "0" o "1" para resp. Falsedad o verdad), y sse devuelve.

¡Pruébelo en línea!

Respuesta válida: Scala, 46 bytes.

Igual que mi respuesta de Java, se suponía que debía tomar un valor booleano para el parámetro. Entonces :

var s=if(t)"1"else"0"
for(u<-0 to 30)s="0"+s
s

¡Pruébelo en línea!

V. Courtois
fuente
3

Braingolf , 10 8 bytes

#␟>[0_]N

Pruébalo en línea!

es un separador de unidad, ASCII 0x1Fo 31. No se puede encontrar el carácter real para pegar en TIO, por lo que TIO en su lugar usa # 1-, lo que empuja el espacio (32) y disminuye a 31.

Explicación

#␟>[0_]N  Implicit input from commandline args
#␟        Push unit separator (31)
   >       Move top item to bottom of stack
    [..]   Loop, runs 31 times
     0_    Print 0
        N  Boolean conversion, truthy values become 1, falsey values become 0
           Implicit output of top of stack
Skidsdev
fuente
Aquí está el enlace tio con el personaje 0x1F en él TIO
PunPun1000
@ PunPun1000 ¡Oh, gracias! Actualizaré la publicación
Skidsdev
2

Octava , 23 bytes

@(x)[48+[!(1:31),x],'']

Pruébalo en línea!

Esto es más corto que todos los enfoques que probé printf. Sin embargo, podría haber perdido algo, ya que hice esto en mi teléfono.

Solo un byte más

@(x)[dec2bin(0,31),x+48]

Esto podría ser 18 bytes si pudiera tomar 1/0 como cadenas.

@(x)[48+!(1:31),x]

Pruébalo en línea!

Stewie Griffin
fuente
2

Java 8, 31 27 bytes

b->"".format("%032d",b?1:0)

-4 bytes gracias a @ OlivierGrégoire .

Pruébalo aquí

Kevin Cruijssen
fuente
1
Sí, todavía estoy aquí para superarlo:; "".format)
Olivier Grégoire
1
@ OlivierGrégoire ¡Eso fue todo! Maldición, soy estúpido ... xD Cuando estaba escribiendo String.format, sabía que de alguna manera había una forma más corta, pero pensé que probablemente usé una variable de cadena la última vez ... Gracias. ;)
Kevin Cruijssen
2

Ruby, 21 bytes

Sí, ese espacio necesita estar allí ...: /

->x{"%032b"%(x ?1:0)}

En Ruby todo excepto falsey niles verdad; Pruébalo en línea!

daniero
fuente
1

Mathematica, 36 bytes

""<>ToString/@PadLeft[{Boole@#},31]&

Mathematica, 26 bytes

Row@PadLeft[{Boole@#},31]&

Pruébalo en línea!

J42161217
fuente
1

Carbón de leña , 5 bytes

×0³¹S

Pruébalo en línea! (Enlace a la versión detallada).

Como Charcoal entiende 0y 1como Trueo False, esto solo imprime 31 0sy la entrada ( 0o 1) como una cadena.

Charlie
fuente
: P Eso es correcto , pensé que hice que las variables se encadenaran a True, sin embargo, extraño
solo ASCII
1

C, 26 bytes

Prácticamente la misma idea que la solución de 1bluestone , pero en C es más corta y funciona correctamente para cualquier entrada entera:

f(a){printf("%032i",!!a);}

Por supuesto, esto incluye algunas variables / funciones escritas implícitamente como lo hacen todas las buenas respuestas de C-golf ... El !!operador es la forma más corta de convertir cualquier valor verdadero 1en C (a través de la negación doble, !se define para devolver 1o0 ).

Prueba con:

#include <stdio.h>
f(a){printf("%032i",!!a);}
int main() {
    f(0), printf("\n");
    f(1), printf("\n");
    f(2), printf("\n");
    f(-1), printf("\n");
}
cmaster - restablecer monica
fuente
1

Haskell , 37 32 bytes

(('0'<$[1..31])++).show.fromEnum

Pruébalo en línea!

Gracias @nimi por -5bytes!

ბიმო
fuente
2
show(fromEnum x)en lugar de last(...). Pointfree aún más corto: (('0'<$[1..31])++).show.fromEnum.
nimi
@nimi No sabía que Booles un Enum, gracias!
ბიმო
1

PHP, 28 bytes

<?=str_pad($argv[1],32,0,0);

Guardar como bool.php y ejecutar:

$ php bool.php 0
00000000000000000000000000000000
$ php bool.php 1
00000000000000000000000000000001
Jared Mellentine
fuente
3 bytes más cortos: printf('%032d',$argv[1]);(requiere la -rbandera).
user63956
1

Ly , 20 15 13 bytes

65*1+[0u1-]nu

EDITAR: Guardado 5 bytes gracias a los ovs.
EDITAR: guardó otros 2 bytes imprimiendo 0 como un número en lugar de un carácter.

LyricLy
fuente
Funcionaria 65*1+["0"o1-]nu?
ovs
1

Octava, 16 11 bytes

@(x)x(1:32)

Pruébalo en línea!

Una función de manejo que toma "00000000000000000000000000000001"como veraz y "00000000000000000000000000000000\0"falsey.

Explicación:

En Octave, una matriz se considera falsey si al menos uno de sus elementos es cero. El elemento 33 de la segunda cadena es un carácter con el valor ASCII de 0, por lo que puede considerarse como falsey.

rahnema1
fuente
1

Java, 40 caracteres, 40 bytes

Esto toma una cadena como parámetro, que no es correcto (el valor de Java falso / verdadero es forzado por OP a ser representado por un booleano).

c->{for(int i=0;++i<32;c=0+c);return c;}

¡Pruébelo en línea!

Respuesta válida: Java, 60 caracteres, 60 bytes.

c->{String k="";for(k+=c?1:0;k.length()<32;k=0+k);return k;}

¡Pruébelo en línea!

Sé que ya hay una respuesta Java que es más corta que esta, pero aún así :)

V. Courtois
fuente
Sí, la returndeclaración es parte de su código, por lo tanto, parte de su recuento de bytes. Pero su respuesta no cumple con las reglas: debe obtener unboolean entrada. "Verdad / falsedad" se traduce en Java comotrue ofalse , y nada más. Por lo tanto, no puede obtener un Stringparámetro de entrada.
Olivier Grégoire
Veo. Lo modificaré pronto. Gracias.
V. Courtois
1
No necesita poner el punto y coma final (; ). Además, puede acortar su código de esta manera:c->{String k="";for(;k.length()<31;)k+=0;return k+=c?1:0;} . losk+=c?1:0 es acortar k+(c?1:0).
Olivier Grégoire
@ OlivierGrégoire Gracias, pero ¿por qué no es obligatorio el punto y coma final?
V. Courtois
1
Es obligatorio, en el código, pero no en el fragmento. En el TIO, el pie de página simplemente puede comenzar con; . Una declaración requiere un punto y coma. Una lambda no es una declaración.
Olivier Grégoire
1

Japt , 13 11 bytes

?1:0 ¤i31ç0

Explicación:

?1:0 ¤i31ç0
?              // If the input is a truthy, return:
 1             //   1
  :0           //   Else, 0
     ¤         // Convert to a base-2 string
      i        // Insert at index 0:
       31ç0    //   A string filled with 0s, length 31

¡Guardado un byte usando una conversión de base 2 incorporada!

Para insertar la cadena de 0s delante de 1/ 0, necesito convertir el 1y 0en una cadena. La forma típica de hacerlo sería 1s (3 bytes). Pero debido a que solo estamos convirtiendo 1s y 0s, puedo usar la base-2 incorporada (2 bytes).


La entrada puede tener la forma de un entero o una cadena.

0y ""son falsas en Japt.

Pruébalo en línea!

Banco de pruebas

Oliver
fuente
1

C # (.NET Core) , 29 bytes

a=>new string('0',31)+(a?1:0)

OP dijo que 1/0 se puede usar para verdadero / falso, por lo que puede hacer a un int y se convierte

a=>new string('0',31)+a

Sin embargo, C # realmente no tiene verdadero / falso así que no usaré esta respuesta.

Pruébalo en línea!

LiefdeWen
fuente
1
No creo que el segundo sea válido. Los enteros no son ni verdaderos ni falsos en C #, solo lo son los bools.
Skidsdev
@Mayube, pregunté y OP dijo que está bien, pero estoy un poco de acuerdo contigo, así que editaré.
LiefdeWen
1
Molesto Padleftentra en el mismo recuento de bytes aquí.
TheLethalCoder
@TheLethalCoder también comenzó con PadLeft :)
LiefdeWen
2
No estoy seguro de si esto es posible, pero interpolated stringspuede ser bastante útil aquí:b=>$"{(b?1:0):D32}" 19 bytes
auhmaan
1

MI , 10 9 bytes

𝕫BṄiℑpέ←←

Pruébalo en línea!

Explicación (página de códigos [con razonamiento detrás del carácter] / código hexadecimal):

𝕫: 1A - Push an integer from STDIN (lowercase integers)
B: 0B - Push 11 (B is 11 in hex)
Ṅ: 36 - Pop n; push the nth prime, 11th prime is 31 (Ṅ-th)
i: 49 - Pop n; push [1,...,n] (index/iota)
ℑ: 34 - Pop n; push imag(n) (ℑmaginary part, applied to each element, which gives 0 for real numbers)
p: 60 - Pop n; push stringified n (0=>"0" ... 35=>"Z", the b in base upside down)
έ: 56 - Pop n; push n joined by "" (έmpty string)
←: 26 - Pop n; output n with no newline (out←in)
←: 26 - Pop n; output n with no newline (out←in)

¡No puedo creer que esto sea posible sin ningún comando de dos argumentos!

Editar: guardado 1 byte usando primos en lugar de aritmética para obtener 31.

Zacharý
fuente
0

APL, 11 bytes

⍕¯32↑1↑1\⍨⊢

¿Cómo?

1\⍨⊢ - repita 1 veces de entrada - devuelva una matriz vacía en valor falso

1↑ - toma el primer artículo

¯32↑ - alinear a la derecha con 31 ceros

- formatear como cadena

Uriel
fuente
Simplemente ⍕¯32↑⊢debería funcionar
Kritixi Lithos
1
@Cowsquack y Uriel Ninguno de los dos trabaja, ya que incluyen espacios. Necesitas ∊⍕¨¯32↑⎕o algo.
Adám
0

J, 11 bytes

(31#'0'),":

Pruébalo en línea!

¿cómo?

31 zeros
00...000  append     turn the 0 or 1 input into string
(31#'0')    ,       ":

nota: en J, los booleanos son 0 o 1, también conocido como "la convención de iverson", después de ken iverson, creador de J y APL

Jonás
fuente
Entiendo que 1 y 0 son booleanos en J, pero solo está agregando la entrada a 31 0s. ¿No debería haber alguna forma de validación booleana?
Oliver
@Oliver El problema especifica "Dado un valor verdadero / falso ...", así que no, no creo que deba validar ... Además, tenga en cuenta que ":es necesario para que esto funcione: cambia un valor booleano a una cadena .
Jonás