一个坏的三元运算符应该得到另一个


18

今天的每日WTF引用以下代码行...

FailSafe==0?'No technical alarms':((FailSafe&1)!=0&&(FailSafe&2)!=0&&(FailSafe&4)!=0&&(FailSafe&8)!=0?'Detection zones staying in a given state; Bad visibility;
Initialization; Bad configuration':((FailSafe&1)!=0&&(FailSafe&2)!=0&&(FailSafe&4)!=0?'Detection zones staying in a given state; Bad visibility; Initialization':
((FailSafe&1)!=0&&(FailSafe&2)!=0&&(FailSafe&8)!=0?'Detection zones staying in a given state; Bad visibility; Bad configuration':((FailSafe&1)!=0&&(FailSafe&4)!=0&&
(FailSafe&8)!=0?'Detection zones staying in a given state; Initialization; Bad configuration':((FailSafe&2)!=0&&(FailSafe&4)!=0&&(FailSafe&8)!=0?'Bad visibility;
Initialization; Bad configuration':((FailSafe&1)!=0&&(FailSafe&2)!=0?'Detection zones staying in a given state; Bad visibility':((FailSafe&1)!=0&&(FailSafe&4)!=0?'Detection 
zones staying in a given state; Initialization':((FailSafe&1)!=0&&(FailSafe&8)!=0?'Detection zones staying in a given state; Bad configuration':((FailSafe&2)!=0&&
(FailSafe&4)!=0?'Bad visibility; Initialization':((FailSafe&2)!=0&&(FailSafe&8)!=0?'Bad visibility; Bad configuration':((FailSafe&4)!=0&&(FailSafe&8)!=0?'Initialization; Bad 
configuration':((FailSafe&1)!=0?'Detection zones staying in a given state':((FailSafe&2)!=0?'Bad visibility':((FailSafe&4)!=0?'Initialization':((FailSafe&8)!=0?'Bad 
configuration':'Unknown')))))))))))))))

编写一些代码,该代码采用一个名为FailSafe的整数值,并返回上述代码将从同一整数值生成的相同字符串。

  • 挑战是重写该行,因此“样板”代码是免费的,包括任何加载整数值并输出字符串的代码。只有执行上述从整数到字符串的转换的代码才算在内。
  • 只要您愿意,只要您选择的标识符具有相同的高尔夫球得分,就可以使用其他名称“ FailSafe”。
  • 无需调用外部资源即可执行查找。
  • 正常的代码高尔夫球规则适用。

是否可以将FailSafe存储在另一个变量中(例如,f=FailSafe类似的东西)?
ProgramFOX

@ProgramFOX很好,但是该分配包含在计数中。只有引导您到达名为FailSafe的变量的样板是免费的。
billpg

您能为我们漂亮地打印代码吗?还是理解挑战的挑战?
约翰·德沃夏克

3
@JanDvorak我不确定我可以...
billpg

2
我希望这样:pastebin.com/jzXt4fsp更好看
2014年

Answers:


5

Ruby,210个字符

与@Jan Dvorak的解决方案相似,但功能更多,但更短。

f=FailSafe
e=[f&1,f&2,f&4,f&8,1-f].zip(["Detection zones staying in a given state","Bad visibility","Initialization","Bad configuration","No technical alarms"]).map{|a,b|a>0&&b}-[!0]
e[0]||="Unknown"
e.join"; "

5

GolfScript,167个字符

FailSafe.15&["Unknown"][""]"Bad configuration
Initialization
Bad visibility
Detection zones staying in a given state"
n/{`{n+1$+}+%}/1>+=n%"; "*"No technical alarms"if

代码采用变量中的值FailSafe并将结果压入堆栈(即,如果作为独立程序运行则输出字符串)。您可以在线测试代码。

该代码基本上会生成所有16种可能结果的数组,并根据的最低4位选择错误消息FailSafe。然后最外层if处理零情况。


我认为可以节省您的时间or而不是if.。但是我承认我没有尝试破译原始代码。
彼得·泰勒

4

Rebol /红色:208个字符

我对打高尔夫球并不感兴趣,没有同意嵌套的三元运算符很烦人……并且提到这实际上对于Rebol / Red's CASE是一个很好的例子。它与SWITCH有关,并且确实有助于平整如下所示的内容:

f: FailSafe
append case [
    0 < f and 1 ["Detection zones staying in a given state"]
    1 < f and 2 ["Bad visibility"]
    3 < f and 4 ["Initialization"]
    7 < f and 8 ["Bad configuration"]
    f > 0 ["Unknown"]
    true ["No technical alarms"]
] "; "

有一个名为CASE / ALL的变体,它将实际运行所有条件,但是默认值仅在第一个条件出现后停止。

我将其“打高尔夫球”到208:

x:func [y] [y <(f:FailSafe)和++ y]附加大小写[x 0 [“检测区域保持在给定状态”] x 1 [“可见性差” x 3 [“初始化”] y 7 [“不良配置”] f> 0 [“未知”] 1 [“无技术警报”]]“;”


4

APL(172)

2↓⊃,/'; '∘,¨{⍵=0:⊂'No technical alarms'⋄0=16|⍵:⊂'Unknown'⋄'Detection zones staying in a given state' 'Bad visibility' 'Initialization' 'Bad configuration'/⍨⌽⍵⊤⍨4/2}FailSafe

说明:

  • {... }FailSafe:生成字符串
    • ⍵=0:⊂'No technical alarms'0情况
    • 0=16|⍵:⊂'Unknown'Unknown情况(FailSafe不为0,但前四位为)
    • 'Detection zones staying in a given state' 'Bad visibility' 'Initialization' 'Bad configuration'/⍨⌽⍵⊤⍨4/2:获取参数(⍵⊤⍨4/2)中的最低4位,取反(),并为(/⍨)上的位选择字符串。
  • '; '∘,¨:添加'; '到每个返回的字符串的开头,
  • ⊃,/:将所有字符串连接在一起,
  • 2↓:并删除前两个字符(因为'; '前面有一个额外的字符。)

通过更改⊃,/为保存两个字节
阿达姆(Adám)'17

3

Ruby,183个字符

[(f=FailSafe)<1?"No technical alarms":f&15<1?:Unknown:["Detection zones staying in a given state"*f[0],"Bad visibility"*f[1],"Initialization"*f[2],"Bad configuration"*f[3]]-[""]]*"; "

另一个Ruby解决方案,但比其他解决方案短一些。这是一个使用常量FailSafe(在Ruby中,所有大写标识符都是常量)来创建输出字符串的表达式。


在ruby中,应FailSafe在使用前声明常量(如)。和您代码提高uninitialized constant FailSafe

4
@Зелёный正如问题所指出:“编写一些代码,它们使用一个名为FailSafe的整数值”-因此,我的代码(像这里的所有其他答案一样)假定FailSafe已经定义。当您要运行代码时,必须首先自己定义常量。
Ventero 2014年

2

JavaScript,197195个字符

FailSafe?['Detection zones staying in a given state','Bad visibility','Initialization','Bad configuration'].filter(function(_,i){return FailSafe&1<<i}).join('; ')||'Unknown':'No technical alarms'

格式化:

FailSafe
  ? [ 'Detection zones staying in a given state',
      'Bad visibility',
      'Initialization',
      'Bad configuration'
    ].filter(function(_, i) {
      return FailSafe & 1<<i;
    }).join('; ') || 'Unknown'
  : 'No technical alarms';

可以通过使用ES6或Coffeescript函数表达式进一步减少。


如果FailSafe是18,该怎么办?(实际上,原始质询代码仅查看低4位,因此实际上从未检测到未知情况!)所以问题是,我们是否应该真正关心它还是提供“固定”算法。
blabla999 2014年

@ blabla999:它会返回,"Bad visibility"因为设置了2位,并且其他低4位都没有。该Unknown案件发生在没有低4位的设定,但是FailSafe!= 0-就像在原代码(尝试16)。我们是否应该“解决”这个问题,您应该问问OP(在对问题的评论中),而不是我…
Bergi 2014年

你说得对-我很傻。我对那段代码感到非常困惑。抱歉
blabla999

2

Ruby,213个字符

f=failSafe
e=f&1>0?["Detection zones staying in a given state"]:[]
e+=["Bad visibility"]if f&2>1
e+=["Initialization"]if f&4>3
e+=["Bad configuration"]if f&8>7
e[0]||=f>0?"Unknown":"No technical alarms"
e.join"; "

将其封装在函数体(def transform failSafe; ...; end)中即可正常工作。它也可以用作单个表达式(用括号括起来,因为分号/换行符的优先级最低),也可以e.join"; "用作在表达式中使用最后一个表达式()的语句序列。


我将添加一个规则以允许使用其他名称。
billpg

e+=["Initialization"]if f&4>3我想要在Python中使用。
ɐɔıʇǝɥʇuʎs

@ɐɔıʇǝɥʇuʎ对您印象深刻[]||=吗?
约翰·德沃夏克

不确定它的作用...另外:since FailSafe must be a constant in Ruby呵呵。Python的态度更像是“是的,你可以打破的东西,但不要指望来收拾残局”
ɐɔıʇǝɥʇuʎs

1
@ɐɔıʇǝɥʇuʎs ||=犹如+=||- a ||= b相当于a = a || b。当变量不正确时,通常用于默认变量。
亚伦·

1

VBScript,204,234,232个字符

(编辑:使用array()代替split()将得分提高了2。现在是232。)

f=failsafe:for b=0to 3:s=s&split(",; Detection zones staying in a given state,; Bad visibility,,; Initialization,,,,; Bad configuration",",")(f and 2^b):next:array("No technical alarms","Unknown",mid(s,3))(2+(f=0)+(len(s)=0))

(编辑:忘记了“未知”部分。现在有234个字符。)

f = failsafe:对于b = 0到3:s = s&split(“ ,;检测区域保持在给定状态,;可见性不良; b):next:split(“没有技术警报,未知,”&mid(s,3),“,”)(2+(f = 0)+(len(s)= 0))

(原版230)

对于b = 0到3:s = s&split(“ ;;检测区域保持在给定状态;;可见性很差,;;初始化”,“,”;差的配置“,”,“)(故障安全和2 ^ b):next :array(mid(s,3),“无技术警报”)(-(len(s)= 0))

当然,这只是脚本的一部分。要测试它,请尝试这样的事情:

FailSafe=cint(inputbox("Please enter Failsafe as an integer"))
f=failsafe:for b=0to 3:s=s&split(",; Detection zones staying in a given state,; Bad visibility,,; Initialization,,,,; Bad configuration",",")(f and 2^b):next
msgbox array("No technical alarms","Unknown",mid(s,3))(2+(f=0)+(len(s)=0))

我也忘记了未知案件;-)
blabla999 2014年

@ blabla999的确如此。固定。谢谢!
JesterBLUE 2014年

1

Smalltalk,243个字符

FailSave>15ifTrue:'Unknown'ifFalse:[((((1to:4)select:[:b|FailSafe isBitSet:b])collect:[:b|#('Detection zones staying in a given state' 'Bad visibility' 'Initialization' 'Bad configuration')at:b])asStringWith:'; ')ifEmpty:'No technical alarms']     

格式化以提高可读性:

FailSafe > 15 
    ifTrue:'Unknown'
    ifFalse:[
        ((((1 to:4)
            select:[:b | FailSafe isBitSet:b ])
                collect:[:b| 
                    #( 'Detection zones staying in a given state'
                       'Bad visibility'
                       'Initialization'
                       'Bad configuration') at:b ]
                    ) asStringWith:'; ')
                        ifEmpty:'No technical alarms']

感谢Bergi,指出了第一个版本中的错误。

这带来了一个想法:如果我将FailSafe值映射到6位掩码中(映射0-> 16并大于15-> 32),则可以摆脱最终测试。映射到6位掩码m可以通过以下方式完成:

m := {16},(1 to: 15) at:FailSafe+1 ifAbsent:32.

也就是说,对于零故障保护,m将为16;对于越界值,m将为32。然后如上所述选择并收集字符串。这给出了新代码:

m := {16},(1 to:15) at:FailSafe+1 ifAbsent:32.
(((1 to:6) select:[:b | m isBitSet:b ])
        collect:[:b| 
            #( 'Detection zones staying in a given state'
               'Bad visibility'
               'Initialization'
               'Bad configuration'
               'No technical alarms'        
               'Unknown') at:b ]
               ) joinWithAll:'; '

(我还将asStringWith:替换为joinWithAll:,这是一个别名)。

尽管这似乎是一个不错的主意,但这具有相同的字符数-叹气。也许其他一些具有更密集的运算符名称的编程语言在这里得分更高!

我可以通过不使用m的临时变量来节省一些字符,但可以在循环中重新计算它,并且不使用字符串向量的字面量数组来获得小于240个字符的计数。

最后,掩码m也可以由来计算m:={32},(1 to: 16) at:(FailSafe+1 min:17),在APL中可能更短。然后交换向量中的最后两个字符串。

PS:第一个版本假定FailSafe为非负值,就像此处的其他一些解决方案一样。第二个可以处理任何内容,甚至可以是nil或其他非数字。


2
Unknown配置呢?
Bergi 2014年

非常抱歉-我必须修复它。
blabla999

0

的CoffeeScript,161 160 221个字符

F = FailSafe;F<16 and (F and [0..3].filter((i)->(1<<i)&F).map((i)->(['Detection zones staying in a given state','Bad visibility','Initialization','Bad configuration'])[i]).join('; ') or 'No technical alarms') or 'Unknown'

发生了什么事Unknown,并No technical alarms
Bergi 2014年

3
糟糕 当我打败GolfScript答案时,我应该会感到怀疑...
Ryan Kennedy

一如既往,我忘记了极端情况……
赖安·肯尼迪

0

VB.net

Function StateText(f As FailFlag) As String
  If f=0 Then Return "No Technical Alarm"
  Dim t=""
  If f.HasFlag(f1) Then t &= "Detection zones staying in a given state; "
  If f.HasFlag(f2) Then t &= "Bad visibility; "
  If f.HasFlag(f4) Then t &= "Initialization; "
  If f.HasFlag(f8) Then t &= "Bad configuration; "
  Return If( t<>"", t.TrimEnd("; "),"Unknown")
End Function

<Flags>
Enum FailFlag
  f1 = 1
  f2 = 2
  f4 = 4
  f8 = 8
End Enum

编辑:更好的进入

Function StateText(f As FailFlag) As String
  If f = 0 Then Return "No Technical Alarm"
  Dim t = String.Join("; ",
            From e In [Enum].GetValues(GetType(FailFlag))
            Where f.HasFlag(e)
            Select [Enum].GetName(GetType(FailFlag), e).Replace("_", " "))
  Return If( t<>"", t,"Unknown")
End Function

<Flags>
Enum FailFlag
  Detection_zones_staying_in_a_given_state = 1
  Bad_visibility = 2
  Initialization = 4
  Bad_configuration = 8
End Enum

0

Perl,208197个字符

$f=$FailSafe;%m=(1,'Detection zones staying in a given state',2,'Bad visibility',4,'Initialization',8,'Bad configuration');($f?join'; ',@m{map{$f&$_?$_:()}1,2,4,8}:'No technical alarms')||'Unknown'

使用样板代码使其工作:

#!/usr/bin/env perl
$FailSafe=17;
print failmsg() . "\n";

sub failmsg {
$f=$FailSafe;%m=(1,'Detection zones staying in a given state',2,'Bad visibility',4,'Initialization',8,'Bad configuration');($f?join'; ',@m{map{$f&$_?$_:()}1,2,4,8}:'No technical alarms')||'Unknown'
}

重新阅读代码:没有边界检查。
titanofold 2014年

0

Java 275个字符 (不计算不必要的空格)

    String s = "";
    int b = 1;
    for (String m : new String[]{"Detection zones staying in a given state; ","Bad visibility; ", "Initialization; ", "Bad configuration; "}) {
        if ((FailSafe & b) != 0) s = s + m;
        b <<= 1;
    }
    return (s.length() == 0) ? (FailSafe == 0) ? "No technical alarms" : "Unknown" : s.substring(0, s.length() - 2);
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.