O idioma "Faça enquanto falso"


47

Faça Enquanto Falso

Hoje, no trabalho, um dos meus colegas estava descrevendo o caso de uso do do while (false). A pessoa com quem ele estava conversando achou que isso era bobagem e simples, se as declarações fossem muito melhores. Em seguida, passamos a perder metade do dia discutindo a melhor maneira de escrever 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 é um idioma que é encontrado em c com bastante frequência. Seu programa deve produzir a mesma saída que o pseudocódigo abaixo, dependendo das condições.

do
{
   result += "A";

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

   result += "C"

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

   result += "E";

}
while(false);

print(result);

Portanto, a entrada pode ser:

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

e a saída deve ser:

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

Isso é código-golfe, então as respostas serão julgadas em bytes. As brechas padrão são proibidas.

Sim, essa é uma pergunta simples, mas espero que possamos ver algumas respostas criativas. Espero que a simplicidade incentive as pessoas a usar idiomas com os quais estão menos confiantes.


A saída deve estar em maiúsculas ou também em minúsculas?
Adnan

7
Como um aparte do debate com seu colega de trabalho, parece-me que você poderia realizar a mesma coisa usando um método return resultno lugar de break. Então você recebe os bônus de reutilização e simplifica também o código de chamada. Mas talvez eu esteja perdendo alguma coisa.
Jpmc26

3
Eu não sabia que isso era uma expressão idiomática em C ...
Mehrdad

5
@Mehrdad, algumas pessoas fazem isso em vez de gotousar gotomás formas :) #
Seth

2
A única vez que eu já usei do{}while(false)é dentro de macros. Um simples ifnão é suficiente, porque interage mal com elses ao redor que podem estar presentes. Sem uma macro, você também pode remover o doe while.
nwp 22/02

Respostas:


19

Python 3, 31

Economizou 1 byte graças ao xnor.

Apenas um byte de distância do ES6. : / Python estúpido e sua longa sintaxe de função anônima.

Viva um forro!

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

Casos de teste:

assert f(1, 1) == "AB"
assert f(1, 0) == "AB"
assert f(0, 1) == "ACD"
assert f(0, 0) == "ACE"

7
Se você solicitar novamente x*"AB", poderá economizar espaço depois.
Xnor

2
Desculpe, sua longa, sintaxe função anônima será a morte de python: P
Conor O'Brien

5
@ CᴏɴᴏʀO'Bʀɪᴇɴ Eu sabia que algo tinha que estar segurando o Python. Vou enviar um PEP o mais rápido possível.
Morgan Thrapp


9
A PEP para fazer λum sinônimo de lambdaseria ótimo :)
Robert Grant

13

JavaScript ES6, 30 26 25 bytes

Uma função anônima simples que recebe duas entradas. Atribua a uma variável a ser chamada. Atualização : Vamos pular na onda do índice. Ele salva 4 bytes. Eu garanti minha liderança sobre o Python . Salva um byte, currying a função; ligar como (...)(a)(b). Obrigado Patrick Roberts!

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

Versão antiga e original, 30 bytes (incluída para não derreter na resposta python (;):

(a,b)=>"A"+(a?"B":b?"CD":"CE")

Isto não é tão inteligente ...
theonlygusti

15
@theonlygusti Este é um concurso de código de golfe, não de popularidade. Além disso, por que desperdiçar bytes sendo inteligente se existe uma solução mais concisa?
Conor O'Brien

Eu gosto da sua escolha de nariz:b?
J Atkin

@JAtkin Indeed!
Conor O'Brien

4
Você pode salvar um byte com curry
Patrick Roberts


9

Haskell, 28 bytes

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

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

Usando os valores de entrada diretamente como guardas.


9

MATL , 15 17 bytes

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

As entradas são 0ou 1em linhas separadas. Como alternativa, 0pode ser substituído por F(MATL's false) e 1por T(MATL's true).

Experimente online!

?           % 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)

8

Brainfuck, 65 bytes

Isso pressupõe que C1 e C2 sejam inseridos como 0 ou 1 bytes brutos. por exemplo

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

Golfe:

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

Ungolfed:

                                      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
]

Acredito que vale a pena notar que esta solução é , de fato, baseada em romper os loops while.



7

NTFJ , 110 bytes

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

Mais legível:

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

Isso foi certamente divertido. Experimente aqui , usando dois caracteres ( 0ou 1) como entrada.

Usando o método da ETHProduction para converter para 0, 1 (caracteres) em bits, isso se torna mais simples.

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

