글쎄, 그건 이상하다. .. 아니, 심지어 짝수입니다!


70

전문

정수 는 항상 짝수 또는 홀수 입니다. 정수조차도 2로 나눌 수 있고 홀수는 아닙니다.

두 개의 정수를 추가하면 summand가 짝수인지 홀수인지에 따라 결과가 짝수인지 홀수인지 유추 할 수 있습니다.

  • 짝수 + 짝수 = 짝수
  • 짝수 + 홀수 = 홀수
  • 홀수 + 짝수 = 홀수
  • 홀수 + 홀수 = 짝수

마찬가지로 두 정수를 곱하면 인수가 짝수인지 홀수인지에 따라 결과가 짝수인지 홀수인지를 유추 할 수 있습니다.

  • 짝수 * 짝수 = 짝수
  • 짝수 * 홀수 = 짝수
  • 홀수 * 짝수 = 짝수
  • 홀수 * 홀수 = 홀수

따라서 덧셈과 곱셈 만 포함하는 수학 표현식에서 모든 변수의 균등 또는 홀수를 알면 결과가 짝수인지 홀수인지 유추 할 수 있습니다.

예를 들어 (68 + 99) * 37짝수 + 홀수 ( 68 + 99)는 홀수이고 홀수 배는 다른 홀수 ( odd * 37)가 홀수이기 때문에 결과는 홀수 라고 확신 할 수 있습니다 .

도전

네 개의 문자 만 포함 된 문자열을받는 프로그램이나 함수를 작성하십시오 eo+*. 이 문자열은 덧셈 ( )과 곱셈 ( ) 만 포함하는 접두사 표기법으로 주어진 수학적 표현을 나타냅니다 . 각각 은 임의의 짝수를 나타내고 각각 은 임의의 홀수를 나타냅니다.+*eo

당신의 작업은 표현, 인쇄 또는 단일 반환 단순화하는 것입니다 e또는 o식의 결과가 짝수 또는 홀수인지에 따라 있습니다.

입력은 항상 유효한 접두사 표기법으로 가정합니다. 즉, 각 +과 *항상 대응 후에 발생한 두 피연산자를 가질 것이다. 이 피연산자는 단일 e또는 또는 피연산자가있는 o다른 표현식 +또는 *표현식 일 수 있습니다 .

예를 들어, 입력 *+eoo을로 읽 mul(add(e, o), o)거나 (e + o) * o일반 접두사 표기법 으로 읽을 수 있습니다 . e상기 첫번째 o에 대응하는 피연산자 +및 +eo상기 최후 o에 대응하는 오퍼랜드이다 *.

명확히하기 위해 잘못된 접두사 표기법이있는 잘못된 입력이 있습니다.

eo
ooe
o+e
ee*
+*oe
+e*o

출력에서 단일 후행 줄 바꿈은 괜찮지 만 그렇지 않으면 e짝수 또는 o홀수에 대한 평문 이 출력되어야합니다.

바이트 단위의 가장 짧은 코드가 이깁니다.

테스트 사례

빈 줄은 유사한 경우를 시각적으로 구분하는 데 도움이됩니다.

e -> e
o -> o

+ee -> e
+eo -> o
+oe -> o
+oo -> e
*ee -> e
*eo -> e
*oe -> e
*oo -> o

+e+ee -> e
+e+eo -> o
+e+oe -> o
+e+oo -> e
+e*ee -> e
+e*eo -> e
+e*oe -> e
+e*oo -> o

+o+ee -> o
+o+eo -> e
+o+oe -> e
+o+oo -> o
+o*ee -> o
+o*eo -> o
+o*oe -> o
+o*oo -> e

*e+ee -> e
*e+eo -> e
*e+oe -> e
*e+oo -> e
*e*ee -> e
*e*eo -> e
*e*oe -> e
*e*oo -> e

*o+ee -> e
*o+eo -> o
*o+oe -> o
*o+oo -> e
*o*ee -> e
*o*eo -> e
*o*oe -> e
*o*oo -> o

