三进制if转换器


18

在Java / .NET / C / JavaScript / etc中。您可以使用三元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";

可以通过三元数缩短为:

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

挑战:

输入:设置单个变量的常规if-else(可以嵌套)。

输出:转换后的三进制-if。

挑战规则:

  • 您可以假设所有if-else情况都可能没有括号(因此,每个if / else-if / else块都有一个主体)。
  • 您可以假设将没有任何空格,制表符或换行符,除了每个空格,制表符或换行符else(包括处的else if)之外。
  • 您可以假设使用的变量名始终是一个小写字母([a-z])。
  • 赋予变量的值可以是以下之一:
    • 字符串(不带空格/选项卡/新线),这将通过双引号包围(即"Test""SomeString""Example_string"等等)。您可以假定字符串将永远不包含子字符串ifelse,也不包含空格,制表符,换行符(转义的双引号)或字符=。它可以包含字符><(){}[];?:!&|,但只能在可打印的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等。您的呼叫。
  • 所有三元都将具有正确的关联性,这在大多数语言中都是标准的(但在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相同。
Carcigenicate '18

@tsh糟糕,。我不应该在工作一天后的深夜添加测试用例。
凯文·克鲁伊森

2
JavaScript Compressor Closure Compiler在所有这些测试用例上都可以很好地工作。当采用给定的输入时,它将仅产生预期的输出。但似乎我不能要求它作为答案。所以我想在这里发表评论。
tsh

Answers:


5

视网膜0.8.2,32字节

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

在线尝试!说明:

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

处理的if立即通过移动条件之前的分配和附加一个分配之前?。该阶段从右到左匹配,以确保我们最接近分配,而\)确保我们不会else错误地匹配。

+

重复此步骤以照顾嵌套ifs。

;.{6}=
:

任何剩余的分配是else如此的替换;else ?=:


@nwellnhof感谢您指出这一点;我以为我在那打高尔夫球,因为它可以在测试用例上工作。
尼尔

6

Python 2中126个 121 120 114 100字节

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

在线尝试!


已保存:

  • -1个字节,感谢Kevin Cruijssen

@KevinCruijssen谢谢:)
TF

1
为什么在导入之前定义函数?
斯凯勒

@Skyler其实并不重要,但是将作业以这种方式放在页眉中比较容易
Jo King

6

Perl 5 -p,50 49 48字节

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

在线尝试!

48字节版本的灵感来自尼尔的视网膜答案。

说明

# 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)119116字节

几乎完全是纯正则表达式的解决方案,从其他几个答案中切入并做了一些改动。

-3个字节,得益于Kevin的一些正则表达式技巧

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字节
凯文·克鲁伊森

@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
嗯,我以前从未听说过Kakoune。我猜这里没有在线编译器吗?如果没有,您是否可以添加一些测试用例的屏幕截图,以便我可以验证它是否按预期工作?另外,如果这是您的语言,则可以在talk.tryitonline.net聊天室中与Dennis联系,询问他是否可以将其添加到TIO中
凯文·克鲁伊森

1
@KevinCruijssen我添加了其中一个测试用例的gif。它适用于所有这些对象,但是制作gif并非易事。
Vaelus

感谢您的解释和gif,我+1。:)总是很高兴了解一种新语言。
凯文·克鲁伊森

2

干净386个 375 216 196 189字节

看,没有正则表达式!

import StdEnv,Data.List
?[_,'=':b]= $b
?b= $b
$['if(':s]#(h,[_:t])=span((<>)')')s
=h++['?': ?t]
$[';else ':s]=[':': ?s]
$[a:b]|b>[]=[a: $b]=b
@s=hd[[v,e: $s]\\['else ',v,e=:'=':_]<-tails s]

在线尝试!


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.