El modismo "Do False"

47

Hacer mientras sea falso

Hoy, en el trabajo, uno de mis colegas describía el caso de uso de do while (falso). La persona con la que estaba hablando pensó que esto era una tontería y que si las declaraciones serían mucho mejores. Luego procedimos a perder la mitad de nuestro día discutiendo la mejor manera de escribir algo equivalente a:

do
{
   //some code that should always execute...

   if ( condition )
   {
      //do some stuff
      break;
   }

   //some code that should execute if condition is not true

   if ( condition2 )
   {
       //do some more stuff
       break;
   }

   //further code that should not execute if condition or condition2 are true

}
while(false);

Este es un idioma que se encuentra en c con bastante frecuencia. Su programa debe producir el mismo resultado que el pseudocódigo siguiente, según las condiciones.

do
{
   result += "A";

   if ( C1)
   {
      result += "B";
      break;
   }

   result += "C"

   if ( C2 )
   {
       result += "D";
       break;
   }

   result += "E";

}
while(false);

print(result);

Por lo tanto, la entrada podría ser:

1. C1 = true, C2 = true
2. C1 = true, C2 = false
3. C1 = false, C2 = true
4. C1 = false, C2 = false

y la salida debería ser:

1. "AB"
2. "AB"
3. "ACD"
4. "ACE"

Este es el código de golf, por lo que las respuestas se juzgarán por bytes. Las lagunas estándar están prohibidas.

Sí, esta es simple, pero esperamos ver algunas respuestas creativas, espero que la simplicidad aliente a las personas a usar idiomas con los que tienen menos confianza.

Hombre riendo
fuente
¿La salida tiene que ser mayúscula o también se permite minúscula?
Adnan
77
Como un aparte para el debate con su compañero de trabajo, me parece que podría lograr lo mismo utilizando un método return resulten lugar de break. Luego obtienes los bonos de reutilización y simplifica el código de llamada también. Pero tal vez me estoy perdiendo algo.
jpmc26
3
No sabía que esto era un idioma en C ...
Mehrdad
55
@Mehrdad, algunas personas hacen esto en lugar de hacerlo gotoporque usar gotoes una mala forma :)
Seth
2
La única vez que he usado do{}while(false)es dentro de macros. Un simple ifno es suficiente, porque interactúa mal con elses alrededor que pueden estar presentes. Sin una macro, también puede eliminar el doy while.
nwp

Respuestas:

19

Pitón 3, 31

Guardado 1 byte gracias a xnor.

Solo un byte de distancia de ES6. : / Stupid Python y su larga sintaxis de función anónima.

¡Hurra por una camisa!

lambda x,y:x*"AB"or"AC"+"ED"[y]

Casos de prueba:

assert f(1, 1) == "AB"
assert f(1, 0) == "AB"
assert f(0, 1) == "ACD"
assert f(0, 0) == "ACE"
Morgan Thrapp
fuente
77
Si vuelve a ordenar x*"AB", puede guardar el espacio después.
xnor
2
Lo sentimos, su sintaxis de función larga y anónima será la muerte de Python: P
Conor O'Brien
55
@ CᴏɴᴏʀO'Bʀɪᴇɴ Sabía que algo tenía que estar frenando a Python. Presentaré un PEP lo antes posible.
Morgan Thrapp
2
Haz eso, y ordenaré trampas para serpientes
Conor O'Brien
99
Un PEP para hacer λun sinónimo de lambdasería genial :)
Robert Grant
13

JavaScript ES6, 30 26 25 bytes

Una función anónima simple que toma dos entradas. Asignar a una variable para llamar. Actualización : saltemos al carro del índice. Ahorra 4 bytes. He asegurado mi ventaja sobre Python . Guardado un byte al curry la función; llamar como (...)(a)(b). Gracias Patrick Roberts!

a=>b=>a?"AB":"AC"+"ED"[b]