++eee -> e
++eeo -> o
++eoe -> o
++eoo -> e
++oee -> o
++oeo -> e
++ooe -> e
++ooo -> o

+*eee -> e
+*eeo -> o
+*eoe -> e
+*eoo -> o
+*oee -> e
+*oeo -> o
+*ooe -> o
+*ooo -> e

*+eee -> e
*+eeo -> e
*+eoe -> e
*+eoo -> o
*+oee -> e
*+oeo -> o
*+ooe -> e
*+ooo -> e

**eee -> e
**eeo -> e
**eoe -> e
**eoo -> e
**oee -> e
**oeo -> e
**ooe -> e
**ooo -> o

+e+e+e+ee -> e
+o+o+o+oo -> o
*e*e*e*ee -> e
*o*o*o*oo -> o
+e+o+e+oe -> e
+o+e+o+eo -> o
*e*o*e*oe -> e
*o*e*o*eo -> e
+e*e+e*ee -> e
+o*o+o*oo -> o
*e+e*e+ee -> e
*o+o*o+oo -> o

+**++*+*eeoeeooee -> e
+**++*+***eooeoeooeoe -> e
+**+***+**++**+eooeoeeoeeoeooeo -> o

+e*o*e**eoe -> e
+*e+e+o+e**eeoe -> e
**o++*ee*++eoe*eo+eoo -> o

8
입력으로 e와 o 대신 1과 0을 사용할 수 있습니까?
— ghosts_in_the_code

8
@ghosts_in_the_code 아니요, 죄송합니다.
— Calvin 's Hobbies

2
evalOK를 사용하고 있습니까?
— xnor

1
@xnor 물론입니다. 뭐든간에
— Calvin 's Hobbies

2
나는 이것을 사용하여 이미 게시 된 13 바이트를 이길 수는 없지만, 덧셈이 배타적 또는 곱셈과 단순하거나 일치한다는 것을 알았습니다.
— WGroleau

답변:


43

CJam, 18 17 13 바이트

4 바이트를 절약 해 준 aditsu에게 감사합니다.

qW:O%eu~"eo"=

여기서 테스트 스위트를 사용해보십시오. (테스트 스위트가 퍼머 링크에 비해 너무 깁니다. 챌린지 사양에서 복사하십시오.)

설명

q     e# Read the input.
W:O   e# Push a -1 and store it in variable O.
%     e# Use the -1 to reverse the string, because CJam's stack-based nature and the
      e# commutativity of the operators means we can evaluate the code in postfix notation.
eu    e# Convert the string to upper case, turning 'e' into 'E' (a variable with even value
      e# 14) and 'o' into 'O' (which we've stored the odd value -1 in).
~     e# Evaluate the string as CJam code, leaving the result on the stack.
"eo"= e# Use the result as an index into the string "eo". CJam's indexing is cyclic so it
      e# automatically takes inputs modulo 2. Negative indices also work as expected.

27

Pyth, 16 14 바이트

@"eo".vjdXzGU9

Pyth 자체는 문자열, 즉 Pyth 구문으로 평가할 수 있습니다. 그러므로 나는 대체 e와 o와 4와 5. 그런 다음 평가는 짝수 또는 홀수를 제공하며 결과를 쉽게 인쇄 할 수 있습니다.

온라인으로 사용해보십시오 : 데모 또는 테스트 스위트

설명:

@"eo".vjdXzGU9   implicit: z = input string
         XzGU9   replace "e" in z with 4 and "o" with 5
       jd        put a space between each char
     .v          evaluate it (Pyth style)
@"eo"            and print "e" or "o"

교체에 대한 추가 설명. G알파벳으로 초기화 된 변수입니다 abc...xyz. U9목록 [0, 1, ..., 8]입니다. XzGU9알파벳 문자를 목록의 값으로 바꿉니다. 그래서 a으로 대체됩니다 0, b와 함께 1, ..., e와 4, ..., i와 8, j와 0, ..., 및 o과 5. 따라서 나는 짝수와 홀수 e로 대체됩니다 o. 다른 모든 교체품은 전혀 효과가 없습니다.


