“Yanlış Yaparken” deyimi


47

Yanlış Yaparken Yapın

Bugün işteyken meslektaşlarımdan biri, kullanım sırasındaki kullanım durumunu açıklıyordu (yanlış). Konuşmakta olduğu kişi bunun aptalca olduğunu ve ifadelerin daha iyi olacağını düşünüyorsanız basit olduğunu düşündü. Daha sonra, eşdeğer bir şeyler yazmak için en iyi yolu tartışarak günün yarısını boşa harcadık:

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

Bu oldukça sık c bulunan bir deyimdir. Programınız koşullara bağlı olarak aşağıdaki sözde kodla aynı çıktıyı üretmelidir.

do
{
   result += "A";

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

   result += "C"

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

   result += "E";

}
while(false);

print(result);

Bu nedenle girdi şöyle olabilir:

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

ve çıktı şöyle olmalıdır:

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

Bu kod-golf olduğundan cevaplar bayt olarak değerlendirilecektir. Standart boşluklar yasaklandı.

Evet, bu basit bir sorundur, ancak umarım bazı yaratıcı cevaplar göreceğiz, basitliğin insanları daha az güvendikleri dilleri kullanmaya teşvik edeceğini umuyorum.


Çıktının büyük harf olması mı gerekiyor, yoksa küçük harflere de izin veriliyor mu?
Adnan 19

7
Bir kenara iş arkadaşınız ile tartışma, bana öyle geliyor gibi sen bir yöntemi kullanarak aynı şeyi başarabileceğimizi return resultyerine break. Sonra yeniden kullanılabilirlik ve arama kodunu basitleştirmenin bonuslarını alıyorsunuz. Ama belki bir şeyleri özlüyorum.
jpmc26

3
Bunun C’de bir deyim olduğunu bilmiyordum ...
Mehrdad

5
@Mehrdad bazı insanlar bunun yerine bunu yapmak yerine bunu gotokullanıyorlar çünkü gotokötü bir form kullanıyor :)
Seth

2
Şimdiye kadar kullandığım tek zaman do{}while(false)makroların içinde. Bir basit ifyeterli değildir, çünkü elseetrafta bulunanlarla kötü etkileşime girer . Bir makro olmadan siz de kaldırabilir dove while.
nwp

Yanıtlar:


19

Python 3, 31

Xnor sayesinde 1 byte kurtarıldı.

ES6'dan yalnızca bir bayt uzakta. : / Stupid Python ve uzun adsız işlev sözdizimi.

Bir gömlek için yaşasın!

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

Test durumları:

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

7
Yeniden sipariş x*"AB"ederseniz, sonradan tasarruf edebilirsiniz.
xnor

2
Üzgünüz, uzun, anonim işlev sözdiziminiz, python'un ölümü olacak: P
Conor O'Brien,

5
@ CᴏɴᴏʀO'Bʀɪᴇɴ Bir şeyin Python'u geri tutması gerektiğini biliyordum. En kısa zamanda bir PEP göndereceğim.
Morgan Thrapp


9
İle λeşanlamlı olmak için bir PEP lambdaharika olurdu :)
Robert Grant

13

JavaScript ES6, 30 26 25 bayt

İki giriş alan basit bir isimsiz fonksiyon. Çağrılacak bir değişkene atayın. Güncelleme : İndeks bandwagona atlayalım. 4 bayt kaydeder. Python konusunda liderliğimi güvence altına aldım . İşlevi körleyerek bir bayt kaydedildi; gibi ara (...)(a)(b). Teşekkürler Patrick Roberts!

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

Eski, orijinal sürüm, 30 bayt (python cevap içine erimemek için dahil (;):

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

Bu o kadar da akıllıca değil ...
theonlygusti

15
@theonlygusti Bu bir kod golfü, popülerlik yarışması değil. Ayrıca, neden daha özlü bir çözüm varsa, atık baytları neden akıllı?
Conor O'Brien,

Burun seçimini beğendim:b?
J Atkin

@Jtkin Gerçekten!
Conor O'Brien,



9

Haskell, 28 bayt

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

Kullanım örneği: False # True-> "ACD".

Giriş değerlerini doğrudan koruma olarak kullanma.


9

MATL , 15 17 bayt

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

Girişler ayrı çizgilerde 0veya 1satırlarda. Seçenek olarak ise, 0ile ikame edilmiş olabilir F(Matl en false) ve 1ile T(Matl en true).

Çevrimiçi deneyin!

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

Bu, C1 ve C2'nin ham 0 veya 1 bayt olarak girdi olduğunu varsayar. Örneğin

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
]