Versión original anterior, 30 bytes (incluida para no fundirse en la respuesta de Python (;):

(a,b)=>"A"+(a?"B":b?"CD":"CE")
Conor O'Brien
fuente
Esto no es tan inteligente ...
theonlygusti
15
@theonlygusti Este es un código de golf, no un concurso de popularidad. Además, ¿por qué desperdiciar bytes siendo inteligentes si hay una solución más concisa?
Conor O'Brien
Me gusta tu elección de nariz:b?
J Atkin
@JAtkin De hecho!
Conor O'Brien
44
Puede guardar un byte con curry
Patrick Roberts
13

C preprocesador macro, 34

  • 1 byte guardado gracias a @TobySpeight
#define f(a,b)a?"AB":b?"ACD":"ACE"

Pruébalo en línea .

Trauma digital
fuente
9

Haskell, 28 bytes

x#y|x="AB"|y="ACD"|1<2="ACE"

Ejemplo de uso: False # True-> "ACD".

Usando los valores de entrada directamente como guardias.

nimi
fuente
9

MATL , 15 17 bytes

?'AB'}'AC'69i-h

Las entradas son 0o 1en líneas separadas. Alternativamente, 0puede ser reemplazado por F(MATL's false) y 1por T(MATL's true).

Pruébalo en línea!

?           % if C1 (implicit input)
  'AB'      %   push 'AB'
}           % else
  'AC'      %   push 'AC'
  69        %   push 69 ('E')
  i-        %   subtract input. If 1 gives 'D', if 0 leaves 'E'
  h         %   concatenate horizontally
            % end if (implicit)
Luis Mendo
fuente
8

Brainfuck, 65 bytes

Esto supone que C1 y C2 se ingresan como 0 o 1 bytes sin formato. p.ej

echo -en '\x00\x01' | bf foo.bf

Golfizado:

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

Sin golf:

                                      Tape
                                      _0
++++++++[>++++++++<-]>+.+  print A    0 _B
>+>,                       read C1    0 B 1 _0  or  0 B 1 _1
[<-<.>>-]<                 print B    0 B _0 0  or  0 B _1 0
[<+.+>>                    print C    0 D 1 _0
    ,                      read C2    0 D 1 _0  or  0 D 1 _1
    [<-<.>>-]<             print D    0 D _0 0  or  0 D _1 0
    [<+.>-]                print E    0 D _0    or  0 E _0
]

Creo que vale la pena señalar que esta solución se basa en romper bucles while.

Rayo
fuente
7

GNU Sed, 21

/^1/cAB
/1$/cACD
cACE

Ideone .

Trauma digital
fuente
7

NTFJ , 110 bytes

##~~~~~#@|########@|~#~~~~~#@*(~#~~~~#~@*########@^)~#~~~~##@*##~~~~~#@|########@|(~#~~~#~~@*):~||(~#~~~#~#@*)

Más legible:

