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는 아님) 과 마찬가지로 올바른 연관성을 갖습니다 .
일반 규칙:
- 이것은 code-golf 이므로 바이트 단위의 최단 답변이 이깁니다.
코드 골프 언어가 코드 골프 언어 이외의 언어로 답변을 게시하지 못하게하십시오. ‘모든’프로그래밍 언어에 대한 가능한 한 짧은 대답을 생각해보십시오. - 표준 규칙이 답변에 적용 되므로 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
합니다.
+
중첩 된 if
s를 처리하려면 스테이지를 반복하십시오 .
;.{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.$_
답변
답변
자바 (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에서 영감을 얻은 다중 선택 기반의 모달 편집기입니다.
-
x
전체 라인을 선택 -
s
…<ret>
정규식으로 선택을 필터링합니다\w=(?!=)
. 이는 모든 변수 할당과 일치하고==
비교 와 일치하지 않습니다. -
d
각 선택을 삭제하고 내용을 기본 레지스터에 넣습니다. -
<a-h>
모든 선택을 줄의 시작 부분으로 확장 -
P
각 선택 전에 기본 레지스터의 내용을 붙여 넣습니다 -
s
…<ret>
정규식으로 선택을 필터링하십시오.if.
-
d
각 선택을 삭제 -
f
각 선택을 다음으로 확장)
-
;
각 선택을 커서로 줄입니다. -
r
각 선택의 각 문자를?
-
x
전체 라인을 선택 -
s
…로<ret>
선택을 필터링;else<space>
-
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]