Ungkapan “Do While False”


47

Lakukan Saat Salah

Di tempat kerja hari ini salah seorang rekan saya menggambarkan use case untuk do while (false). Orang yang diajaknya bicara berpikir bahwa ini konyol dan sesederhana itu jika pernyataan akan jauh lebih baik. Kami kemudian menghabiskan setengah hari kami untuk membahas cara terbaik untuk menulis sesuatu yang setara dengan:

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

Ini adalah ungkapan yang sering ditemukan di c. Program Anda harus menghasilkan output yang sama dengan pseudo-code di bawah ini tergantung pada kondisinya.

do
{
   result += "A";

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

   result += "C"

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

   result += "E";

}
while(false);

print(result);

Karena itu inputnya bisa:

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

dan hasilnya harus:

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

Ini adalah kode-golf sehingga jawaban akan dinilai berdasarkan byte. Celah standar dilarang.

Ya ini sederhana, tapi semoga kita akan melihat beberapa jawaban kreatif, saya berharap kesederhanaan akan mendorong orang untuk menggunakan bahasa yang kurang mereka percayai.


Apakah output harus huruf besar, atau apakah huruf kecil juga diizinkan?
Adnan

7
Sebagai tambahan untuk perdebatan dengan rekan kerja Anda, menurut saya Anda bisa menyelesaikan hal yang sama menggunakan metode dengan return resultmenggantikan break. Kemudian Anda mendapatkan bonus kegunaan ulang dan menyederhanakan kode panggilan juga. Tapi mungkin aku kehilangan sesuatu.
jpmc26

3
Saya tidak tahu ini adalah ungkapan dalam bahasa C ...
Mehrdad

5
@Mehrdad beberapa orang melakukan ini alih-alih gotokarena menggunakan gotobentuk yang buruk :)
Seth

2
Satu-satunya waktu yang pernah saya gunakan do{}while(false)adalah di dalam makro. Sederhana iftidak cukup, karena berinteraksi buruk dengan elsesekitar yang mungkin ada. Tanpa makro Anda juga dapat menghapus dodan while.
nwp

Jawaban:


19

Python 3, 31

Disimpan 1 byte berkat xnor.

Hanya satu byte dari ES6. : / Python Bodoh dan sintaks fungsi anonimnya yang panjang.

Hore untuk satu liners!

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

Kasus uji:

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

7
Jika Anda memesan ulang x*"AB", Anda dapat menghemat ruang setelahnya.
xnor

2
Maaf, sintaks fungsi anonim Anda yang panjang akan menjadi kematian python: P
Conor O'Brien

5
@ CᴏɴᴏʀO'Bʀɪᴇɴ Saya tahu sesuatu harus menahan Python. Saya akan mengirimkan PEP ASAP.
Morgan Thrapp


9
PEP untuk membuat λsinonim lambdaakan menjadi luar biasa :)
Robert Grant

13

JavaScript ES6, 30 26 25 byte

Fungsi anonim sederhana mengambil dua input. Tetapkan ke variabel untuk dipanggil. Pembaruan : Mari melompat pada kereta musik indeks. Menghemat 4 byte. Saya telah mengamankan kepemimpinan saya di atas Python . Menyimpan byte dengan menjelajah fungsi; panggilan seperti (...)(a)(b). Patrick Roberts terima kasih!

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

Versi lama, asli, 30 byte (termasuk untuk tidak melebur ke dalam jawaban python (;):

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

Ini tidak sepintar itu ...
theonlygusti

15
@theonlygusti Ini golf kode, bukan kontes popularitas. Juga, mengapa limbah byte menjadi pintar jika ada solusi yang lebih ringkas?
Conor O'Brien

Saya suka hidung Anda:b?
J Atkin

@JAtkin Memang!
Conor O'Brien

4
Anda dapat menyimpan byte dengan kari
Patrick Roberts


9

Haskell, 28 byte

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

Contoh penggunaan: False # True-> "ACD".

Menggunakan nilai input langsung sebagai penjaga.


9

MATL , 15 17 byte

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

Masukan 0atau 1pada jalur yang terpisah. Atau, 0dapat diganti dengan F(MATL false) dan 1oleh T(MATL true).

Cobalah 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

Ini mengasumsikan bahwa C1 dan C2 adalah input sebagai mentah 0 atau 1 byte. misalnya

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

Golf:

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

Tidak Disatukan:

                                      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
]

