Il linguaggio "Do While False"


47

Fallo finto

Oggi al lavoro uno dei miei colleghi stava descrivendo il caso d'uso per do while (false). La persona con cui stava parlando pensava che fosse sciocco e che le semplici affermazioni sarebbero state molto migliori. Abbiamo quindi continuato a perdere metà della nostra giornata discutendo il modo migliore per scrivere qualcosa di 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);

Questo è un linguaggio che si trova in c abbastanza spesso. Il tuo programma dovrebbe produrre lo stesso output del pseudo-codice sottostante in base alle condizioni.

do
{
   result += "A";

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

   result += "C"

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

   result += "E";

}
while(false);

print(result);

Pertanto, l'input potrebbe essere:

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

e l'output dovrebbe essere:

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

Questo è code-golf, quindi le risposte saranno giudicate in base ai byte. Le scappatoie standard sono vietate.

Sì, questo è semplice, ma speriamo di vedere alcune risposte creative, spero che la semplicità incoraggi le persone a usare le lingue con cui sono meno fiduciosi.


L'output deve essere maiuscolo o è consentito anche il minuscolo?
Adnan,

7
A parte il dibattito con il tuo collega, mi sembra che potresti realizzare la stessa cosa usando un metodo al return resultposto di break. Quindi ottieni i bonus di riusabilità e anche di semplificare il codice chiamante. Ma forse mi manca qualcosa.
jpmc26,

3
Non sapevo che questo fosse un linguaggio in C ...
Mehrdad,

5
@Mehrdad alcune persone lo fanno invece che gotoperché usare gotoè una cattiva forma :)
Seth

2
L'unica volta che ho mai usato do{}while(false)è all'interno di macro. Un semplice ifnon è sufficiente, perché interagisce male con i elses che potrebbero essere presenti. Senza una macro puoi anche rimuovere il doe while.
nwp,

Risposte:


19

Python 3, 31

Salvato 1 byte grazie a xnor.

Solo un byte di distanza da ES6. : / Stupid Python e la sua sintassi lunga funzione anonima.

Evviva per una fodera!

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

Casi test:

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

7
Se riordini x*"AB", puoi salvare lo spazio dopo.
xnor

2
Spiacenti, la tua sintassi della funzione lunga e anonima sarà la morte di Python: P
Conor O'Brien,

5
@ CᴏɴᴏʀO'Bʀɪᴇɴ Sapevo che qualcosa doveva trattenere Python. Invierò un PEP al più presto.
Morgan Thrapp,


9
Un PEP di cui fare λun sinonimo lambdasarebbe fantastico :)
Robert Grant,

13

JavaScript ES6, 30 26 25 byte

Una semplice funzione anonima che accetta due input. Assegna a una variabile da chiamare. Aggiornamento : saltiamo sul carrozzone indice. Salva 4 byte. Ho assicurato il mio vantaggio su Python . Salvataggio di un byte eseguendo il curry della funzione; chiama come (...)(a)(b). Grazie Patrick Roberts!

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

Vecchia versione originale, 30 byte (inclusa per non fondersi nella risposta di Python (;):

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

Non è così intelligente ...
theonlygusti,

15
@theonlygusti Questo è un code-golf, non un concorso di popolarità. Inoltre, perché i byte di scarto sono intelligenti se esiste una soluzione più concisa?
Conor O'Brien,

Mi piace la tua scelta del naso:b?
J Atkin,

@JAtkin Indeed!
Conor O'Brien,

4
Puoi salvare un byte con il curry
Patrick Roberts,


9

Haskell, 28 byte

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

Esempio di utilizzo: False # True-> "ACD".

Utilizzando i valori di input direttamente come protezioni.


9

MATL , 15 17 byte

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

Gli ingressi sono 0o 1su linee separate. In alternativa, 0può essere sostituito da F(MATL false) e 1da T(MATL true).

Provalo 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 byte

Ciò presuppone che C1 e C2 siano immessi come byte 0 o 1 non elaborati. per esempio

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

golfed:

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

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
]

Credo che valga la pena notare che questa soluzione si basa in realtà sull'interruzione di loop while.



7

NTFJ , 110 byte

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

Più leggibile:

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

È stato sicuramente divertente. Provalo qui , usando due caratteri ( 0o 1) come input.

Utilizzando il metodo ETHProduction per convertire in 0, 1 (caratteri) in bit, questo diventa più semplice.

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