왜 표현을 뒤집어 놓습니까? 또한 결과 modulo 2를 취할 필요가 없거나 인덱싱 랩핑이 필요합니까?
— xnor

@xnor 문자열의 요소에 액세스하는 것은 모듈로 줄 바꿈이 수행됩니다. 그래서 모듈 2에 대한 필요가 없습니다
— Jakube

@xnor 그러나 반대의 일에 감사드립니다. 물론 이것은 필요하지 않습니다. (저는 오늘 조금 피곤합니다.)
— Jakube

16

펄, 50 45 40 자

(39 자 코드 + 1 자 명령 행 옵션)

1while s/\+oe|\+eo|\*oo/o/||s/\W\w\w/e/

샘플 실행 :

bash-4.3$ echo -n '**o++*ee*++eoe*eo+eoo' | perl -pe '1while s/\+oe|\+eo|\*oo/o/||s/\W\w\w/e/'
o

어때요 while/../?
— primo December

도 나 바보 야 실제로 그 sed버전 을 사용하면서 그 조건을 사용했습니다 … 감사합니다, @primo.
— manatwork

또는 더 좋습니다 1while s/\+oe.... 또한 [+*]로 교체 할 수 있다고 확신 \W합니다.
— primo December

다시 한번 감사드립니다, @primo. 한 번에 단일 솔루션에 집중해야한다고 생각합니다. ( gema나를 화나게…)
— manatwork

Sed와 동일한 접근 방식은 이제 2 바이트 더 짧습니다!
— Digital Trauma

13

망막 , 29 바이트

