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.


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:



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. :-)



7

Javascript, 23 bytes

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

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


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



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!


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?


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!


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

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!


2

Java 8, 31 27 bytes

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

-4 bytes gracias a @ OlivierGrégoire .

Pruébalo aquí


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







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");
}


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

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.


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.


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í :)


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


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!


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.


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


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


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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.