##~~~~~#@|########@|~#~~~~~#@*(~#~~~~#~@*########@^)~#~~~~##@*##~~~~~#@|########@|(~#~~~#~~@*
):~||(~#~~~#~#@*)

Eso fue ciertamente entretenido. Pruébelo aquí , usando dos caracteres ( 0o 1) como entrada.

Usando el método de ETHProduction para convertir a 0, 1 (caracteres) en bits, esto se vuelve más simple.

##~~~~~#@|########@|

Este es el método mencionado. Presionando 193 ( ##~~~~~#@), NANDING ( |) con el valor de entrada superior (en este caso, el primer código de caracteres, un 48 o 49). Esto produce 254 para 1 y 255 para 0. NANDAR con 255 ( ########@) produce un 0 o 1 bit de acuerdo con la entrada.

~#~~~~~#@*

Esto imprime un A, ya que toda la entrada comienza con A. *aparece Acuando se imprime, por lo que la pila no cambia desde su estado anterior.

(~#~~~~#~@*########@^)

Caso 1: el primer bit es 1, y (activa el código dentro. ~#~~~~#~@*imprime By ########@^empuja 255 y salta a esa posición en el código. Siendo este el final del programa, termina.

Caso 2: el primer bit es 0. (salta )y el código continúa.

~#~~~~##@*

Esto imprime un C, porque ese es el próximo personaje.

##~~~~~#@|########@|

Esto convierte nuestra segunda entrada a un bit.

(~#~~~#~~@*)

Si nuestro segundo bit es un 1, procedemos a imprimir un E.

:~||

Esta es la representación NAND de la negación de Boole de nuestro grano de arena: A NAND (0 NAND A) = NOT A.

(~#~~~#~#@*)

Esto ahora se activa si el bit era un 0, e imprime E.

Conor O'Brien
fuente
5

Pyth, 16 bytes

+\A?Q\B+\C?E\D\E

Banco de pruebas

¡Ternarios!

Explicación:

+\A              Start with an A
?Q\B             If the first variable is true, add a B and break.
+\C              Otherwise, add a C and
?E\D             If the second variable is true, add a D and break.
\E               Otherwise, add a E and finish.

Entrada en dos líneas consecutivas.

isaacg
fuente
3
Oh Pythmaster, haznos saber las formas de este programa. ;)
Conor O'Brien
5

CJam, 15 16 17 bytes

'Ali'B'C'Eli-+?

Pruébalo en línea!

Un byte desactivado gracias a @randomra, y un byte desactivado gracias a @Dennis

Explicación:

'A                  e# push "A"
  li                e# read first input as an integer
    'B              e# push "B" 
      'C            e# push "C"
        'E          e# push "E"
          li-       e# leave "E" or change to "D" according to second input
             +      e# concatenate "C" with "E" or "D"
              ?     e# select "B" or "C..." according to first input

Versión anterior (16 bytes):

'Ali'B{'C'Eli-}?

Explicación:

'A                  e# push character "A"
               ?    e# if-then-else
  li                e# read first input as an integer. Condition for if
    'B              e# push character "B" if first input is true
      {       }     e# execute this if first input is false
       'C           e# push character "C"
         'E         e# push character "E"
           li       e# read second input as an integer
             -      e# subtract: transform "E" to "D" if second input is true
                    e# implicitly display stack contents
Luis Mendo
fuente
55
Nuestros buenos amigos Ali y Eli!
Conor O'Brien
5

Pyth, 13 caracteres, 19 bytes

.HC@"૎્««"iQ2

Toma entrada en forma [a, b]

Explicación

               - autoassign Q = eval(input())
           iQ2 -    from_base(Q, 2) - convert to an int
   @"૎્««"    -   "૎્««"[^]
  C            -  ord(^)
.H             - hex(^)

Pruébalo aquí

O use una suite de prueba

Azul
fuente
2
Al menos en UTF-8, esto pesa 19 bytes.
Dennis
1
bytesizematters utiliza una forma completamente inventada de contar bytes, que no corresponde (y no puede ) corresponder a una codificación real. Cuenta las cosas cuadradas como 2 bytes cada una (3 bytes en UTF-8) y «como 1 byte cada una (2 bytes en UTF-8). Ambos wcy esto coinciden en que son 19 bytes.
Dennis
4

C, 76 bytes

Cambié el nombre c1a c, c2to Cy resultto r. Los programadores de C van a los extremos para evitar goto. Si alguna vez tienes un problema con una sintaxis absurda en C, lo más probable es que no lo hayas utilizado goto.

char r[4]="A";if(c){r[1]=66;goto e;}r[1]=67;if(C){r[2]=68;goto e;}r[2]=69;e:

Sin golf

char r[4] = "A";
if(c1){
    r[1] = 'B';
    goto end;
}
r[1] = 'C';
if(c2){
    r[2] = 'D';
    goto end;
}
r[2] = 'E';
end:
MegaTom
fuente
¿Puedes empezar con char r[4]="A";? Mi C está oxidada.
LarsH
¿No es esa una forma realmente ridícula de declarar un literal de cadena?
Tamoghna Chowdhury
@TamoghnaChowdhury Más o menos. Los literales de cadena no se pueden escribir. Es una matriz que luego se inicializa con la cadena literal "A". Como "A" solo establece los primeros dos bytes, el resto se inicializa según las reglas para objetos de duración estática (por lo tanto, 0 en este caso). [C99 6.7.8 / 22]
Rayo
1
Puede guardar 22 bytes cambiando la lista de inicialización "AC"y reemplazando todo de r[1]=67a r[2]=69;porr[2]=c2?68:69;
Ray
4

C, 41 bytes

No estoy seguro de si la pregunta requiere un programa, una función o un fragmento de código.
Aquí hay una función:

f(a,b){a=a?16961:4473665|b<<16;puts(&a);}

Obtiene la entrada en dos parámetros, que deben ser 0 o 1 (bueno, bdebe), e imprime en stdout.

Se establece aen uno de 0x4241, 0x454341o 0x444341. Cuando se imprime como una cadena, en un sistema ASCII little endian, proporciona la salida requerida.

Ugoren
fuente
4

R , 41 39 37 bytes

pryr::f(c("ACD","ACE","AB")[1+a+a^b])

Pruébalo en línea!

En R, TRUEy FALSEestán obligados a 1y 0respectivamente cuando intenta utilizarlos como números. Podemos convertir estos números a los índices 1, 2y 3por medio de la fórmula 1+a+a^b.

  a  |   b  | 1+a+a^b
TRUE | TRUE | 1+1+1^1 = 3
TRUE | FALSE| 1+1+1^0 = 3
FALSE| TRUE | 1+0+0^1 = 1
FALSE| FALSE| 1+0+0^0 = 2

Estos valores se utilizaron a continuación para índice de la lista ACD, ACE, ABpara producir la salida correcta.

Ahorró dos bytes gracias a JayCe.

Si en cambio prefiere una versión con una ifdeclaración, hay lo siguiente para 41 bytes:

pryr::f(`if`(a,"AB",`if`(b,"ACD","ACE")))

Pruébalo en línea!

rturnbull
fuente
@ JayCe Gracias, ¡he actualizado la respuesta!
rturnbull
3

Mathematica, 35 30 bytes

If[#,"AB",If[#2,"ACD","ACE"]]&

Muy simple. Función anónima.

LegionMammal978
fuente
3

Retina, 22 bytes

1.+
AB
.+1
ACD
.+0
ACE

Pruébalo en línea

andlrc
fuente
1
retina.tryitonline.net/… . Prefije ^con m`, para que funcione para la entrada de varias líneas, lo cual no es necesario para la pregunta, pero facilita las pruebas.
Trauma digital
Creo que puede ahorrar 3 bytes eliminando el espacio entre las dos entradas.
CalculatorFeline
3

JavaScript, 38 bytes

Utilice sin delimitador 0o en 1lugar de false/true

_=>"ACE ACD AB AB".split` `[+('0b'+_)]
username.ak
fuente
1
Puede usar en split` ` lugar desplit(" ")
andlrc
También puede usar en +('0b'+prompt())lugar deparseInt(prompt(),2)
andlrc
3

ArnoldC , 423 bytes

IT'S SHOWTIME
HEY CHRISTMAS TREE a
YOU SET US UP 0
HEY CHRISTMAS TREE b
YOU SET US UP 0
BECAUSE I'M GOING TO SAY PLEASE a
BECAUSE I'M GOING TO SAY PLEASE b
TALK TO THE HAND "ABD"
BULLSHIT
TALK TO THE HAND "ABE"
YOU HAVE NO RESPECT FOR LOGIC
BULLSHIT
BECAUSE I'M GOING TO SAY PLEASE b
TALK TO THE HAND "ACD"
BULLSHIT
TALK TO THE HAND "ACE"
YOU HAVE NO RESPECT FOR LOGIC
YOU HAVE NO RESPECT FOR LOGIC
YOU HAVE BEEN TERMINATED

Como ArnoldC no parece tener una entrada formal, simplemente cambie los primeros 2 YOU SET US UPvalores a 0 o 1.

Explicación

Esto es solo un montón de declaraciones condicionales que representan todas las salidas posibles. ¿Por qué, puedes preguntar? Bueno, ArnoldC realmente no tiene comprensión de cuerdas. ¡Ni siquiera puede concatenar cadenas! Como resultado, tenemos que recurrir al método más ... ineficiente ...

Kat
fuente
Er, la salida debería ser "AB" si a es verdadero, no "ABD" / "ABE". ¡Eso debería acortar tu código!
Toby Speight
3

Java, 28 bytes

La misma plantilla que muchas de las respuestas. tipo es BiFunction<Boolean,Boolean, String>.

(c,d)->c?"AB":d?"ACD":"ACE"
Andreas
fuente
Sé que han pasado casi dos años, pero (c,d)->se puede jugar golf por 1 byte c->d->cuando usas a java.util.function.Function<Boolean, java.util.function.Function<Boolean, String>>.
Kevin Cruijssen
2

Pyth, 21 bytes

@c"ACE ACD AB AB"diz2

Pruébalo aquí!

La entrada se toma como 0 o 1 en lugar de verdadero / falso mientras que C1 viene primero.

Explicación

Simplemente usando el hecho de que solo hay 4 resultados posibles. Funciona interpretando la entrada como binaria, convirtiéndola en base 10 y usándola para elegir el resultado correcto de la cadena de búsqueda.

@c "ACE ACD AB AB" diz2 # z = entrada

                  iz2 # Convertir entrada binaria a base 10
 c "ACE ACD AB AB" d # Cadena dividida en espacios
@ # Obtener el elemento en el índice
Denker
fuente
2

Y , 20 bytes

En el caso de que la primera entrada sea una, solo se toma una entrada. Supongo que este comportamiento está permitido. Pruébalo aquí!

'B'AjhMr$'C'E@j-#rCp

Sin golf:

'B'A jh M
   r$ 'C 'E@ j - # r
 C p

Explicado:

'B'A

Esto empuja a los personajes By luego Aa la pila.

jh M

Esto toma una entrada, la incrementa, la saca y se mueve sobre ese número de secciones.

Caso 1: j1 = 0. Este es el más interesante. r$invierte la pila y muestra un valor, 'C'Eempuja caracteres Cy E. @convierte Ea su contraparte numérica, resta la segunda entrada y la reconvierte en un carácter. rdeshace la pila. Luego, el programa ve el enlace C y se mueve al siguiente enlace pe imprime la pila.

Caso 2: el programa se mueve al último enlace p, que simplemente imprime la pila completa.

Conor O'Brien
fuente
2

PowerShell, 40 bytes

param($x,$y)(("ACE","ACD")[$y],"AB")[$x]

Matrices anidadas indexadas por entrada. En PowerShell, $true/ 1y $false/ 0son prácticamente equivalentes (gracias a un tipo de letra muy flojo), por lo que se indexa muy bien en una matriz de dos elementos. Esto es realmente tan cercano a un ternario como PowerShell, y lo he usado muchas veces en el golf.

Ejemplos

PS C:\Tools\Scripts\golfing> .\do-while-false.ps1 1 1
AB

PS C:\Tools\Scripts\golfing> .\do-while-false.ps1 1 0
AB

PS C:\Tools\Scripts\golfing> .\do-while-false.ps1 0 1
ACD

PS C:\Tools\Scripts\golfing> .\do-while-false.ps1 0 0
ACE
AdmBorkBork
fuente
2

K, 37 bytes

{?"ABCDE"@0,x,(1*x),(2*~x),(~x)*3+~y}
kirbyfan64sos
fuente
2

Vitsy , 26 bytes

Espera entradas como 1s o 0s a través de STDIN con una nueva línea de separación.

W([1m;]'DCA'W(Zr1+rZ
'BA'Z

De hecho, descubrí un problema grave con las declaraciones if durante este desafío. D: Esto se publica con la versión rota, pero funciona bien. (Actualizaré esto después de solucionar el problema) Tenga en cuenta que he actualizado Vitsy con una solución de if / ifnot. Este cambio no me otorga ninguna ventaja, solo una aclaración.

Explicación:

W([1m;]'DCA'W(Zr1+rZ
W                      Get one line from STDIN (evaluate it, if possible)
 ([1m;]                If not zero, go to the first index of lines of code (next line)
                       and then end execution.
       'DCA'           Push character literals "ACD" to the stack.
            W          Get another (the second) line from STDIN.
             (         If not zero, 
do the next instruction.
              Z        Output all of the stack.
               r1+r    Reverse the stack, add one (will error out on input 0, 1), reverse.
                   Z   Output everything in the stack.

'BA'Z
'BA'                   Push character literals "AB" to the stack.
    Z                  Output everything in the stack.

Pruébalo en línea!

Addison Crump
fuente
2

cera de abejas , 26 bytes

Interpretando 0como falso, 1como verdadero.

E`<
D`d"`C`~<
_T~T~`A`"b`B

Salida:

julia> beeswax("codegolfdowhile.bswx",0,0.0,Int(20000))
i1
i1
AB
Program finished!

julia> beeswax("codegolfdowhile.bswx",0,0.0,Int(20000))
i1
i0
AB
Program finished!

julia> beeswax("codegolfdowhile.bswx",0,0.0,Int(20000))
i0
i1
ACD
Program finished!

julia> beeswax("codegolfdowhile.bswx",0,0.0,Int(20000))
i0
i0
ACE
Program finished!

Clone mi intérprete de cera de abejas de mi repositorio de Github .

ML
fuente
Estoy bastante seguro de que no necesitas las citas.
undergroundmonorail
@undergroundmonorail: Bien, actualizaré mi solución. Gracias.
ML
2

C, 47 45 bytes

Como solo hay 3 resultados diferentes, podemos elegir una de tres cadenas como esta:

char*f(c,d){return"AB\0 ACE\0ACD"+(!c<<d+2);}

Gracias a Herman L por 2 bytes.

Manifestación

#include<stdio.h>
int main()
{
    printf("%s\n%s\n%s\n%s\n",
           f(1,1),
           f(1,0),
           f(0,1),
           f(0,0));
}
Toby Speight
fuente
1
-2 bytes:char*f(c,d){return"AB\0 ACE\0ACD"+(!c<<d+2);}
Herman L
enlace a TIO pls
solo ASCII
1

Perl, 23 bytes

say<>>0?AB:<>>0?ACD:ACE

Requiere el -E| -M5.010marca y toma la entrada como 1 y 0:

$ perl -E'say<>>0?AB:<>>0?ACD:ACE' <<< $'0\n0'
ACE
$ perl -E'say<>>0?AB:<>>0?ACD:ACE' <<< $'0\n1'
ACD
$ perl -E'say<>>0?AB:<>>0?ACD:ACE' <<< $'1\n0'
AB

Solución alternativa que requiere -py es 22 + 1 = 23 bytes:

$_=/^1/?AB:/1/?ACD:ACE
perl -pe'$_=/^1/?AB:/1/?ACD:ACE' <<< '0 1'
andlrc
fuente
say-<>?AB:-<>?ACD:ACEes dos bytes más corto.
nwellnhof
1

05AB1E , 23 20 bytes

Código:

Ii"AB"?q}"AC"?69I-ç?

Pruébalo en línea!

Adnan
fuente
1
Esta es probablemente una versión antigua de 05AB1E, pero ahora puede tener 14 bytes: i„ABë„AC69I-çJ Pruébelo en línea o verifique todos los casos de prueba .
Kevin Cruijssen
1
@KevinCruijssen ¡Agradable! Esta es de hecho una versión antigua de 05AB1E. El lenguaje tenía aproximadamente tres meses aquí (ni siquiera tenía una entrada implícita).
Adnan
1
Sí, de hecho ya estaba confundido sobre el liderazgo I. ; p
Kevin Cruijssen
1

Japt, 19 bytes

"A{U?'B:'C+(V?'D:'E

¡Pruébelo en línea!

Dato curioso: serían 16 bytes si no fuera por un error:

"A{U?"B:C{V?"D:E
ETHproducciones
fuente
Los errores son lo peor: |
Conor O'Brien
2
@ CᴏɴᴏʀO'Bʀɪᴇɴ Déjame ver si puedo desenterrar una versión anterior que no tenga este error. Entonces los 16 bytes serían legítimos.
ETHproductions
1
Cual es el error?
CalculatorFeline
@CalculatorFeline Creo que las cadenas anidadas como esa no se transpilan por alguna razón.
ETHproductions