(+`\*oo|\+(eo|oe)
o
\W\w\w
e

편리한 하나의 파일 버전을 위해 -s플래그가 사용됩니다.

우리는 이상한 표정 (교환 *oo, +oe, +eo에) o우리가 다음에 나머지 기호 문자 문자 표현을 교환 할 수있을 때까지를 e. 우리는 할 수있을 때까지 이것을 반복하고 마지막 한 글자는 우리의 출력입니다.

(이 솔루션은 manatwork의 Perl answer 와 유사합니다 .)

온라인으로 사용해보십시오! (데니스)


12

파이썬 2, 90

def f(s):i=iter(s);a=next(i);return(a>'a')*a or'oe'[f(i)==f(i)if'*'<a else'e'in f(i)+f(i)]

이 iter함수는 입력 문자열을 FIFO 대기열로 만드는 좋은 방법입니다.이 문자열은의 호출에서 구문 분석 된 양을 기억합니다 f. 입력이 dem 등하므로 입력이 이미 문자열이 아닌 반복자 일 때 다시 호출하는 것은 무해합니다. or'oe'...로 시작하는 답변의 후반부는 골프를 타야하는 것처럼 보이지만 아무것도 찾을 수 없습니다.

Sp3000 덕분에 -1입니다.


훌륭한 솔루션! 재귀 함수를 사용하면 iter실제로 내 마음을 사로 잡습니다.
— xnor

3
다음을 사용하여 직접 산술을 계산하는 방법이 있습니다 eval.def f(s,e=0,o=1):i=iter(s);a=next(i);return'eo'[eval(a*(a>'a')or f(i)+a+f(i))%2]
— xnor

1
@xnor 답변으로 게시 할 수도 있습니다. 이 솔루션과는 많이 다릅니다.
— feersum

9

매스 매 티카, 91 84 바이트

#//.s_:>s~StringReplace~{"+ee"|"+oo"|"*ee"|"*eo"|"*oe"->"e","+eo"|"+oe"|"*oo"->"o"}&

이것을 압축하는 방법을 찾고 있습니다 ...


3
//.보다 짧습니다 FixedPoint.
— alephalpha

8

파이썬 2, 80 바이트

def f(s,e=0,o=1):i=iter(s);a=next(i);return(a>'a')*a or'eo'[eval(f(i)+a+f(i))%2]

이것은 폴란드어 표기법 작업을 구현 하기 위해 를 사용하는 feersum의 매우 영리한 답변 을 기반으로 iter합니다. 새로운 아이디어는 eval표현식을 평가하는 데 사용 +하고 *with 를 사용 eval(f(i)+a+f(i))하여 연산자 a가 재귀 결과 사이에 삽입됩니다. eval은 e=0,o=1선택적 함수 인수에서 바인딩 을 사용합니다 . 그런 다음 출력은 mod 2로 취해집니다.


이것은 파이썬 3에서도 작동합니다. 그런데 eval에는 "e = 0, o = 1"바인딩이 어떻게 필요합니까?
— karhell

@karhell 다음과 같은 표현식을 평가합니다 e+o 하므로 숫자를 참조하는 변수가 필요합니다.
— xnor

8

C, 79 바이트

간단한 재귀. 허용되는 4 개의 입력 문자 중 일부 (일치적인?) 비트 속성에 의존합니다.

f(){int c=getchar();return c&4?c:c&1?f()^f()^'e':f()&f();}main(){putchar(f());}

8

쉘 + GNU 유틸리티, 33

dc -eFo`rev|tr oe OK`2%p|tr 10 oe

입력은 STDIN에서 가져옵니다.

이것은 입력을 되돌리고 스택 기반 계산기로 평가하는 것과 동일한 트릭을 수행합니다 dc. 우리는 교체 e하고o 와 0와 1, 그러나 공간은 잘못된 번호에 숫자의 욕심 구문 분석을 방지하기 위해 삽입해야합니다.

대신 현재 정밀도를 스택으로 푸시 하는 명령 인 which e로 대체 되며 기본적으로 0 입니다.KdcoO 되는 것이다 dc스택에 전류 출력베이스 밀어 명령. 이것은 이상해야하므로 Fodc에서 다른 작업을 수행하기 전에 15로 설정했습니다 .

그렇다면 그것은 단순히 모드 2를 가지고 인쇄하는 문제입니다 2%p. 유일하게 가능한 값은 0및 1이므로 출력 기준이 15인지는 중요하지 않습니다. 그런 다음 또는 tr로 다시 변환됩니다 .oe


나는 당신이 당신의 눈을 가늘게 뜨면이 소스는 거의 같습니다 dc Forever OK.


5

진심으로 , 24 바이트

,R'2'e(Æ'1'o(Æ£ƒ'e'o2(%I

보다 효율적인 스택 조작은 아마도 이것을 더 짧게 만들 수 있지만, 나는 그것에 만족합니다.

다음과 같이 입력을 문자열로받습니다. "+*oee"

온라인으로 시도하십시오 (입력은 수동으로 입력해야합니다)

설명:

,R        get input and reverse it
'2'e(Æ    replace all "e"s with "2"s
'1'o(Æ    replace all "o"s with "1"s
£ƒ        cast as function and call
'e'o2(%I  push "e" if result is even, else "o"

5

루비, 61 바이트

재귀 하강 구문 분석 및 부울 대수 사용

def f
gets(1)==?+?f^f : ~/\*/?f&f : $_==?o
end
puts f ? ?o:?e

이 함수는 한 번에 stdin에서 한 문자를 읽습니다. a +또는 a를 읽는 경우 *홀수 또는 짝수를 결정하기 위해 자신을 두 번 호출합니다. 이 함수는 true홀수 및를 반환 false합니다 even. ^ XOR 및 & AND 연산자는 각각 덧셈과 곱셈 표현 "oddness"를 결정하는 데 사용됩니다.

ungolfed 버전은 다음과 같습니다.

def f
  x = gets(1)
  case x
  when '+'
    f ^ f
  when '*'
    f & f
  else
    x == 'o'
  end
end

puts f ? 'o' : 'e'

초기 버전의 버그를 지적한 @Shel에게 감사합니다.


1
이것은 작동하지 않습니다 +ee수 있습니다 o. 나는 아이디어를 좋아한다
— Shelvacu

교체 f^f와 !f^f와 f&f와 f|f와 그것을 작동합니다. 프로그램은 테스트 케이스를 실행합니다 : pastebin.com/ufXfd1vc
— Shelvacu에게

1
고마워, 잘 잡아! 내가 약간 혼란스러워 보인다. 멋진 테스트 스위트도! 골프를
— 탈

@Shel Aha ..! 나는 다시 변경 f^f및 f&f과 이성을 상실 $_==?e하고 ?e:?o:) 대신
— daniero

1
와우, 새로운 것을 매일 ... 배우 ruby-doc.org/core/Regexp.html#method-i-7E
— Shelvacu

4

Minkolang 0.14 , 40 바이트

나는 영리한 평가 방법을 시도했지만 원래 공간 외부의 코드 상자에 추가 된 모든 값은 프로그램 카운터에서 절대 도달하지 않는 것으로 나타났습니다. 그래서 덜 영리한 평가 방법을 사용했습니다. :피

$o"eo+*"r0I4-[4g1Z2*1F]l*"e"+O.
0f1f+f*f

여기에서 시도하십시오.

설명

$o                                Read in whole input as characters
  "eo+*"                          Push these characters onto the stack (in reverse order)
        r                         Reverse the stack
         I4-                      Push the length of the stack - 4
            [                     For loop; pop n and repeat that many times
             4g                   Get the item at the fourth index and put it on top
               1Z                 Pops n and pushes first index of n in stack
                 2*               Multiply by 2
                   1F             Gosub; goes to codebox(2n,1) to be returned to
                     ]            Close for loop
                      l*          Multiply by 10
                        "e"+      Add 101 ("o" is 111)
                            O.    Output as character and stop.
0f1f+f*f                          Does the appropriate operation then returns to F

1
우후! 좋은 똑똑한 '쉘은 A (반) 골프 언어의 ;-P를 친다
— 디지털 외상에게

4

자바 스크립트, 110106 94 바이트

while(i.length>2)i=i.replace(/([+*][eo]{2})/,(o,e)=>{return"+oe+eo*oo".indexOf(o)<0?"e":"o"});

확실히 가장 작은 솔루션은 아니지만 JavaScript와 같은 장황한 언어로 가능한 가장 작은 솔루션 일 것입니다!


비 캡처 그룹을 사용하면 성능이 좋지만 코드 크기에는 좋지 않습니다. 더 잘 제거하십시오 ?:.
— manatwork

동의했고 그렇게 수정되었습니다.
— Arkain

다른 모습을 보았습니다. 코드를 조금 더 줄일 수 있습니다 while(i.length>2)i=i.replace(/[+*][eo]{2}/,function(o){return"+oe+eo*oo".indexOf(o)>=0?"o":"e"}). 또는 ECMAScript 6의 팻 화살표 기능으로 변경하면 while(i.length>2)i=i.replace(/[+*][eo]{2}/,o=>"+oe+eo*oo".indexOf(o)>=0?"o":"e"). 그러나 불행히도 요구 사항에는 프로그램이나 기능이 있으며 현재 코드는 코드 조각입니다. 입력 및 출력 또는 인수 및 반환 값을 처리해야합니다.
— manatwork

1
불행히도이 사이트에서 유효하기 위해서는 변수가 이미 존재한다고 가정 할 수 없습니다. i말씀하신대로 기능을 만들어야합니다 .
— Alex A.

1
@Arkain, 일치하는 전체 하위 문자열을 일체로 사용하므로 정규 표현식에서 그룹을 캡처 할 필요가 없습니다. 같은 이유로 매개 변수 e를 콜백에 전달할 필요가 없습니다.
— manatwork

4

O , 24 20 19 18 바이트

i`2:e;1:o;~2%'o'e?

, 입력을 받아이를 반전 할당 e에 2 및 o로 1 및 텀블러가 그것을 소식 O 코드로 평가한다.

설명:

O는 접미사 표기법을 사용하기 때문에 입력을 받고 뒤집습니다.
2 : e; `e`를 2에 할당
1 : o; `o`를 1에 할당
~ 2 % 평가 및 결과가 고른 지 확인
'오? 짝 수면 출력 'e', ​​홀수이면 'o'

4

GNU 세드, 36

:
s/*oo\|+eo\|+oe/o/
t
s/\W\w\w/e/
t

게시 한 후 @manatwork의 Perl answer 및 @ randomra 's Retina answer 와 정확히 동일한 접근 방식을 보았습니다 . 그래서 나는 모든 길을 가고 그들 \W\w\w도 빌릴 수 있다고 생각합니다.

4 바이트를 깎아 준 @Ruud에게 감사드립니다.


괄호가 사라지면 확장 정규 표현식을 포기합니다. 이스케이프 처리를하지 않으면 2 바이트를 이기고 이스케이프 처리 +를 위해서는 2 바이트를 잃지 |만 최종 결과는 드롭 옵션으로 1 바이트를이기는 것 -r입니다.
— Ruud Helderman

@Ruud 맞습니다. 나는 전에 그것을 시도했지만 사용하지 않을 |때 탈출해야 할 필요성을 깨닫지 못했습니다 -r. 여전히 2 바이트가 더 떨어졌습니다. 감사합니다!
— Digital Trauma

2

하스켈, 160 바이트

전화하십시오 f.

f=until((==1).l)r
r s|l s<3=s|3#s?o=r('o':3%s)|3#s?sequence["+*","oe","oe"]=r('e':3%s)|0<1=1#s++r(1%s)
l=length
(#)=take
(%)=drop
(?)=elem
o=["+eo","+oe","*oo"]

2

자바 스크립트, 92 71 바이트

f=i=>i>"0"?i:f(i.replace(/.[eo]{2}/,e=>"eo"[eval((e[1]>"e")+"^&"[+(e[0]<"+")]+(e[2]>"e"))]))

약간 난독 화되었지만 eval비트 연산자를 사용하여 무언가를 하고 싶었습니다 . 주석 달기 :

f = (i) => // function(i) { return
    i>"0"  // i[0] == "o" || i[0] == "e" :-) - the characters `*` and `+` are both <"0"
      ? i  // finish
      : f(i.replace( // recursively repeat with
          /.[eo]{2}/, // first occurrence of "something" followed by two values
          (e) =>    // replaced by
              "eo"[ // string indexing
                eval(
                    (e[1]>"e")        // e[1] == "o" ? "true" : "false"
                  + "^&"[+(e[0]<"+")] // e[0] == "+" ? "^" : "&"
                  + (e[2]>"e")        // e[2] == "o" ? "true" : "false"
                )
              ]     // like eval(…) ? "o" : "e"
        ))

반복 (e[…]>"e")하면 약간 짜증나지만 다음은 더 좋지 않습니다 (103 바이트).

f=i=>i>"0"?i:f(i.replace(/e|o/g,x=>+(x>"e")).replace(/.\d\d/,e=>"eo"[eval(e[1]+"^&"[+(e[0]<"+")]+e[2])]))

결국 간단한 하위 문자열 일치를 사용한 @Arkain의 접근 방식은 훌륭합니다. 일부 최적화와 함께 기능으로 만들어졌습니다.

f=i=>i>"0"?i:f(i.replace(/.[eo]{2}/,v=>"eo"[+"+oe+eo*oo".includes(v)]))

1

다트, 173 바이트

f(i){var l=i.split(''),e='e',o='o';g(p){if(l[p]!=e&&l[p]!=o){var x=p+1,y=p+2;g(x);g(y);l[p]=l[p]=='+'?l[x]!=l[y]?o:e:l[x]==o?l[y]:e;l.removeRange(x,p+3);}}g(0);print(l[0]);}

이것은 경쟁력이 없지만 무엇이든간에. 해결책의 요지는 0부터 시작하여 모든 연산자를 평가자로 해당 연산자 다음에 오는 문자 쌍을 재귀 적으로 대체 한 다음 목록에서 해당 문자를 제거하는 것입니다.


1

하스켈, 231 바이트

심각한 언어를 사용하는 접근법이 있습니다.)

골프 버전 :

p(s:_)[]=s
p s(x:y)=p(r$x:s)y
r[]=[]
r('e':'e':'+':x)=r$'e':x
r('e':'o':'+':x)=r$'o':x
r('o':'e':'+':x)=r$'o':x
r('o':'o':'+':x)=r$'e':x
r('e':'e':'*':x)=r$'e':x
r('e':'o':'*':x)=r$'e':x
r('o':'e':'*':x)=r$'e':x
r('o':'o':'*':x)=r$'o':x
r x=x

예:

*Main> p [] "+**+***+**++**+eooeoeeoeeoeooeo"
'o'

확고하고 포괄적 인 버전 :

type Stack = String

parse :: String -> Char
parse = parse' []

parse' :: Stack -> String -> Char
parse' (s:_) []     = s
parse' s     (x:xs) = parse' (reduce $ x:s) xs

reduce :: Stack -> Stack
reduce [] = []
reduce ('e':'e':'+':xs) = reduce $ 'e':xs
reduce ('e':'o':'+':xs) = reduce $ 'o':xs
reduce ('o':'e':'+':xs) = reduce $ 'o':xs
reduce ('o':'o':'+':xs) = reduce $ 'e':xs
reduce ('e':'e':'*':xs) = reduce $ 'e':xs
reduce ('e':'o':'*':xs) = reduce $ 'e':xs
reduce ('o':'e':'*':xs) = reduce $ 'e':xs
reduce ('o':'o':'*':xs) = reduce $ 'o':xs
reduce xs               = xs

예:

*Main> parse "+**+***+**++**+eooeoeeoeeoeooeo"
'o'

특징 : 패턴 매칭 및 재귀.


1

줄프, 11 바이트

(언어가 질문을 게시 할 때 비 경쟁적입니다.) 여기에서 시도하십시오!

FVyAi"oe"@\x12

( \x12실제 문자로 교체하십시오 \x12. 이것은 인터프리터에서 자동으로 수행되어야합니다.)

설명:

FVyAi"oe"@\x12
    i          input
          \x12 character 12
         @     char code at
   A "oe"      replace all os with 1s and all es with 2s
  y            eval as jolf, returning the answer
 V             return parity "even" or "odd"
F              get first character
               implicit output

1

파이썬 3 171 145 135 바이트

경쟁적이지는 않지만 재미있게 놀았 기 때문에 제 자신에게 맡길 수 없었습니다. feersum 에 의한 (매우 영리한) 재귀 반복자 파이썬 항목 과 달리 , 이것은 입력을 되돌리고 역 폴란드 표기법의 오래된 스택 기반 구문 분석을 수행합니다.

def p(i):
 s=[]
 for c in i[::-1]:
  s+=[c>'e'if c>'a'else getattr(s.pop(),'__'+('axnodr'[c>'*'::2])+'__')(s.pop())]
 return'eo'[s[0]]

즉 callable()우아하지만 깁니다. (조건을 바꾸고 제거하는 not것이 더 짧을 것입니다.) 대신 m이 정수 m in[0,1]인지 확인하지만 c가 값인지 확인하는 c in'eo'것이 훨씬 짧습니다. 이것은 나중에이 경우와 동일 c>'a'합니다.
— manatwork

실제로 변수 m과 숫자 값이 필요하지 않습니다. 이 안에 만 넣으십시오 for:s+=[c>'e'if c>'a'else{'*':o.and_,'+':o.xor}[c](s.pop(),s.pop())]
— manatwork

@manatwork : 감사합니다! 나는 그것이 모든 루프를 호출하는 것을 의미 한다고 생각 했기 때문에 조건을 되돌릴 수 있다고 생각하지 않았습니다 s.pop(). 나는 지금까지 테스트를 귀찮게하지 않았다; 그러나, 요점은 지금 mo이다.
— Tim Pederick

operator 모듈을 사용하는 이유는 무엇입니까? bool.__and__()그리고 더 bool.__xor__()편리 s+=[c>'e'if c>'a'else getattr(s.pop(),{'*':'__and__','+':'__xor__'}[c])(s.pop())]합니다. 그러나 gnibbler 의 슬라이싱 팁 에 따라 변경 될 수 있습니다 s+=[c>'e'if c>'a'else getattr(s.pop(),'__'+('axnodr'[c>'*'::2])+'__')(s.pop())].
— manatwork

@ manatwork : 나는 그것을 생각하지 않았기 때문에. 나는 실제로 연산자를 구현하는 메소드를 잊어 버린 삽입 연산자 ( ^, &) 및 해당 연산자 만 고려 operator했습니다. 아, 또 다른 Python 골프 팁reversed() 덕분에 삭제되었습니다 .
— Tim Pederick

1

하스켈, 98 94 바이트

또 다른 Haskell 시도로 귀찮게해서 죄송합니다. 100 바이트 미만으로 가능하다는 것을 증명하고 싶었습니다.

p(c:s)|any(<'a')s=p(c:p s)
p('+':x:y:s)|x/=y='o':s
p('*':'o':s)=s
p(c:_:_:s)|c<'a'='e':s
p s=s

p유효한 식을 매개 변수로 받아들이고 결과를 길이가 1 인 문자열로 반환 하는 함수 를 정의합니다 .

예:

*Main> p "**o++*ee*++eoe*eo+eoo"
"o"

이 함수는 연산자가 남아 있지 않을 때까지 문자열에서 가장 오른쪽 연산자를 반복적으로 줄임으로써 작동합니다.


0

추가 ++ , 46 바이트

D,g,@,d"oe"$eA"e"=+o
D,f,@,bR€gbU32CjbV2%"eo":

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

바닥 글은 모든 예제 입력과 해당 출력을 열거합니다.

작동 원리

여기서 답변을 잃어버린 것처럼 교체 및 평가를 사용합니다. 우리의 주요 기능은입니다 f. 그리고 g도우미 기능입니다. 우리는 사용합니다 "*e*o*e*oe"(인 e예로서).

f입력 문자열을 가져 와서 뒤집어서 시작합니다 "eo*e*o*e*". 그런 다음 g각 요소 를 매핑합니다 .

g인수를 복제하여 시작하여 최종 명령까지 사본을 유지합니다. 그런 다음 인수가 문자열에 있는지 확인 "oe"하여 문자의 경우 1 , 또는의 경우 0 을 생성 합니다. 그런 다음 인수를 다시 푸시하고 인수가 같은지 확인합니다 . 그런 다음이 결과가 이전 검사에 추가됩니다. 이것은 또는에 대해 0 ,에 대해 1 을 ,에 대해 2 를 산출 합니다 . 그런 다음이 값과 인수 사이의 논리합을 취합니다. 값이 0 이면 인수 (즉, 또는 ) 로 대체되고 , 그렇지 않으면 그대로 (예 : 1 및 2 ) 남습니다 .*+"e"*+oe*+

입력의 반대 문자를 모두 숫자 값으로 변환합니다. 그런 다음 각 요소를 공백으로 결합하여 숫자가 연결되지 않도록합니다. 이 예에서는 문자열을 생성합니다 "2 1 * 2 * 1 * 2 *". 그런 다음 Add ++의 접미사 표기법을 사용하여이를 평가하여 8을 산출 할 수 있습니다 . 그런 다음 문자열에 색인을 생성 하고 해당 문자를 반환 하기 전에이 값의 패리티를 가져와 짝수의 경우 0 , 홀수의 경우 1 을 산출합니다 "eo".

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