“做错了”的成语


47

做错事

今天在工作中,我的一位同事正在描述do while(false)的用例。他正在与之交谈的人认为这很愚蠢,而且如果陈述会更好,那就简单了。然后,我们浪费了一半的时间来讨论编写等同于以下内容的最佳方式:

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

这是一个很常见的习惯用法。根据条件,您的程序应产生与以下伪代码相同的输出。

do
{
   result += "A";

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

   result += "C"

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

   result += "E";

}
while(false);

print(result);

因此,输入可能是:

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

输出应为:

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

这是代码高尔夫球,因此答案将以字节为单位。禁止出现标准漏洞。

是的,这很简单,但是希望我们能看到一些创造性的答案,我希望这种简单性会鼓励人们使用他们不太自信的语言。


输出必须是大写还是也可以小写?
阿德南

7
除了与您的同事进行辩论外,在我看来,您可以使用return result代替的方法来完成同一件事break。然后,您还将获得可重用性和简化调用代码的好处。但是也许我想念一些东西。
jpmc26 '02

3
我不知道这是C的一个成语...
迈赫达德

5
@Mehrdad有些人这样做而不是goto因为使用goto格式错误:)
赛斯

2
我曾经使用过的唯一时间do{}while(false)是在内部宏中。一个简单的条件if是不够的,因为它与elses之间可能存在的相互作用很差。如果没有宏,则最好删除dowhile
nwp

Answers:


19

Python 3、31

感谢xnor,节省了1个字节。

与ES6仅有一个字节的距离。:/愚蠢的Python及其冗长的匿名函数语法。

万岁一个班轮!

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

测试用例:

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

7
如果您重新订购x*"AB",可以在之后节省空间。
xnor

2
抱歉,您冗长的匿名函数语法将是python的死:P
Conor O'Brien

5
@CᴏɴᴏʀO'Bʀɪᴇɴ我知道必须阻止Python。我将尽快提交PEP。
Morgan Thrapp '16

2
您这样做了,我将订购蛇陷阱
Conor O'Brien

9
成为PEP λ代名词的PEP lambda会很棒:)
罗伯特·格兰特

13

的JavaScript ES6,30个 26 25字节

一个简单的匿名函数,需要两个输入。分配给要调用的变量。 更新:让我们跳上索引潮流。节省4个字节。我已经超越了Python。通过使用函数节省了一个字节;打电话喜欢(...)(a)(b)。谢谢帕特里克·罗伯茨!

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

旧的原始版本,30字节(包括在内,不会融化到python answer中(;):

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

这不是那么聪明……
theonlygusti 2016年

15
@theonlygusti这是代码高尔夫,而不是人气竞赛。另外,如果有更简洁的解决方案,为什么还要浪费字节呢?
·奥布莱恩

我喜欢您选择的鼻子:b?
J Atkin

@JAtkin的确!
Conor O'Brien

4
您可以使用currying
Patrick Roberts


9

Haskell,28个字节

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

用法示例:False # True-> "ACD"

直接使用输入值作为防护。


9

MATL,15 17字节

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

输入是01在单独的行上。可替换地,0可通过取代F(MATL的false)和1T(MATL的true)。

在线尝试!

?           % 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个字节

假定C1和C2输入为原始0或1个字节。例如

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

打高尔夫球:

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

取消高尔夫:

                                      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
]

我相信,值得注意的是,该解决方案在事实基础上的,而循环爆发。



7

NTFJ,110字节

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

更具可读性:

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

那肯定很有趣。使用两个字符(或)作为输入,在这里尝试一下01

使用ETHProduction的方法将0、1(字符)转换为位,这变得更加简单。

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

