ある悪い三者演算子は別のものに値する


18

今日のDaily 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を別の変数(たとえば、f=FailSafeまたはそのようなもの)に格納できますか?
ProgramFOX 14

@ProgramFOXそれは問題ありませんが、その割り当てはカウントに含まれます。FailSafeという名前の変数があるポイントに導く定型文のみが無料です。
billpg 14

コードをきれいに印刷していただけますか?または、課題を理解することは課題ですか?
ジョン・ドヴォルザーク

3
@JanDvorak私は私ができる...よく分からない
billpg

2
私はこれを願っています:pastebin.com/jzXt4fspを読むために進歩して
eithed

回答:


5

ルビー、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あなたを救うだろうと思います.。しかし、元のコードを解読しようとしていないことは認めます。
ピーターテイラー14

4

Rebol / Red:208文字

私はネストされた三項演算子が迷惑であることに同意することほどゴルフをすることに興味がありません...そしてこれに言及することは実際にRebol / Redの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)and ++ y] append case [x 0 ["特定の状態にある検出ゾーン"] x 1 ["悪い可視性"] x 3 ["初期化"] y 7 ["Bad configuration"] f> 0 ["Unknown"] 1 ["No Technical Alarms"]] ";"


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ではありませんが、最初の4ビットは0です)
    • 'Detection zones staying in a given state' 'Bad visibility' 'Initialization' 'Bad configuration'/⍨⌽⍵⊤⍨4/2:引数の最下位4ビットを取得し(⍵⊤⍨4/2)、逆に()、オンになっているビットの文字列を選択します(/⍨)。
  • '; '∘,¨'; '返された各文字列の前に追加し、
  • ⊃,/:すべての文字列を結合し、
  • 2↓:最初の2文字を削除します('; '先頭に余分な文字があるため)。

に変更⊃,/して2バイト節約します
アダム

3

ルビー、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

2

JavaScript、197 195文字

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ビットのみを参照するため、Unknownケースは実際には検出されません!)質問は、実際にそれを処理するか、「固定」アルゴリズムを提供するかです。
blabla999 14

@ blabla999:"Bad visibility"2ビットが設定されており、他の下位4ビットは設定されていないため、戻ります。Unknownケースは、下位4ビットのいずれも設定されていないときに起こるが、FailSafeある!= 0-ちょうど元のコード(と試みるのように16)。私たちは、「修正」この私を、(質問のコメントで)OPを依頼すべきでないかどうか...
Bergi

あなたは正しい-私は愚か。私はそのコードにとても混乱しました。そのために残念。
blabla999 14

2

ルビー、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 14

e+=["Initialization"]if f&4>3Pythonでこれが欲しいです。
ɐɔıʇǝɥʇuʎs

@ɐɔıʇǝɥʇuʎsに感心していません[]||=か?
ジョン・ドヴォルザーク

わからない、それが何をするか...また:since FailSafe must be a constant in Rubyえっ。Pythonの態度は、より「うん、あなたはのようなものであることが可能なものを破るが、期待しないでください、私は混乱を一掃するために、」
ɐɔıʇǝɥʇuʎs

1
@ɐɔıʇǝɥʇuʎs ||=は似て+=いますが、||-を使用した場合a ||= bと同等a = a || bです。一般に、偽の変数をデフォルト設定するために使用されます。
アーロンデュフォー14

1

VBScript、204 234 232文字

(編集:split()の代わりにarray()を使用してスコアを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:for b = 0to 3:s = s&split( ",;指定された状態のままの検出ゾーン;;視界不良;、;初期化,,, ;;構成不良"、 "、")(fおよび2 ^ b):next:split( "テクニカルアラームなし、不明、"&mid(s、3)、 "、")(2+(f = 0)+(len(s)= 0))

(オリジナル、230)

for b = 0to 3:s = s&split( ",;特定の状態のままの検出ゾーン;;悪い可視性,,;初期化,,,,;悪い構成"、 "、")(FailSafe and 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確かに。修繕。ありがとう!
JesterBLUE 14

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は、FailSafeがゼロの場合は16、範囲外の値の場合は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で短くなる可能性があります。次に、ベクトル内の最後の2つの文字列を交換します。

PS:最初のバージョンでは、ここでの他のソリューションが行うように、FailSafeが非負であると想定しています。2番目は、nilや他の非数値でも、何でも処理できます。


2
Unknownの設定?
ベルギ14

申し訳ありませんが、修正する必要があります。
blabla999 14

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'

何に起こったUnknownNo technical alarms
ベルギ14

3
あらら GolfScriptの答えを破ったときは疑わしいはずだった…
ライアンケネディ14

いつものように、私は...エッジケースを忘れてしまった
ライアン・ケネディ

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、208 197文字

$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'
}

コードを読み直してください:境界チェックはありません。
チタノフォールド14

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);
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.