Questo è il metodo detto. Premendo 193 ( ##~~~~~#@), NANDandolo ( |) con il valore di input superiore (in questo caso, il primo codice carattere, un 48 o 49). Questo produce 254 per 1 e 255 per 0. NANDANDO con 255 ( ########@) si ottiene uno 0 o 1 bit in base all'ingresso.

~#~~~~~#@*

Questo stampa un A, poiché tutto l'input inizia con A. *apre la Astampa, quindi la pila rimane invariata rispetto allo stato precedente.

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

Caso 1: il primo bit è 1e (attiva il codice all'interno. ~#~~~~#~@*stampa Be ########@^spinge 255 e salta in quella posizione nel codice. Essendo la fine del programma, termina.

Caso 2: il primo bit è 0. (salta a )e il codice continua.

~#~~~~##@*

Questo stampa un C, perché quello è il prossimo personaggio.

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

Questo converte un po 'il nostro secondo input.

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

Se il nostro secondo bit è un 1, procediamo a stampare un E.

:~||

Questa è la rappresentazione NAND della negazione booleana del nostro bit: A NAND (0 NAND A) = NOT A.

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

Questo ora si attiva se il bit era a 0e stampa E.


5

Pyth, 16 byte

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

Suite di test

Ternari!

Spiegazione:

+\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.

Ingresso su due righe consecutive.


3
Oh pythmaster, rendici noti i modi di questo programma. ;)
Conor O'Brien,

5

CJam, 15 16 17 byte

'Ali'B'C'Eli-+?

Provalo online!

Un byte spento grazie a @randomra e un byte spento grazie a @Dennis

Spiegazione:

'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

Vecchia versione (16 byte):

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

Spiegazione:

'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
I nostri buoni amici Ali ed Eli!
Conor O'Brien,

5

Pyth, 13 caratteri, 19 byte

.HC@"૎્««"iQ2

Accetta input nella forma [a, b]

Spiegazione

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

Provalo qui

Oppure usa una suite di test


2
Almeno in UTF-8, questo pesa 19 byte.
Dennis,

1
bytesizematters utilizza un modo completamente inventato di contare i byte, che non corrisponde (e non può ) corrispondere a una codifica effettiva. Conta le cose quadrate come 2 byte ciascuna (3 byte in UTF-8) e «come 1 byte ciascuno (2 byte in UTF-8). Entrambi wce questo concordano sul fatto che sono 19 byte.
Dennis,

4

C, 76 byte

Ho rinominato c1in c, c2to Ce resultto r. I programmatori C vanno al limite per evitare goto. Se hai mai avuto un problum con sintassi assurda in C, è molto probabile che sia perché non l'hai usato 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:

Puoi iniziare con char r[4]="A";? La mia C è arrugginita.
LarsH,

Non è davvero un modo ridicolo di dichiarare una stringa letterale?
Tamoghna Chowdhury,

@TamoghnaChowdhury Sort of. I letterali di stringa non sono scrivibili. È un array che viene quindi inizializzato dalla stringa letterale "A". Poiché "A" imposta solo i primi due byte, il resto viene inizializzato secondo le regole per gli oggetti di durata statica (quindi 0 in questo caso). [C99 6.7.8 / 22]
Ray,

1
È possibile salvare 22 byte modificando l'elenco di inizializzazione in "AC"e sostituendo tutto da r[1]=67a r[2]=69;conr[2]=c2?68:69;
Ray

4

C, 41 byte

Non sono sicuro se la domanda richiede un programma, una funzione o uno snippet di codice.
Ecco una funzione:

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

Ottiene l'input in due parametri, che devono essere 0 o 1 (bene, bdeve) e stampa su stdout.

Imposta aa uno dei 0x4241, 0x454341o 0x444341. Quando viene stampato come una stringa, su un sistema ASCII little-endian, fornisce l'output richiesto.


4

R , 41 39 37 byte

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

Provalo online!

In R, TRUEe FALSEsono costretti a 1e 0rispettivamente quando si tenta di usarli come numeri. Siamo in grado di convertire questi numeri indici 1, 2e 3attraverso la formula 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

Questi valori vengono poi utilizzati per indicizzare l'elenco ACD, ACE, ABper fornire l'output corretto.

Salvati due byte grazie a JayCe.

Se invece preferisci una versione con ifun'istruzione, per 41 byte vale quanto segue:

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

Provalo online!



@JayCe Grazie, ho aggiornato la risposta!
rturnbull,

3

Mathematica, 35 30 byte

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

Molto semplice. Funzione anonima.



3

JavaScript, 38 byte

Usa delimitatore 0o 1invece di false/true

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

1
Puoi usare split` ` invece displit(" ")
andlrc il

Puoi anche usare +('0b'+prompt())invece diparseInt(prompt(),2)
andlrc il


3

ArnoldC , 423 byte

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

Poiché ArnoldC non sembra avere un input formale, cambia invece i primi 2 YOU SET US UPvalori in 0 o 1.

Spiegazione

Questo è solo un mucchio di istruzioni condizionali che rappresentano tutti i possibili risultati. Perché, potresti chiedere? Bene, ArnoldC non ha davvero comprensione delle stringhe. Non può nemmeno concatenare le stringhe! Di conseguenza, dobbiamo ricorrere al metodo più ... inefficiente ....


Ehm, l'output dovrebbe essere "AB" se a è vero, non "ABD" / "ABE". Ciò dovrebbe abbreviare il tuo codice!
Toby Speight,

3

Java, 28 byte

Stessa caldaia di molte risposte. il tipo è BiFunction<Boolean,Boolean, String>.

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

So che sono passati quasi due anni, ma (c,d)-> può essere giocato a golf di 1 byte a c->d->quando si utilizza a java.util.function.Function<Boolean, java.util.function.Function<Boolean, String>>.
Kevin Cruijssen,

2

Pyth, 21 byte

@c"ACE ACD AB AB"diz2

Provalo qui!

L'input è preso come 0 o 1 invece di vero / falso mentre C1 viene per primo.

Spiegazione

Basta usare il fatto che ci sono solo 4 possibili risultati. Funziona interpretando l'input come binario, convertendolo in base 10 e usando questo per scegliere il risultato giusto dalla stringa di ricerca.

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

                  iz2 # Converte l'input binario in base 10
 c "ACE ACD AB AB" d # Dividi la stringa negli spazi
@ # Ottieni l'elemento nell'indice

2

Y , 20 byte

Nel caso in cui il primo input sia uno, viene preso solo un input. Presumo che questo comportamento sia consentito. Provalo qui!

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

Ungolfed:

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

Ha spiegato:

'B'A

Questo spinge i personaggi Bquindi Ain pila.

jh M

Questo richiede un input, lo incrementa, lo apre e si sposta su quel numero di sezioni.

Caso 1: j1 = 0. Questo è il più interessante. r$inverte la pila e fa apparire un valore, 'C'Espinge i caratteri Ce E. @converte Enella sua controparte numerica, sottrae il secondo input da esso e lo converte in un carattere. rannulla lo stack. Quindi, il programma vede il collegamento a C e passa al collegamento successivo pe stampa lo stack.

Caso 2: il programma passa all'ultimo collegamento p, che stampa semplicemente l'intero stack.


2

PowerShell, 40 byte

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

Matrici nidificate indicizzate per input. In PowerShell, $true/ 1e $false/0 sono praticamente equivalenti (grazie al typecasting molto lento), quindi si indicizza perfettamente in un array a due elementi. Questo è davvero simile a un ternario come PowerShell, e l'ho usato molte volte nel golf.

Esempi

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 byte

Prevede input come 1s o 0s tramite STDIN con una nuova riga di separazione.

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

In realtà ho scoperto un serio problema con le dichiarazioni if ​​durante questa sfida. D: Questo è pubblicato con la versione non funzionante, ma funziona benissimo. (Lo aggiornerò dopo aver risolto il problema) Si prega di notare che ho aggiornato Vitsy con una correzione di if / ifnot. Questa modifica non mi garantisce alcun vantaggio, ma solo un chiarimento.

Spiegazione:

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.

Provalo online!


2

cera d'api , 26 byte

Interpretazione 0come falsa, 1come vera.

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

Produzione:

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!

Clona il mio interprete di cera d'api dal mio repository Github .


Sono abbastanza sicuro che non hai bisogno delle virgolette.
undergroundmonorail,

@undergroundmonorail: Ok, aggiornerò la mia soluzione. Grazie.
ML

2

C, 47 45 byte

Poiché ci sono solo 3 risultati diversi, possiamo scegliere una delle tre stringhe in questo modo:

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

Grazie a Herman L per 2 byte

dimostrazione

#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 byte:char*f(c,d){return"AB\0 ACE\0ACD"+(!c<<d+2);}
Herman L

collegamento a TIO pls
solo ASCII

1

Perl, 23 byte

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

Richiede il -E| -M5.010flag e accetta input come 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

Soluzione alternativa che richiede -ped è 22 + 1 = 23 byte:

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

say-<>?AB:-<>?ACD:ACEè due byte più breve.
nwellnhof,

1

05AB1E , 23 20 byte

Codice:

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

Provalo online!


1
Questa è probabilmente una versione antica di 05AB1E, ma ora può contenere 14 byte: provala i„ABë„AC69I-çJ online o verifica tutti i casi di test .
Kevin Cruijssen,

1
@KevinCruijssen Nice! Questa è davvero una versione antica di 05AB1E. La lingua aveva circa tre mesi qui (non aveva nemmeno un input implicito).
Adnan,

1
Sì, ero davvero già confuso riguardo al comando I. ; p
Kevin Cruijssen,

1

Japt, 19 byte

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

Provalo online!

Curiosità: sarebbero 16 byte se non fosse per un bug:

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

I bug sono i peggiori: |
Conor O'Brien,

2
@ CᴏɴᴏʀO'Bʀɪᴇɴ Fammi vedere se riesco a trovare una versione precedente che non avesse questo errore. Quindi i 16 byte sarebbero legittimi.
ETHproductions

1
Qual è il bug?
CalcolatriceFeline

@CalculatorFeline Credo che stringhe nidificate del genere non si traspongano per qualche motivo.
ETHproductions
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.