这就是所说的方法。按下193(##~~~~~#@),将其|与最高输入值(在本例中为第一个字符代码48或49)进行与非()运算。这将产生1的254和0的255。########@根据输入对255()进行与非运算会产生0或1位。

~#~~~~~#@*

A由于所有输入均以开头,因此将打印出A。打印时*弹出A,因此堆栈与其之前的状态保持不变。

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

情况1:第一位是1,并(激活其中的代码。~#~~~~#~@*打印B,然后########@^按255并跳到代码中的该位置。这是程序的结束,它将终止。

情况2:第一位是0(跳至)并且代码继续。

~#~~~~##@*

这会打印一个C,因为这是下一个字符。

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

这会将我们的第二个输入转换为一点。

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

如果第二位是1,则继续打印E

:~||

这是我们的位的布尔取反的NAND表示A NAND (0 NAND A) = NOT A

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

现在,如果位是a 0,它将激活并打印E


5

Pyth,16个字节

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

测试套件

三元!

说明:

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

在两个连续的行上输入。


3
噢,pythmaster,让我们知道这个程序的方法。;)
Conor O'Brien

5

CJam,15 16 17字节

'Ali'B'C'Eli-+?

在线尝试!

@randomra减少了一个字节,@ Dennis减少了一个字节

说明:

'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

旧版本(16字节):

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

说明:

'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
我们的好朋友阿里和以利!
Conor O'Brien

5

Pyth,13个字符,19个字节

.HC@"૎્««"iQ2

以[a,b]形式输入

说明

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

在这里尝试

或使用测试套件


2
至少在UTF-8中,它重19个字节。
丹尼斯

1
bytesizematters使用一种完全构成的计数字节方式,该方式不(也不能)对应于实际的编码。它将平方的东西计数为每个2字节(在UTF-8中«为3个字节)和每个字节(在UTF-8中为2个字节)。无论wc一致认为,这是19个字节。
丹尼斯

4

C,76字节

我改名c1cc2Cresultr。C程序员竭尽所能避免goto。如果您曾经在C语言中使用过荒唐的语法,那很可能是因为您没有使用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:

不打高尔夫球

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:

你可以开始char r[4]="A";吗?我的C生锈了。
LarsH '16

声明String文字不是一种真正荒谬的方法吗?
Tamoghna Chowdhury

@TamoghnaChowdhury之类的。字符串文字不可写。它是一个数组,然后由字符串文字“ A” 初始化。由于“ A”仅设置前两个字节,因此剩余时间按照静态持续时间对象的规则(在这种情况下为0)初始化。[C99 6.7.8 / 22]

1
您可以通过更改初始化列表保存22个字节"AC"和更换都r[1]=67r[2]=69;r[2]=c2?68:69;

4

C,41个字节

我不确定该问题是否需要程序,函数或代码片段。
这是一个函数:

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

它以两个参数获取输入,必须为0或1(好,b必须),并输出到stdout。

a到的一个0x42410x4543410x444341。在小端ASCII系统上以字符串形式打印时,将提供所需的输出。


4

R41 39 37字节

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

在线尝试!

在R,TRUE并且FALSE被强制为10分别当您尝试使用它们作为数字。我们可以将这些数字转换成指数12以及3通过公式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

这些值然后被用于索引列表ACDACEAB以产生正确的输出。

由于JayCe,节省了两个字节。

相反,如果您更喜欢带有if语句的版本,则以下内容为41个字节:

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

在线尝试!



@JayCe谢谢,我已经更新了答案!
rturnbull



3

JavaScript,38个字节

使用无分隔符01代替false/true

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

1
您可以使用split` ` ,而不是split(" ")
andlrc

你也可以使用+('0b'+prompt()),而不是parseInt(prompt(),2)
andlrc


3

ArnoldC,423字节

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似乎没有正式输入,因此只需将前2个YOU SET US UP值更改为0或1。

说明

这只是一堆条件语句,它们说明了所有可能的输出。为什么,你可能会问?好吧,ArnoldC并没有真正的字符串理解功能。它甚至不能连接字符串!结果,我们不得不求助于更...低效...的方法。


嗯,如果a为true,则输出应为“ AB”,而不是“ ABD” /“ ABE”。那应该使您的代码更短!
Toby Speight

3

Java,28个字节

许多答案都一样。类型是BiFunction<Boolean,Boolean, String>

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

我知道已经快两年了,但是当您使用时,可以打一个(c,d)->字节。c->d->java.util.function.Function<Boolean, java.util.function.Function<Boolean, String>>
凯文·克鲁伊森

2

Pyth,21个字节

@c"ACE ACD AB AB"diz2

在这里尝试!

输入C1时,输入取0或1,而不是true / false。

说明

仅使用一个事实,即只有4种可能的结果。通过将输入解释为二进制,然后将其转换为10为基数,然后使用该值从查找字符串中选择正确的结果,从而工作。

@c“ ACE ACD AB AB” diz2#z =输入

                  iz2#将二进制输入转换为10
 c“ ACE ACD AB AB” d#在空格处分割字符串
@#获取索引处的元素

2

Y,20个字节

如果第一个输入为一个,则仅采用一个输入。我认为这种行为是允许的。在这里尝试!

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

取消高尔夫:

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

解释:

'B'A

B然后将字符压A入堆栈。

jh M

这需要一个输入,将其递增,弹出并在该部分数上移动。

情况1 :j1 = 0。这是更有趣的一个。r$反转堆栈并弹出一个值,压入'C'E字符CE@转换E为其对应的数字,从中减去第二个输入,然后将其重新转换为字符。r取消反转堆栈。然后,程序看到C链接并移至下一个链接p,并打印堆栈。

情况2:程序移至最后一个链接p,该链接仅打印整个堆栈。


2

PowerShell,40个字节

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

按输入索引的嵌套数组。在PowerShell中,$true/ 1$false/ 0实际上是等效的(由于非常宽松的类型转换),因此可以很好地将索引建立到两个元素的数组中。实际上,这与PowerShell一样接近三元组,而我在高尔夫运动中已经使用了很多次。

例子

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个字节

通过STDIN预期输入为1或0,并使用换行符分隔。

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

实际上,我在挑战期间发现了if语句的严重问题。D:这是破损的版本,但是很好用。(在解决问题后,我将对此进行更新)请注意,我已使用if / ifnot的修复程序更新了Vitsy。此更改不会给我带来任何好处,只能澄清一下。

说明:

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.

在线尝试!


2

蜂蜡,26字节

解释0为假,1为真。

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

输出:

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!

我的Github存储库克隆我的蜂蜡解释器。


我很确定您不需要引号。
地下

@undergroundmonorail:好的,我将更新我的解决方案。谢谢。
ML

2

C,47 45字节

由于只有3种不同的结果,因此我们可以选择以下三个字符串之一:

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

感谢Herman L 2个字节

演示版

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

链接到TIO pls
仅ASCII的

1

Perl,23个字节

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

需要-E| -M5.010标记并将输入作为1和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

要求-p为22 +1 = 23字节的替代解决方案:

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

say-<>?AB:-<>?ACD:ACE短两个字节。
nwellnhof '16


1

Japt,19个字节

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

在线测试!

有趣的事实:如果不是错误,则为16个字节:

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

错误是最严重的:|
科纳·奥布莱恩

2
@CᴏɴᴏʀO'BʀɪᴇɴLemme看看我是否可以挖掘出没有此错误的旧版本。那么这16个字节就是合法的。
ETHproductions 2016年

1
有什么错误?
CalculatorFeline

@CalculatorFeline我相信这样的嵌套字符串由于某种原因不会转换。
ETHproductions 2016年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.