Ternary-ifコンバーター


18

Java / .NET / C / JavaScript /など。ternary-ifを使用してif文を短縮できます。

例(Javaの場合):

// there is a String `s` and an int `i`
if(i<0)s="Neg";else if(i>0)s="Pos";else s="Neut";

ternary-ifで短縮できます:

s=i<0?"Neg":i>0?"Pos":"Neut";

チャレンジ:

入力:単一の変数を設定する通常のif-else(ネスト可能)。

出力:変換されたternary-if。

チャレンジルール:

  • 括弧なしですべてのif-elseケースが可能であると想定できます(したがって、各if / else-if / elseブロックには単一のボディがあります)。
  • 各スペースの後の単一のスペースelse(を含むelse if)を除き、スペース、タブ、改行はないものと想定できます。
  • 使用される変数名は常に単一の小文字([a-z])であると想定できます。
  • 変数に指定される値は、次のいずれかです。
    • 文字列(空白/タブ/改行なし)、二重引用符(すなわち囲まれる"Test""SomeString""Example_string"、など)。文字列にサブストリングifまたはが含まれることはelseなく、スペース、タブ、改行、(エスケープされた)二重引用符、または文字が含まれないことも想定できます=。文字を含めることができます><(){}[];?:!&|が、印刷可能なASCII範囲(['!' (33), '~' (126)])のみになります。
    • 整数(すなわち0123-55、など)
    • 小数(すなわち0.00.123-55.55、など)
  • 値が混在することはありません。したがって、割り当てられる変数はすべて整数であり、一部は整数ではなく、一部は文字列ではありません。
  • 括弧内の条件は、次の文字を含めることができ=<>!+-/*%&|[]a-z0-9。内側の括弧が存在しないと仮定することもできます。また、複数の文字が使用される(混乱させる)フィールドは存在しないと仮定することもできます(などif(if<0))。
  • i*=10代わりにのようなショートカットはないと仮定できi=i*10ます。
  • ぶら下がりのelseケースを処理する必要はないので、すべてifをペアリングできますelse。すなわちif(a)if(b)r=0;else r=1;、可能な入力ケースではありません。if(a)if(b)r=0;else r=1;else r=2;またはif(a&&b)r=0;else if(a&&!b)r=1;else r=-1;しかし。
  • I / Oは柔軟です。入力と出力は、文字列、文字のリスト、STDINからの読み取り、STDOUTへの出力などです。
  • ほとんどの言語の標準であるように、すべての3項には正しい結合性があります(ただし、たとえばPHPにはありません)。

一般的なルール:

  • これはであるため、バイト単位の最短回答が優先されます。
    コードゴルフ言語では、非コードゴルフ言語で回答を投稿しないようにしてください。「任意の」プログラミング言語の可能な限り短い答えを考えてみてください。
  • 回答には標準の規則が適用されるため、STDIN / STDOUT、適切なパラメーターと戻り値型、完全なプログラムを備えた関数/メソッドを使用できます。あなたの電話。
  • デフォルトの抜け穴は禁止されています。
  • 可能であれば、コードのテストへのリンクを追加してください。
  • また、可能であれば説明を追加してください。

テストケース:

Input:   if(i<0)s="Neg";else if(i>0)s="Pos";else s="Neut";
Output:  s=i<0?"Neg":i>0?"Pos":"Neut";

Input:   if(i%2<1)r=10;else r=20;
Output:  r=i%2<1?10:20;

Input:   if(n<10)if(m<0)i=0;else i=10;else if(m<0)i=-1;else i=1;
Output:  i=n<10?m<0?0:10:m<0?-1:1;

Input:   if(i==1)i=0.0;else i=0.25;
Output:  i=i==1?0.0:0.25;

Input:   if(!a)if(b)r=0;else r=1;else r=2;
Output:  r=!a?b?0:1:2;

Input:   if(a)if(b)r=0;else r=1;else if(c)r=2;else r=3;
Output:  r=a?b?0:1:c?2:3;

Input:   if(a&&b)r=0;else if(a&&!b)r=1;else r=-1;
Output:  r=a&&b?0:a&&!b?1:-1;

Input:   if(i[0]>0)if(j>0)if(q>0)r="q";else r="j";else r="i";else r="other";
Output:  r=i[0]>0?j>0?q>0?"q":"j":"i":"other";

Input:   if(i>0)r="i";else if(j>0)r="j";else if(q>0)r="q";else r="other";
Output:  r=i>0?"i":j>0?"j":q>0?"q":"other";

Input:   if(a>0)if(a<2)x="one";else if(a<3)x="two";else if(a<4)x="three";else x="other";else x="other";
Output:  x=a>0?a<2?"one":a<3?"two":a<4?"three":"other":"other";

Input:   if(b[0]<=b[1])q=5;else if(b[0]==null)q=0;else q=-10;
Output:  q=b[0]<=b[1]?5:b[0]==null?0:-10;

技術的には、F#if ... then ... elseでは三項演算子です。したがって、あなたが書くlet result = if 10 > 100 then 99 else -99場合の値はにresultなります-99
Ciaran_McCarthy

1
@Ciaran_McCarthyデフォルトでは条件式を持つすべての機能学習言語ではないにしても、ほとんどの場合に当てはまると思います。Clojure、Scala、およびHaskellは同じです。
発癌性

@tshおっと..仕事の一日の後、夜遅くにテストケースを追加すべきではありません。
ケビンクルーイッセン

2
JavaScript Compressor Closure Compilerは、これらすべてのテストケースでうまく機能します。与えられた入力を取得すると、期待される出力が生成されるだけです。しかし、私はそれを答えとして主張できないようです。ここでコメントしたいと思います。
tsh

回答:


5

Retina 0.8.2、32バイト

+r`if.(.*?)\)(.=)
$2$1?
;.{6}=
:

オンラインでお試しください!説明:

r`if.(.*?)\)(.=)
$2$1?

if条件の前に割り当てを移動し、を追加することにより、割り当ての直前にを処理し?ます。ステージは右から左にマッチングされ、割り当てに最も近いifを取得しますが、誤って\)マッチングelseしないようにします。

+

ステージを繰り返して、ネストされたifsを処理します。

;.{6}=
:

残りの割り当てはelsesがそう置き換える;else ?=:


@nwellnhof指摘してくれてありがとう。それはテストケースで動作したので、私はそこからバイトをゴルフしていると思った。
ニール

6

パイソン2126の 121 120 114 100バイト

lambda s:findall(' (.=)',s)[0]+sub('if.(.*?)\)(.=)?',r'\1?',sub('.{5} (.=)?',':',s))
from re import*

オンラインでお試しください!


保存済み:

  • -1バイト、Kevin Cruijssenのおかげ

@KevinCruijssenありがとう:)
TFeld

1
インポート前の関数定義はなぜですか?
スカイラー

これは、実際には問題ではないが、それはヘッダにこのように割り当てを置くために簡単だ@Skyler
ジョー・キング

6

Perl 5 -p、50 49 48バイト

s/if.(.*?)\)(.=)/\2\1?/g;s/.if./?/g;s/;.{6}=/:/g

オンラインでお試しください!

48バイトバージョンは、ニールのRetina回答に触発されています。

説明

# Replace "if(e1)if(e2)x=" with "x=e1)if(e2?"
s/if.(.*?)\)(.=)/\2\1?/g;
# Replace ")if(" with "?"
s/.if./?/g;
# Replace ";else x=" with ":"
s/;.{6}=/:/g

古い49バイトソリューション

s/.{5} (.=)?/:/g;s/if.(.*?)\)(.=)?/\1?/g;$_=$2.$_


3

Java(JDK)119 116バイト

ほぼ完全に純粋な正規表現ソリューションであり、他のいくつかの回答から少し切り刻まれて変更されました。

ケビンからの正規表現のトリックのおかげで-3バイト

s->s.replaceAll(".*(.=).*","$1$0").replaceAll("if.(.*?)\\)","$1?").replaceAll("([ ?]).=","$1").replace(";else ",":")

オンラインでお試しください!

説明

s->                                         // Lambda function taking a String
   s.replaceAll(".*(.=).*","$1$0")          // Find assigned variable and append to start of String
    .replaceAll("if.(.*?)\\)","$1?")        // Replace any 'if' statements with their condition
                                            // followed by '?'
    .replaceAll("([? ]).=","$1")            // Remove all assignments after a '?' or space
    .replace(";else ",":");                 // Simple replace (no regex) to remove 'else' statements

1
私は".*(.=).*","$1$0"あなたが使用したことが好きで、それは"^(.*)(.=)","$2$1"私が思っていたよりも1バイト短いです。:)とにかく、あなたが変化する2バイト節約することができますif\\(にはif.、追加のバイトが変更(\\?| )([? ])オンラインで116バイト試してください。
ケビンCruijssen

@KevinCruijssen乾杯!私は正規表現を削り取ろうとして非常に長い時間を費やしました。
ルークスティーブンス

3

Kakouneのv2018.09.0443の 38 37バイト

xs\w=(?!=)<ret>d<a-h>Psif.<ret>df);r?xs;else<space><ret>c:<esc>

説明:

Kakouneは、Vimに触発された複数選択ベースのモーダルエディターです。

  1. x 行全体を選択

  2. s... すべての変数の割り当てに一致し、比較には一致しない<ret>正規表現\w=(?!=)で選択をフィルタリングします==

  3. d 各選択を削除し、その内容をデフォルトのレジスタに入れます

  4. <a-h> すべての選択を行の先頭まで拡張します

  5. P 各選択の前にデフォルトのレジスタの内容を貼り付けます

  6. s... <ret>正規表現で選択をフィルタリングするif.

  7. d 各選択を削除する

  8. f 各選択を次の項目に拡張します )

  9. ; 各選択をそのカーソルに減らします

  10. r 各選択の各文字を置き換えます ?

  11. x 行全体を選択

  12. s... <ret>で選択をフィルタリングする;else<space>

  13. c... <esc>各選択をクリアして、次のものに置き換えます:

テストケースのコードのアニメーション:

コードインアクション


1
うーん、カコウネのことは聞いたことがありません。オンラインコンパイラはありませんか?そうでない場合は、テストケースのスクリーンショットを追加して、意図したとおりに動作することを確認できますか?また、これがあなたの言語である場合は、talk.tryitonline.netチャットで Dennisに連絡して、TIOに追加できるかどうかを尋ねることができます。
ケビンCruijssen

1
@KevinCruijssenテストケースの1つのgifを追加しました。それらのすべてで機能しますが、gifの作成は簡単ではありません。
-Vaelus

説明とgifをありがとう、私から+1。:)新しい言語について学ぶことは常に素晴らしい。
ケビンCruijssen


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