삼항 if 변환기 줄 바꿈, 이스케이프 된 큰 따옴표 또는

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;


답변

레티 나 0.8.2 , 32 바이트

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

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

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

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

+

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

;.{6}=
:

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


답변

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

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

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


저장 됨 :

  • Kevin Cruijssen 덕분에 -1 바이트

답변

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.$_

답변

루비 , 72 71 바이트

->s{$a=$2while s.gsub!(/if.(.*?)\)(.=)?(.*?);\w* (.=)?/,'\1?\3:');$a+s}

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


답변

자바 (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

답변

카쿠 네 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>각 선택을 지우고:

테스트 케이스에서 코드 애니메이션 :


답변

면도 , 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]

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