Saya percaya perlu dicatat bahwa solusi ini sebenarnya didasarkan pada break out of while loop.



7

NTFJ , 110 byte

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

Lebih mudah dibaca:

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

Itu tentu menghibur. Cobalah di sini , menggunakan dua karakter ( 0atau 1) sebagai input.

Menggunakan metode ETHProduction untuk mengkonversi ke 0, 1 (karakter) menjadi bit, ini menjadi lebih sederhana.

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

Ini adalah metode tersebut. Mendorong 193 ( ##~~~~~#@), NANDing it ( |) dengan nilai input teratas (dalam hal ini, kode karakter pertama, 48 atau 49). Ini menghasilkan 254 untuk 1 dan 255 untuk 0. NANDing dengan 255 ( ########@) menghasilkan bit 0 atau 1 sesuai dengan input.

~#~~~~~#@*

Ini mencetak A, karena semua input dimulai dengan A. *muncul Asaat mencetak, sehingga tumpukan tidak berubah dari keadaan sebelumnya.

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

Kasus 1: bit pertama adalah 1, dan (mengaktifkan kode di dalamnya. ~#~~~~#~@*mencetak B, dan ########@^mendorong 255 dan melompat ke posisi itu dalam kode. Ini menjadi akhir dari program, itu berakhir.

Kasus 2: bit pertama adalah 0. (melompat ke )dan kode berlanjut.

~#~~~~##@*

Ini mencetak a C, karena itulah karakter selanjutnya.

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

Ini mengubah input kedua kami menjadi sedikit.

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

Jika bit kedua kami adalah 1, kami melanjutkan untuk mencetak E.

:~||

Ini adalah representasi NAND dari negasi Boolean dari sedikit kami: A NAND (0 NAND A) = NOT A.

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

Ini sekarang mengaktifkan jika bit itu adalah 0, dan mencetak E.


5

Pyth, 16 byte

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

Suite uji

Orang-orang ternama!

Penjelasan:

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

Input pada dua baris berturut-turut.


3
Oh pythmaster, beri tahu kami cara program ini. ;)
Conor O'Brien

5

CJam, 15 16 17 byte

'Ali'B'C'Eli-+?

Cobalah online!

Satu byte off berkat @randomra, dan satu byte off berkat @Dennis

Penjelasan:

'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 lama (16 byte):

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

Penjelasan:

'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
Teman baik kita Ali dan Eli!
Conor O'Brien

5

Pyth, 13 karakter, 19 byte

.HC@"૎્««"iQ2

Mengambil input dalam bentuk [a, b]

Penjelasan

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

Coba di sini

Atau gunakan test suite


2
Setidaknya dalam UTF-8, ini berbobot 19 byte.
Dennis

1
bytesizematters menggunakan cara yang sepenuhnya dibuat untuk menghitung byte, yang tidak (dan tidak bisa ) sesuai dengan pengkodean yang sebenarnya. Itu menghitung thingies persegi masing-masing 2 byte (3 byte di UTF-8) dan «masing-masing 1 byte (2 byte di UTF-8). Keduanya wcdan ini sepakat bahwa itu 19 byte.
Dennis

4

C, 76 byte

Saya berganti nama c1menjadi c, c2ke Cdan resultke r. Pemrogram C pergi ke ekstrem untuk menghindari goto. Jika Anda pernah memiliki masalah dengan sintaks yang tidak masuk akal dalam C, kemungkinan besar karena Anda tidak menggunakannya 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:

Tidak disatukan

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:

Bisakah Anda mulai dengan char r[4]="A";? C saya berkarat.
LarsH

Bukankah itu cara yang sangat konyol untuk mendeklarasikan String literal?
Tamoghna Chowdhury

@TamoghnaChowdhury Sortir dari. Literal string tidak dapat ditulisi. Ini adalah array yang kemudian diinisialisasi dengan string literal "A". Karena "A" hanya menetapkan dua byte pertama, sisanya diinisialisasi berdasarkan aturan untuk objek durasi statis (jadi 0 dalam kasus ini). [C99 6.7.8 / 22]
Ray

1
Anda dapat menyimpan 22 byte dengan mengubah daftar inisialisasi menjadi "AC"dan mengganti semuanya dari r[1]=67menjadi r[2]=69;denganr[2]=c2?68:69;
Ray

4

C, 41 byte

Saya tidak yakin apakah pertanyaannya memerlukan program, fungsi, atau cuplikan kode.
Inilah fungsinya:

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

Ia mendapat input dalam dua parameter, yang harus 0 atau 1 (well, bharus), dan dicetak ke stdout.

Set ake salah satu 0x4241, 0x454341atau 0x444341. Ketika dicetak sebagai string, pada sistem ASCII little-endian, memberikan output yang diperlukan.


4

R , 41 39 37 byte

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

Cobalah online!

Di R, TRUEdan FALSEdipaksa untuk 1dan 0masing - masing ketika Anda mencoba menggunakannya sebagai angka. Kita dapat mengkonversi angka ini untuk indeks 1, 2dan 3melalui 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

Nilai-nilai ini kemudian digunakan untuk indeks daftar ACD, ACE, ABuntuk menghasilkan output yang benar.

Disimpan dua byte berkat JayCe.

Jika Anda lebih suka versi dengan ifpernyataan, berikut ini ada 41 byte:

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

Cobalah online!



@JayCe Terima kasih, saya telah memperbarui jawabannya!
rturnbull

3

Mathematica, 35 30 byte

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

Sangat sederhana. Fungsi anonim.



3

JavaScript, 38 byte

Gunakan no-delimiter 0atau 1bukannya false/true

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

1
Anda dapat menggunakan split` ` sebagai gantisplit(" ")
andlrc

Anda juga dapat menggunakan +('0b'+prompt())sebagai gantiparseInt(prompt(),2)
andlrc


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

Karena ArnoldC tampaknya tidak memiliki input formal, ubah saja 2 YOU SET US UPnilai pertama menjadi 0 atau 1.

Penjelasan

Ini hanya sejumlah pernyataan bersyarat yang menjelaskan semua kemungkinan hasil. Kenapa, Anda mungkin bertanya? Nah, ArnoldC tidak benar-benar memiliki pemahaman string. Itu bahkan tidak bisa menyatukan string! Akibatnya, kita harus menggunakan metode yang lebih ... tidak efisien ....


Eh, output harus "AB" jika a benar, bukan "ABD" / "ABE". Itu akan membuat kode Anda lebih pendek!
Toby Speight

3

Java, 28 byte

Ketel yang sama dengan banyak jawaban. jenisnya BiFunction<Boolean,Boolean, String>.

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

Saya tahu ini sudah hampir dua tahun, tetapi (c,d)->bisa di-golf dengan 1 byte c->d->ketika Anda menggunakan a java.util.function.Function<Boolean, java.util.function.Function<Boolean, String>>.
Kevin Cruijssen

2

Pyth, 21 byte

@c"ACE ACD AB AB"diz2

Coba di sini!

Input diambil sebagai 0 atau 1 bukannya benar / salah sementara C1 yang lebih dulu.

Penjelasan

Hanya menggunakan fakta bahwa hanya ada 4 hasil yang mungkin. Bekerja dengan menginterpretasikan input sebagai biner, mengubahnya menjadi basis 10 dan menggunakan ini untuk memilih hasil yang tepat dari string pencarian.

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

                  iz2 # Konversi input biner ke basis 10
 c "ACE ACD AB AB" d # Membagi string pada spasi
@ # Dapatkan elemen di indeks

2

Y , 20 byte

Dalam hal input pertama adalah satu, hanya satu input yang diambil. Saya berasumsi bahwa perilaku ini diperbolehkan. Coba di sini!

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

Tidak Disatukan:

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

Dijelaskan:

'B'A

Ini mendorong karakter Bkemudian Ake tumpukan.

jh M

Ini mengambil satu input, menambahkannya, mengeluarkannya, dan bergerak melewati jumlah bagian itu.

Kasus 1: j1 = 0. Ini yang lebih menarik. r$membalikkan tumpukan dan muncul nilai, 'C'Emendorong karakter Cdan E. @dikonversi Eke numeric counterpart, kurangi input kedua dari itu, dan ubah menjadi karakter. run-membalikkan tumpukan. Kemudian, program melihat C-link dan pindah ke tautan berikutnya p, dan mencetak tumpukan.

Kasus 2: program pindah ke tautan terakhir p, yang hanya mencetak seluruh tumpukan.


2

PowerShell, 40 byte

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

Array bersarang diindeks oleh input. Di PowerShell, $true/ 1dan $false/ 0secara praktis sama (berkat typecasting yang sangat longgar), sehingga indeks dengan baik menjadi array dua elemen. Ini benar-benar sedekat dengan ternary seperti PowerShell dapatkan, dan saya telah menggunakannya berkali-kali dalam bermain golf.

Contohnya

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

Diharapkan input sebagai 1s atau 0s melalui STDIN dengan pemisahan baris baru.

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

Saya benar-benar menemukan masalah serius dengan pernyataan if selama tantangan ini. D: Ini diposting dengan versi yang rusak, tetapi berfungsi dengan baik. (Saya akan memperbarui ini setelah saya memperbaiki masalah) Harap dicatat bahwa saya telah memperbarui Vitsy dengan perbaikan jika / jika tidak. Perubahan ini tidak memberi saya keuntungan apa pun, hanya klarifikasi.

Penjelasan:

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.

Cobalah secara Online!


2

lilin lebah , 26 byte

Menafsirkan 0sebagai salah, 1sebagai benar.

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

Keluaran:

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!

Kloning juru lilin lebah saya dari repositori Github saya .


Saya cukup yakin Anda tidak perlu tanda kutip.
undergroundmonorail

@undergroundmonorail: Oke, saya akan memperbarui solusi saya. Terima kasih.
ML

2

C, 47 45 byte

Karena hanya ada 3 hasil yang berbeda, kita dapat memilih satu dari tiga string seperti ini:

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

Terima kasih kepada Herman L untuk 2 byte

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

tautan ke TIO pls
ASCII

1

Perl, 23 byte

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

Membutuhkan -E| -M5.010tandai dan ambil input sebagai 1 dan 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

Solusi alternatif yang membutuhkan -pdan 22 + 1 = 23 byte:

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

say-<>?AB:-<>?ACD:ACElebih pendek dua byte.
nwellnhof


1

Japt, 19 byte

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

Uji secara online!

Fakta menyenangkan: Ini akan menjadi 16 byte jika bukan karena bug:

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

Bug adalah yang terburuk: |
Conor O'Brien

2
@ CᴏɴᴏʀO'Bʀɪᴇɴ Coba lihat apakah saya bisa menggali versi yang lebih lama yang tidak memiliki bug ini. Maka 16 byte akan sah.
ETHproduksi

1
Apa masalahnya?
CalculatorFeline

@ CalculatorFeline Saya percaya string bersarang seperti itu tidak transparan untuk beberapa alasan.
ETHproduksi
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.