Ben buna değerim bu çözüm belirterek inanıyoruz olduğu while döngüleri patlak dayalı aslında.



7

NTFJ , 110 bayt

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

Daha okunabilir:

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

Bu kesinlikle eğlenceli oldu. Burada , giriş olarak iki karakter ( 0veya 1) kullanarak deneyin .

ETHProduction'nın 0, 1 (karakter) 'e bit'e dönüştürme yöntemini kullanarak, bu daha kolay hale gelir.

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

Bu söylenen yöntemdir. 193 ( ##~~~~~#@) basmak, NANDing ( |) üst giriş değeriyle (bu durumda, ilk karakter kodu, 48 veya 49). Bu, 1 için 254 ve 0 için 255 ########@verir. 255 ( ) ile NANDING , girişe göre 0 veya 1 bit verir.

~#~~~~~#@*

Bu A, bir giriş yazdırır çünkü tüm girdiler ile başlar A. Yazdırma sırasında *açılır A, böylece yığın önceki durumundan değişmez.

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

Durum 1: ilk bit 1ve (içindeki kodu etkinleştirir. ~#~~~~#~@*yazdırır Bve ########@^255'e basar ve koddaki bu konuma atlar. Bu programın sonu olarak sona erer.

Durum 2: ilk bit 0. (atlar )ve kod devam eder.

~#~~~~##@*

Bu bir yazdırır C, çünkü bir sonraki karakter budur.

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

Bu bizim ikinci girişimizi bir bit değerine dönüştürür.

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

İkinci bitimiz 1 ise, yazdırmaya devam ederiz. E .

:~||

Bu, Boolean’ın ihmalinin NAND’ın temsili: A NAND (0 NAND A) = NOT A .

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

Bu, bit bir a ise aktive olur 0ve yazdırılır E.


5

Pyth, 16 bayt

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

Test odası

Ternaries!

Açıklama:

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

Ardışık iki satıra giriş.


3
Oh pythmaster, bize bu programın yollarını tanıyın. ;)
Conor O'Brien,

5

CJam, 15 16 17 bayt

'Ali'B'C'Eli-+?

Çevrimiçi deneyin!

@Randomra sayesinde bir bayt ve @Dennis sayesinde bir bayt kapalı

Açıklama:

'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

Eski versiyon (16 bayt):

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

Açıklama:

'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
İyi arkadaşlarımız Ali ve Eli!
Conor O'Brien,

5

Pyth, 13 karakter, 19 bayt

.HC@"૎્««"iQ2

[A, b] biçiminde girdi alır

açıklama

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

Burada dene

Veya bir test takımı kullanın


2
En azından UTF-8'de bu 19 bayttır.
Dennis,

1
bayt denetleyicileri, gerçek bir şifrelemeye karşılık gelmeyen (ve edemeyen ) bayt sayma yöntemini kullanır . Kare şeyleri her biri 2 bayt (UTF-8'de 3 bayt) ve «her biri 1 bayt (UTF-8'de 2 bayt ) olarak sayar . Hem wcve bu onu 19 bayt olduğunu kabul.
Dennis,

4

C, 76 bayt

Ben değiştirildi c1etmek c, c2için Cve resultiçin r. C programcıları kaçınmak için uç noktalara gider goto. Eğer C’de saçma sözdizimine sahip bir probleminiz varsa, kullanmamış olmanız muhtemeldir 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:

İle başlayabilir char r[4]="A";misin Benim C paslı.
LarsH

Bu bir String değişmezini bildirmenin gerçekten saçma bir yolu değil mi?
Tamoghna Chowdhury

@TamoghnaChowdhury Sırala. Dize değişmezleri yazılabilir değil. Daha sonra "A" dizgisi tarafından başlatılan bir dizidir . "A" yalnızca ilk iki baytı belirlediğinden, kalanlar statik süredeki nesneler için kurallara göre başlatılır (bu durumda 0). [C99 6.7.8 / 22]
Ray,

1
Sen hiç başlatma listesini değiştirerek 22 bayt kaydedebilir "AC"ve her şeyi yerine r[1]=67kadar r[2]=69;olanr[2]=c2?68:69;
Ray

4

C, 41 bayt

Sorunun bir program, işlev veya kod pasajı gerektirip gerektirmediğinden emin değilim.
İşte bir fonksiyon:

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

Girdiyi 0 veya 1 olması gereken iki parametrede alır (tamam, bgerekir) ve stdout'a yazdırır.

Kümeler abirine 0x4241, 0x454341ya da 0x444341. Bir dize olarak basıldığında, küçük bir endian ASCII sisteminde gerekli çıktıyı verir.


4

R , 41 39 37 bayt

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

Çevrimiçi deneyin!

R olarak, TRUEve FALSEzorlandığı alanları 1ve 0sırasıyla numaralar olarak kullanmaya çalıştığınızda. Biz endeksleri bu numaraları dönüştürebilir 1, 2ve 3formülü sayesinde 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

Bu değerler daha sonra dizin listesi kullanılır ACD, ACE, ABdoğru çıkış elde edilir.

JayCe sayesinde iki bayt kurtarıldı.

Bunun yerine, ifadeli bir sürümü tercih ederseniz if, 41 bayt için aşağıdakiler bulunur:

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

Çevrimiçi deneyin!



@JayCe Teşekkürler, cevabı güncelledim!
rturnbull



3

JavaScript, 38 bayt

Sınırlayıcı kullanmayın 0veya / 1yerinefalsetrue

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

1
Sen kullanabilirsiniz split` ` yerinesplit(" ")
andlrc

+('0b'+prompt())parseInt(prompt(),2)
andlrc


3

ArnoldC , 423 bayt

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

ArnoldC resmi bir girdi gibi görünmediğinden, ilk 2 YOU SET US UPdeğeri sadece 0 veya 1 olarak değiştirin.

açıklama

Bu, olası tüm çıktıları açıklayan bir sürü koşullu ifadedir. Neden sorabilirsin? Eh, ArnoldC gerçekten dize kavrama var. Dizeleri bile birleştiremez! Sonuç olarak, daha ... verimsiz ... yöntemine başvurmalıyız.


Er, eğer "ABD" / "ABE" değil, doğru ise, çıkış "AB" olmalıdır. Bu kodunuzu kısaltır!
Toby Speight,

3

Java, 28 bayt

Cevapların çoğunda aynı kazan. türüdür BiFunction<Boolean,Boolean, String>.

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

Ben neredeyse iki yıl geçti biliyorum ama (c,d)->1 byte ile golfed edilebilir c->d->bir kullandığınızda java.util.function.Function<Boolean, java.util.function.Function<Boolean, String>>.
Kevin Cruijssen

2

Pyth, 21 bayt

@c"ACE ACD AB AB"diz2

Burada dene!

C1 ilk gelirken giriş, true / false yerine 0 veya 1 olarak alınır.

açıklama

Sadece 4 olası sonuç olduğu gerçeğini kullanarak. Girişi ikili olarak yorumlayarak, 10 tabanına dönüştürerek ve arama dizesinden doğru sonucu seçmek için bunu kullanarak çalışır.

c "ACE ACD AB AB" diz2 # z = giriş

                  iz2 # İkili girişi 10 tabanına dönüştür
 c "ACE ACD AB AB" d # Boşluklardaki dizgiyi ayır
@ # Öğeyi dizinde al

2

Y , 20 bayt

İlk giriş bir ise, sadece bir giriş alınır. Bu davranışa izin verildiğini varsayıyorum. Burada dene!

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

Ungolfed:

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

Açıklaması:

'B'A

Bu, karakterleri Bdaha sonra Ayığına iter .

jh M

Bu bir girdi alır, arttırır, çıkar ve bu bölümlerin sayısı boyunca ilerler.

Durum 1: j1 = 0. Bu daha ilginç olanı. r$yığını tersine çevirir ve bir değer 'C'Eçıkarır, karakterleri iter Cve E. sayısal karşılığına @dönüştürür E, ikinci girişi ondan çıkarır ve karaktere dönüştürür.ryığını kaldırır. Ardından, program C-linkini görür ve bir sonraki linke geçer pve yığını yazdırır.

Durum 2: Program pyalnızca tüm yığını basan son bağlantıya geçer .


2

PowerShell, 40 bayt

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

Girdi tarafından dizine eklenen iç içe geçmiş diziler. PowerShell'de, $true/ 1ve $false/0 pratik olarak eşdeğerdir (çok gevşek tiplendirme sayesinde), böylece iki elemanlı bir diziye güzel bir şekilde endekslenir. Bu gerçekten PowerShell'in aldığı bir üçlüye yakın ve golf oynamak için çok kullandım.

Örnekler

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 bayt

Yeni bir satır ayırma ile girişleri STDIN üzerinden 1 veya 0 olarak bekliyor.

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

Aslında bu meydan okuma sırasında ifadeleri ile ciddi bir sorun keşfettim. D: Bu bozuk sürümle yayınlanır, ancak gayet iyi çalışır. (Sorunu düzelttikten sonra bunu güncelleyeceğim) Lütfen Vitsy'yi if / ifnot düzeltmesiyle güncellediğimi unutmayın. Bu değişiklik bana herhangi bir avantaj sağlamaz, yalnızca açıklama sağlar.

Açıklama:

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.

Çevrimiçi Deneyin!


2

balmumu , 26 bayt

0Yanlış 1olarak yorumlamak , doğru olarak.

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

Çıktı:

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!

Balmumu tercümanımı Github depomdan klonla .


Tırnaklara ihtiyacın olmadığından eminim.
undergroundmonorail

@ undergroundmonorail: Tamam, çözümümü güncelleyeceğim. Teşekkürler.
ML

2

C, 4745 bayt

Sadece 3 farklı sonuç olduğu için, şu üç karakterden birini seçebiliriz:

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

2 bayt için Herman L'ye teşekkürler

gösteri

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

TIO'ya bağlantı pls
ASCII sadece 11

1

Perl, 23 bayt

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

Gerektirir -E| -M5.010bayrak ve 1 ve 0 olarak giriş alır:

$ 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

Gerektiren -pve 22 + 1 = 23 bayt olan alternatif çözüm :

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

say-<>?AB:-<>?ACD:ACEiki bayt daha kısa.
nwellnhof

1

05AB1E , 23 20 bayt

Kod:

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

Çevrimiçi deneyin!


1
Bu muhtemelen 05AB1E'nin eski bir sürümüdür, ancak şimdi 14 byte olabilir: i„ABë„AC69I-çJ Çevrimiçi deneyin veya tüm test durumlarını doğrulayın .
Kevin Cruijssen

1
@KevinCruijssen Güzel! Bu gerçekten de 05AB1E'nin eski bir versiyonudur. Dil burada üç ay kadar eskiydi (dolaylı girişi bile yoktu).
Adnan

1
Evet, gerçekten lider konusunda kafam karıştı I. ; p
Kevin Cruijssen

1

Japt, 19 bayt

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

Çevrimiçi test edin!

Eğlenceli gerçek: Eğer bir hata olmasaydı, bu 16 bayt olurdu:

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

Hatalar en kötüsü: |
Conor O'Brien,

2
@ C'O'Bʀɪᴇɴ Lemme, bu hataya sahip olmayan eski bir sürümü çıkarabilir miyim bakalım. Sonra 16 bayt okunaklı olurdu.
ETHProductions 20

1
Böcek nedir?
Hesap MakinesiFeline

@CalculatorFeline Öyle iç içe dizelerin bir nedenden ötürü geçmediğine inanıyorum.
ETHproductions
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.