Este é o método mencionado. Pressionando 193 ( ##~~~~~#@), NANDing ( |) com o valor de entrada superior (nesse caso, o primeiro código de caractere, um 48 ou 49). Isso gera 254 para 1 e 255 para 0. NANDing com 255 ( ########@) produz um 0 ou 1 bit de acordo com a entrada.

~#~~~~~#@*

Isso imprime um A, pois todas as entradas começam com A. *aparece Aao imprimir, para que a pilha permaneça inalterada em relação ao estado anterior.

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

Caso 1: o primeiro bit é 1e (ativa o código dentro. ~#~~~~#~@*imprime Be ########@^empurra 255 e salta para essa posição no código. Sendo este o fim do programa, ele termina.

Caso 2: o primeiro bit é 0. (pula para )e o código continua.

~#~~~~##@*

Isso imprime a C, porque esse é o próximo caractere.

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

Isso converte nossa segunda entrada em um pouco.

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

Se o nosso segundo bit for 1, passamos a imprimir um E.

:~||

Esta é a representação NAND da negação booleana de nossa parte: A NAND (0 NAND A) = NOT A.

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

Isso agora é ativado se o bit foi ae é 0impresso E.


5

Pitão, 16 bytes

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

Suíte de teste

Ternários!

Explicação:

+\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 em duas linhas consecutivas.


3
Oh pythmaster, faça-nos saber os caminhos deste programa. ;)
Conor O'Brien

5

CJam, 15 16 17 bytes

'Ali'B'C'Eli-+?

Experimente online!

Um byte desligado graças a @randomra, e um byte desligado graças a @Dennis

Explicação:

'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

Versão antiga (16 bytes):

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

Explicação:

'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

5
Nossos bons amigos Ali e Eli!
Conor O'Brien

5

Pitão, 13 caracteres, 19 bytes

.HC@"૎્««"iQ2

Recebe entrada no formato [a, b]

Explicação

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

Experimente aqui

Ou use uma suíte de testes


2
Pelo menos em UTF-8, isso pesa 19 bytes.
Dennis

1
bytesizematters usa uma maneira completamente inventada de contar bytes, que não corresponde (e não pode ) a uma codificação real. Ele conta as coisas quadradas como 2 bytes cada (3 bytes em UTF-8) e «como 1 byte cada (2 bytes em UTF-8). Ambos wce este concordar que é 19 bytes.
21416 Dennis

4

C, 76 bytes

Renomeei c1para c, c2para Ce resultpara r. Programadores em C vão ao extremo para evitar goto. Se você tiver um problema com sintaxe absurda em C, é mais provável que seja porque você não o usou 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:

Ungolfed

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:

Você pode começar com char r[4]="A";? Meu C está enferrujado.
Larsh

Não é uma maneira realmente ridícula de declarar um literal de String?
Tamoghna Chowdhury 20/02

@TamoghnaChowdhury Sort of. Literais de string não são graváveis. É uma matriz que é inicializada pela string literal "A". Como "A" define apenas os dois primeiros bytes, o restante é inicializado de acordo com as regras para objetos de duração estática (portanto, 0 neste caso). [C99 6.7.8 / 22]
Ray

1
Você pode economizar 22 bytes, alterando a lista de inicialização de "AC"e substituindo tudo, desde r[1]=67a r[2]=69;comr[2]=c2?68:69;
Ray

4

C, 41 bytes

Não tenho certeza se a pergunta requer um programa, uma função ou um trecho de código.
Aqui está uma função:

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

Ele obtém a entrada em dois parâmetros, que devem ser 0 ou 1 (bem, bdeve) e é impresso em stdout.

Define apara um de 0x4241, 0x454341ou 0x444341. Quando impresso como uma string, em um sistema ASCII little endian, fornece a saída necessária.


4

R , 41 39 37 bytes

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

Experimente online!

Em R, TRUEe FALSEsão coagidos 1e 0respectivamente quando você tenta usá-los como números. Podemos converter esses números para os índices 1, 2e 3através da 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

Estes valores são então utilizados para indexar a lista ACD, ACE, ABpara se obter a saída correcta.

Economizou dois bytes graças ao JayCe.

Se você preferir uma versão com uma ifinstrução, há o seguinte para 41 bytes:

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

Experimente online!



@ JayCe Obrigado, atualizei a resposta!
Rtbull 9/08

3

Mathematica, 35 30 bytes

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

Muito simples. Função anônima.



3

JavaScript, 38 bytes

Use no-delimitador 0ou em 1vez de false/true

_=>"ACE ACD AB AB".split` `[+('0b'+_)]

1
Você pode usar em split` ` vez desplit(" ")
andlrc

Você também pode usar em +('0b'+prompt())vez 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 o ArnoldC não parece ter uma entrada formal, basta alterar os 2 primeiros YOU SET US UPvalores para 0 ou 1.

Explicação

Este é apenas um monte de instruções condicionais que respondem por todas as saídas possíveis. Por que você pode perguntar? Bem, ArnoldC realmente não tem compreensão de strings. Não pode nem concatenar seqüências de caracteres! Como resultado, temos que recorrer ao método mais ... ineficiente.


Er, a saída deve ser "AB" se a for verdadeira, não "ABD" / "ABE". Isso deve tornar seu código mais curto!
precisa saber é o seguinte

3

Java, 28 bytes

O mesmo padrão de muitas das respostas. tipo é BiFunction<Boolean,Boolean, String>.

(c,d)->c?"AB":d?"ACD":"ACE"

Eu sei que já faz quase dois anos, mas (c,d)->pode ser jogado em 1 byte c->d->quando você usa um java.util.function.Function<Boolean, java.util.function.Function<Boolean, String>>.
Kevin Cruijssen

2

Pitão, 21 bytes

@c"ACE ACD AB AB"diz2

Experimente aqui!

A entrada é tomada como 0 ou 1, em vez de verdadeiro / falso, enquanto C1 é o primeiro.

Explicação

Apenas usando o fato de que existem apenas 4 resultados possíveis. Funciona interpretando a entrada como binária, convertendo-a na base 10 e usando-a para escolher o resultado certo da string de pesquisa.

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

                  iz2 # Converter entrada binária na base 10
 c "ACE ACD AB AB" d # Dividir string em espaços
@ # Pega o elemento no índice

2

Y , 20 bytes

No caso de a primeira entrada ser uma, apenas uma entrada é aceita. Presumo que esse comportamento seja permitido. Experimente aqui!

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

Ungolfed:

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

Explicado:

'B'A

Isso empurra os personagens B, em seguida, Apara a pilha.

jh M

Isso requer uma entrada, a incrementa, a abre e se move sobre esse número de seções.

Caso 1: j1 = 0. Este é o mais interessante. r$inverte a pilha e exibe um valor, 'C'Eempurra caracteres Ce E. @converte Eem sua contraparte numérica, subtrai a segunda entrada e a converte em um caractere. rdesverte a pilha. Em seguida, o programa vê o link C e passa para o próximo link pe imprime a pilha.

Caso 2: o programa passa para o último link p, que apenas imprime a pilha inteira.


2

PowerShell, 40 bytes

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

Matrizes aninhadas indexadas por entrada. No PowerShell, $true/ 1e $false/ 0são praticamente equivalentes (graças à tipecasting muito flexível), de modo que os índices são bem classificados em uma matriz de dois elementos. Isso é realmente o mais próximo de um ternário que o PowerShell recebe, e eu o usei várias vezes no golfe.

Exemplos

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


2

Vitsy , 26 bytes

Espera entradas como 1s ou 0s através de STDIN com uma nova linha separando.

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

Na verdade, descobri um problema sério com as declarações if durante esse desafio. D: Isso é publicado com a versão quebrada, mas funciona muito bem. (Eu atualizarei isso depois de corrigir o problema). Observe que atualizei o Vitsy com uma correção de if / ifnot. Essa mudança não me concede nenhuma vantagem, apenas esclarecimentos.

Explicação:

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.

Experimente Online!


2

cera de abelha , 26 bytes

Interpretando 0como falso, 1como verdadeiro.

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

Resultado:

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 meu intérprete de cera de abelha do meu repositório Github .


Tenho certeza de que você não precisa das aspas.
Undergroundmonorail

@undergroundmonorail: Ok, vou atualizar minha solução. Obrigado.
ML

2

C, 47 45 bytes

Como existem apenas três resultados diferentes, podemos escolher uma das três cadeias de caracteres como esta:

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

Agradecimentos a Herman L por 2 bytes

Demo

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

1
-2 bytes:char*f(c,d){return"AB\0 ACE\0ACD"+(!c<<d+2);}
Herman L

link to TIO pls
somente ASCII

1

Perl, 23 bytes

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

Requer o -E| -M5.010sinalizador e recebe a entrada como 1 e 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

Solução alternativa que requer -pe é 22 + 1 = 23 bytes:

$_=/^1/?AB:/1/?ACD:ACE
perl -pe'$_=/^1/?AB:/1/?ACD:ACE' <<< '0 1'

say-<>?AB:-<>?ACD:ACEé dois bytes mais curto.
Nwellnhof

1

05AB1E , 23 20 bytes

Código:

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

Experimente online!


1
Esta é provavelmente uma versão antiga do 05AB1E, mas agora pode ter 14 bytes: i„ABë„AC69I-çJ Experimente online ou verifique todos os casos de teste .
Kevin Cruijssen 9/08/19

1
@KevinCruijssen Nice! Esta é realmente uma versão antiga do 05AB1E. O idioma tinha cerca de três meses aqui (nem sequer tinha informações implícitas).
Adnan

1
Sim, eu realmente já estava confuso sobre a liderança I. ; p
Kevin Cruijssen

1

Japonês, 19 bytes

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

Teste online!

Curiosidade: Seriam 16 bytes se não fosse por um bug:

"A{U?"B:C{V?"D:E

Bugs são os piores: |
Conor O'Brien

2
@ CᴏɴᴏʀO'Bʀɪᴇɴ Deixe-me ver se consigo descobrir uma versão mais antiga que não tenha esse bug. Então os 16 bytes seriam legítimos.
ETHproductions

1
Qual é o erro?
CalculatorFeline

@CalculatorFeline Acredito que seqüências aninhadas como essa não sejam transpiladas por algum motivo.
ETHproductions
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.