삼항 if 변환기


18

Java / .NET / C / JavaScript 등에서 삼항 -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";

다음과 같은 경우 3 항으로 단축 할 수 있습니다.

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

도전:

입력 : 단일 변수를 설정하는 정규 if-else (중첩 가능).

출력 : 변환 된 3 진 -if.

도전 규칙 :

  • 대괄호없이 모든 if-else 사례가 가능하다고 가정 할 수 있습니다 (따라서 각 if / else-if / else 블록에는 단일 본문이 있음).
  • 공백, 탭 또는 줄 바꿈이 없다고 가정 할 수 있습니다 else( 단, 공백 포함 else if).
  • 사용 된 변수 이름은 항상 단일 소문자 ( [a-z]) 라고 가정 할 수 있습니다 .
  • 변수에 주어진 값은 다음 중 하나 일 수 있습니다.
    • 큰 따옴표로 묶어야합니다 (예 : (공백 / 탭 / 새 라인이없는) 문자열 "Test", "SomeString", "Example_string", 등). 문자열에 하위 문자열 if이나 else, 공백, 탭, 줄 바꿈, 이스케이프 된 큰 따옴표 또는 문자가 포함되지 않을 것이라고 가정 할 수 있습니다 =. 문자를 포함 할 수 ><(){}[];?:!&|있지만 인쇄 가능한 ASCII 범위 ( ['!' (33), '~' (126)]) 에만 있습니다.
    • 정수 (예 0, 123, -55, 등)
    • 소수 (예 0.0, 0.123, -55.55, 등)
  • 값이 혼합되지 않습니다. 따라서 할당 된 모든 변수는 정수이며 일부는 정수가 아니며 일부는 문자열입니다.
  • 괄호 안의 조건은 다음과 같은 문자를 포함 할 수 있습니다 =<>!+-/*%&|[], a-z, 0-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

@tsh 죄송합니다. 근무일 후 저녁 늦게 테스트 사례를 추가해서는 안됩니다.
Kevin Cruijssen

2
JavaScript Compressor Closure Compiler 는 이러한 모든 테스트 케이스에서 훌륭하게 작동합니다. 주어진 입력을 취할 때 예상되는 출력을 생성하는 것입니다. 그러나 나는 그것을 대답으로 주장 할 수없는 것 같습니다. 그래서 여기에 의견을 남기고 싶습니다.
tsh

답변:


5

레티 나 0.8.2 , 32 바이트

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

온라인으로 사용해보십시오! 설명:

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

if조건 앞에 할당을 이동하고 a를 추가하여 할당 바로 앞에 처리합니다 ?. 스테이지는 오른쪽에서 왼쪽으로 일치하여 과제에 가장 가까운 if를 얻도록 하고 실수로 \)일치하지 않도록 else합니다.

+

중첩 된 ifs를 처리하려면 스테이지를 반복하십시오 .

;.{6}=
:

남아있는 과제는 else들 때문에 교체 ;else ?=로모그래퍼 :.


@nwellnhof 지적 해 주셔서 감사합니다. 테스트 케이스에서 작동했기 때문에 내가 1 바이트를 골프로 칠 것이라고 생각했습니다.
Neil

6

파이썬 (2) , 126 (121) 120 114 100 바이트

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

온라인으로 사용해보십시오!


저장 됨 :

  • Kevin Cruijssen 덕분에 -1 바이트

@KevinCruijssen 감사합니다 :)
TFeld

1
가져 오기 전에 함수 정의가 왜 필요한가요?
Skyler

@Skyler 실제로 중요하지는 않지만 이런 식으로 헤더에 과제를 넣는 것이 더 쉽습니다.
Jo King

6

Perl 5 -p, 50 49 48 바이트

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

온라인으로 사용해보십시오!

48 바이트 버전은 Neil의 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

자바 (JDK) , 119116 바이트

거의 완전히 순수한 정규식 솔루션으로 다른 두 가지 답변에서 약간 다듬어지고 변경되었습니다.

Kevin의 정규식 속임수 덕분에 -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 바이트를 시도하십시오 .
Kevin Cruijssen

@KevinCruijssen 건배! 나는 정규 표현식을 줄이기 위해 너무 오랫동안 보냈다. 나는 그것을 놓쳤다는 것을 믿을 수 없다!
Luke Stevens

3

카쿠 네 v2018.09.04 , 43 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에 추가 할 수 있는지 문의하십시오 .
Kevin Cruijssen

1
@KevinCruijssen 나는 테스트 사례 중 하나의 gif를 추가했습니다. 그것들 모두에서 작동하지만 GIF를 만드는 것은 사소한 것이 아닙니다.
Vaelus

설명과 gif, +1 감사합니다. :) 항상 새로운 언어를 배우는 것이 좋습니다.
Kevin Cruijssen

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]

온라인으로 사용해보십시오!


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.