그들 중 누가 가장 졸려?


31

의 및 문자가 항상 다른 문자 대 문자로 -=o.바뀌는 문자열을 취하는 프로그램 또는 함수를 작성하십시오 . 문자열은 홀수 길이가 1보다 크며 항상로 시작하고 끝나는 중 하나입니다 .-=o.-=o

기본적으로 입력은 다양한 졸림 상태에서 눈을 공유하는 이모티콘 얼굴 라인처럼 보입니다 (예 :

o.=.=.-.-.o.o

당신의 목표는 가장 졸리거나 가장 깨어있는 얼굴을 인쇄하거나 반환하는 것입니다 (선택하는 것은 당신에게 달려 있습니다). 누가 가장 졸려 / 가장 깨어 났는지에 대한 여러 선택이 있다면, 그들 중 하나가 출력 될 수 있습니다.

9 개의 뚜렷한 얼굴과 5 가지 수준의 졸음이 있습니다 :

-.- is 100% sleepy
-.= is 75% sleepy
-.o is 50% sleepy
=.- is 75% sleepy
=.= is 50% sleepy
=.o is 25% sleepy
o.- is 50% sleepy
o.= is 25% sleepy
o.o is 0% sleepy

그것은 분명하지 않다 경우, 졸음 비율은 할당하여 계산 1-완전히 잠에 대한 0.5=잠 절반, 그리고 0o깨어합니다. 그런 다음 두 눈 값의 합을 2로 나눈 값이 백분율입니다.

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

테스트 사례

졸린

-.- GIVES -.-
=.- GIVES =.-
o.o GIVES o.o
o.-.= GIVES -.=
=.-.= GIVES =.- OR -.=
o.-.= GIVES -.=
-.-.= GIVES -.-
o.o.- GIVES o.-
=.=.=.o GIVES =.=
-.=.=.= GIVES -.=
=.o.-.= GIVES -.=
o.-.o.=.= GIVES o.- OR -.o OR =.=
-.o.-.=.= GIVES -.=
o.o.o.o.o GIVES o.o
-.-.-.-.- GIVES -.-
o.=.=.-.-.o.o GIVES -.-
-.=.-.o.o.=.o.-.o.=.-.o.=.o.- GIVES -.= OR =.-

가장 깨어

-.- GIVES -.-
=.- GIVES =.-
o.o GIVES o.o
o.-.= GIVES o.-
=.-.= GIVES =.- OR -.=
o.-.= GIVES o.-
-.-.= GIVES -.=
o.o.- GIVES o.o
=.=.=.o GIVES =.o
-.=.=.= GIVES =.=
=.o.-.= GIVES =.o
o.-.o.=.= GIVES o.=
-.o.-.=.= GIVES -.o OR o.- OR =.=
o.o.o.o.o GIVES o.o
-.-.-.-.- GIVES -.-
o.=.=.-.-.o.o GIVES o.o
-.=.-.o.o.=.o.-.o.=.-.o.=.o.- GIVES o.o

31
기분이-.-
Kritixi Lithos

답변:


28

Pyth, 12 10 바이트

hoSN%2.:z3

가장 졸린 이모티콘을 인쇄합니다. Pyth Compiler 에서 모든 테스트 사례를 한 번에 확인하십시오 .

정렬을 사용하려는 아이디어는 @ Sp3000으로갑니다 .

작동 원리

hoSN%2.:z3
              (implicit) Save the in z.
      .:z3    Compute all substrings of length 3.
    %2        Keep every seconds substring. This discards non-emoticons.
 o            Sort the emoticons by the following key:
  SN            Sort the characters of the emoticon.
                This works since '-' < '=' < 'o'.
h             Retrieve the first, minimal element.

18
이 마법은 무엇입니까?!
AvZ

@Dennis Pyth를 처음 사용하므로 이것이 잘못되었을 수 있습니다 hS%2.:z3.
Helix Quar

5
@helix 우리는 =.-보다 졸리기를 원 -.o하지만 다른 방법으로 정렬됩니다. 나는 같은 실수를했다.
xnor

9

파이썬 2, 54 53 바이트

f=lambda s:s and max((s+' ')[:3],f(s[2:]),key=sorted)

가장 깨어있는 얼굴을 돌려주는 함수입니다.

원래 알고리즘을 단축하기 위해 많은 전술적 트릭을 제공 한 xnor에게 많은 감사를드립니다.


글쎄, 나는 기호가 깨달음에 의해 분류된다는 것을 깨닫지 못하는 것이 바보 같은 느낌입니다. 나는 당신이 max그것을 반복하지 않고 재귀를 할 수 있다고 생각합니다 .f=lambda s:s[3:]and max(s[:3],f(s[2:]))or s
xnor

사실, 나는이 작동하지 않습니다 생각 =.-.o하기 때문에, =.--.o정렬 규칙에 예외가있다.
xnor

실제로 나는 방금 작전을 잘못 읽은 것을 깨달았습니다. 나는 얼굴이 테이블에 나타날 때 정렬된다고 생각했습니다. 이 가정으로 인해 "= .o.-"에 대한 제출이 실패합니다. 그래도 문제가 있다고 생각합니다.
xsot

@ xsot 나는 ,key=sorted해결책 이라고 생각 하지만 이것은 11 자이므로 아마도 더 짧을 것입니다.
xnor

그래, 그게 내가 생각했던 수정입니다
xsot

6

CJam, 12 바이트

q3ew2%{$}$0=

가장 졸린 이모티콘을 인쇄합니다. CJam 인터프리터 에서이 바이올린 또는 이 테스트 스위트 를 사용해보십시오 .

정렬을 사용하려는 아이디어는 @ Sp3000으로갑니다 .

작동 원리

q            e# Read all input from STDIN.
 3ew         e# Push all overlapping slices of length 3.
    2%       e# Keep every seconds slice. This discards non-emoticons.
      {$}$   e# Sort the slices by their sorted characters.
             e# This works since '-' < '=' < 'o'.
          0= e# Retrieve the first, minimal slice.

4

Dyalog APL, 35 28 바이트

{⊃{⍵[⍒{+/'.??o='⍳⍵}¨⍵]}3,/⍵}

이것은 오른쪽에서 문자열을 취하고 가장 졸린 얼굴을 출력하는 모나 딕 함수입니다.

    {⊃{⍵[⍒{+/'.??o='⍳⍵}¨⍵]}3,/⍵}'o.=.=.-.-.o.o'
-.-

{(⊃⍒3+/'.??o='⍳⍵)⊃3,/⍵}
user46915

그리고 입력 제약 조건이 주어지면 그것은 ??또한 불필요합니다.
user46915

4

프롤로그, 205 189 바이트

암호

r([X|T],[N|B],M):-N=M,write(X);r(T,B,M).
p(X):-findall(S,sub_atom(X,_,3,_,S),L),findall(E,(nth1(I,L,E),I mod 2=\=0),R),maplist(atom_codes,R,Q),maplist(sum_list,Q,S),min_list(S,M),r(R,S,M).

설명

r([X|T],[N|B],M):-N=M,write(X);r(T,B,M).
p(X):-findall(S,sub_atom(X,_,3,_,S),L),              % L = all sublists of length 3
      findall(E,(nth1(I,L,E),I mod 2=\=0),R),        % R = every other element of L
      maplist(atom_codes,R,Q),                       % Q = list of decimal ascii codes 
                                                           created from R

      maplist(sum_list,Q,S),                         % S = list of sums of R's lists
      min_list(S,M),                                 % M = minimum sum
      r(R,S,M).                                      % Prints first element in R with sum M


>p('-.=.-.o.o.=.o.-.o.=.-.o.=.o.-').
-.=

편집 : OR로 r 절을 통합하여 16 바이트를 절약했습니다.


1

클로저, 82 바이트

(fn[x](println(apply str(apply min-key #(reduce +(map int %))(partition 3 2 x)))))

보너스 : 다음의 작은 기능은 같은 얼굴을 인쇄하지만 더 많은 스타일로 인쇄합니다!

(fn[x](println(apply min-key #(reduce +(map int %))(partition 3 2 x))))

여기서 테스트하십시오.


1

루비, 59 바이트

함수는 정렬 트릭을 사용하여 가장 졸린 얼굴을 반환합니다.

f=->(s){s.split(?.).each_cons(2).min_by{|e|e.sort}.join(?.)}

다음과 같이 호출됩니다.

f.call("o.=.=.-.-.o.o")
# => "-.-"

내부 종류의 눈으로 인해 어색한 눈 순서로 작동합니다.

f.call("=.-.o")
# => "=.-"

1

Minkolang 0.12 , 119 바이트

처음에는이 짧고 정말 골프를 했어요. 나는 포기하고 조금 더 "재미있는"것을 위해 갔지만 여전히 비교적 골프입니다.

>2@fv$oI2:[9[i$z3[iciz1+q=]++3=tt"^"3zpt]$x$x]IX3140w
o.o1F
o.=1$
=.o1+
=.=12
o.-1:
-.o11
=.-1+
-.=13
-.-1[
/c0i<
\qO].

여기 사용해보십시오!

설명

그러나 실제로 위의 링크를 클릭하고 Slow! 어쨌든...

>2@fv

이것은 fv나중에 건너 뛸 중요한 부분을 건너 뜁니다 .

$o                                                  Read in whole input as characters 
  I2:                                               Half the stack length
     [                                              Open for loop (for each face)
      9[                                            Open another for loop - 9 repeats
        i$z                                         Stores loop counter in register
           3[                                       Open another for loop - 3 repeats
             ic                                     Copy char 1/2/3
               iz1+q                                Retrieve char from lookup table
                    =                               1 if equal, 0 otherwise
                     ]                              Close for loop
                      ++                            Add twice
                        3=                          1 if equal to 3, 0 otherwise
                          tt      t                 Ternary - executes first part when 0,
                                                    second part otherwise
                            "^"3zp                  Put a ^ next to the face that matched
                                   ]                Close lookup for loop
                                    $x$x            Dump first two characters
                                        ]           Close for loop
                                         IX         Dump the whole stack
                                           31       Push a 3, then a 1
                                             40w    Wormhole to (4,0) in the code

그 모든 것이 ^일치하는 얼굴 옆 에 놓여 졌습니다. 이제 코드 상자는 다음과 같습니다.

>2@fv$oI2:[9[i$z3[iciz1+q=]++3=tt"^"3zpt]$x$x]IX3140w
o.o1F
o.=1$
=.o1+
=.=^2   <-- caret
o.-^:   <-- caret
-.o11
=.-1+
-.=^3   <-- caret
-.-1[
/c0i<
\qO].

물론 의견이 없습니다. 이제40w 웜홀이에 명령어 포인터를로 보내서 v즉시으로 리디렉션합니다 F. 이제 F"gosub"명령입니다. 그것은 goto와 같지만 전화를 한 곳으로 돌아갈 수 있습니다. 해당 시간 F이 발생하면 스택은입니다 [3,1]. 따라서 1두 번째 행 의 (아마도)로 이동합니다 . 프로그램 카운터가 아래쪽으로 향함에 따라 계속 진행하면서 1s를 스택에 밀어 넣습니다. 그것은 ...이 될 때까지 ^다시 리디렉션되어 다시 푸시 1됩니다. 그런 다음 명령 포인터가 f에 도달하여 위치와 방향을 복원합니다 ( F이전에 발생 했을 때 ). 편의상 다음 코드를 사용하여 레이아웃을 변경합니다. (그만큼</\ 필요에 따라 명령 포인터를 리디렉션하는 역할을합니다.)

$+                 Sum up the whole stack
  2:               Divide by 2 (because each 1 was pushed twice)
    1+             Add 1 (shift down one row)
      3[           Open for loop - 3 repeats
        i          Push loop counter
         0c        Copy top of stack
           q       Retrieve face character
            O      Output as character
             ].    Close for loop and stop when it's done.

실제로 이전에 자주 사용하지 않은 Minkolang 고유의 여러 기능을 어떻게 사용했는지 자랑스럽게 생각합니다. 주로 삼항과 gosub. 어쨌든, 당신은 그것을 가지고 있습니다!


1

C, 70 바이트

char*f(char*s){char*p=s[3]?f(s+2):s;return*s+s[2]>*p+p[2]?s[3]=0,s:p;}

이 함수는 가장 깨어있는 얼굴을 반환합니다. 널로 끝나는 문자열을 리턴하도록 입력 문자열을 제자리에 수정합니다.


1

파이썬 2/3, 54 56 바이트

lambda x:".".join(max(zip(x[::2],x[2::2]),key=sorted))

xsot의 재귀 답변에 대안을 택하고 싶었습니다.

이것은 인접한 눈 쌍의 가장 좋은 (또는 최악의) 튜플을 가져 와서 함께 결합합니다.

졸음을 가장 많이 반환하려면 max를 min으로 바꾸십시오.

다음 테스트를 사용하여 작동하는 것 같습니다.

for line in """-.- GIVES -.-
    =.- GIVES =.-
    o.o GIVES o.o
    o.-.= GIVES o.-
    =.-.= GIVES =.- OR -.=
    o.-.= GIVES o.-
    -.-.= GIVES -.=
    o.o.- GIVES o.o
    =.=.=.o GIVES =.o
    -.=.=.= GIVES =.=
    =.o.-.= GIVES =.o
    o.-.o.=.= GIVES o.=
    -.o.-.=.= GIVES -.o OR o.- OR =.=
    o.o.o.o.o GIVES o.o
    -.-.-.-.- GIVES -.-
    o.=.=.-.-.o.o GIVES o.o
    -.=.-.o.o.=.o.-.o.=.-.o.=.o.- GIVES o.o""".splitlines():
    inp, _, opts = line.partition(" GIVES ")
    optst = opts.split(" OR ")
    act = f(inp)
    print(inp, "expected", opts, "got", act, "equal?", act in optst)

결과는 다음과 같습니다.

-.- expected -.- got -.- equal? True
=.- expected =.- got =.- equal? True
o.o expected o.o got o.o equal? True
o.-.= expected o.- got o.- equal? True
=.-.= expected =.- OR -.= got =.- equal? True
o.-.= expected o.- got o.- equal? True
-.-.= expected -.= got -.= equal? True
o.o.- expected o.o got o.o equal? True
=.=.=.o expected =.o got =.o equal? True
-.=.=.= expected =.= got =.= equal? True
=.o.-.= expected =.o got =.o equal? True
o.-.o.=.= expected o.= got o.= equal? True
-.o.-.=.= expected -.o OR o.- OR =.= got =.= equal? True
o.o.o.o.o expected o.o got o.o equal? True
-.-.-.-.- expected -.- got -.- equal? True
o.=.=.-.-.o.o expected o.o got o.o equal? True
-.=.-.o.o.=.o.-.o.=.-.o.=.o.- expected o.o got o.o equal? True

두 가지 빠른 질문 : 1) 두 가지가 모두 작동 할 때 Python 2/3으로 레이블링됩니까? 2) f=이 과제에 대한 코드 크기 의 일부로 부품이 필요합니까? 내가 그렇게하지 않으면 람다가 생겨 즉시 다시 버리게됩니다.
TLW

1
1) "파이썬 2/3"또는 그냥 "파이썬은"나는이 생각 미세) 당신이하지 않은 경우입니다 필요 (가) f=당신이를 놓을 수 있도록, 현재 합의가 익명 함수는 기본적으로 괜찮 것 같다 f=(이 경우 xsot는 재귀 적이므로 필요합니다)
Sp3000


0

Mathematica, 61 바이트

"."
Sort[Partition[#~StringSplit~%,2,1]][[1]]~StringRiffle~%&

가장 졸린 사람을 찾는다.


이 함수는 호출 할 때마다 전체 코드를 반복하지 않는 한 한 번만 작동합니다. 기능 제출 포인트는 재사용이 가능해야 합니다. 함수를 호출하면 함수가 사용하는 전역 값이 손상 %됩니다.
Martin Ender

0

F # 60

fun s->Seq.max[for n in 0..2..String.length s-2->s.[n..n+2]]

반환 가장 깨어 얼굴 (변경 max하여 min잠자는 용)


0

펄 5, 127 바이트

%h=qw[- 2 = 1];sub r{$b=0;$b+=$h{$_}for split'',pop;$b}($_)=<>;@a='o.o';while(/.../g){push@a,$& if(r$&)>r$a[-1];--pos}say$a[-1]

(더 짧게 할 수 있다고 확신합니다.) 작동 방식 :

  1. 문자열에서 각 3 문자 문자열을 겹치게 잡고 잡아라. --pos ).
  2. 해당 값이 배열의 마지막 요소 값을 초과하면 해당 3 자 문자열을 배열에 추가합니다. 여기서 "값"은 졸음의 문자 값 합계입니다.
  3. 배열의 마지막 요소를 인쇄하십시오.

0

ES6, 81 72 바이트

a=>"-.-,-.=,=.-,-.o,=.=,o.-,=.o,o.=,o.o".split`,`.find(b=>a.includes(b))

Chrome 45 또는 Firefox 41이 필요할 수 있습니다.

9 바이트를 절약 한 @ETHproductions에게 감사합니다.


1
좋지만 ; "=.-"로 전환해야합니다 "-.o". 와 동일 "=.o"하고 "o.-". 또한 모든 것을 하나의 문자열에 넣고 쉼표로 구분하고를 사용하여 바이트를 절약 할 수 있습니다 .split`,` .
ETHproductions

split을 사용하면 9
자를

@ETHproductions 죄송합니다. 원래 얼굴 목록이 그다지 졸림이 아니라는 것을 눈치 채지 못했습니다.

0

> <> , 55 바이트

여기에서 시도하십시오!

<v~i:i&0"."0
 >i:@+:&:@)?v&~i0(?v
 ^?)0i:r~r&~<;ooo$r<

가장 깨어있는 얼굴을 출력합니다.

-, = 및 o의 ASCII 값이 각각 증가하기 때문에이 값을 사용할 수 있습니다. 기본적으로 현재 및 이전 눈 부분의 값을 추가하고 이전보다 높은 값인지 확인합니다. 새로운 값을 저장하고 나타내는 얼굴을 업데이트 한 다음 입력이 끝날 때까지 반복합니다. 그런 다음 남아있는면을 출력합니다. (모든 코드가 얼마나 잘 어울리는 지 매우 기쁘게 생각합니다)


0

펄 5 -MList::Util=max -p , 68 바이트

s|..(?=(.))|$t=max$t,ord($&)%15%4+ord($1)%15%4 .$&.$1|eg;$_=$t;s/.//

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

세 문자의 각 세트를 잡고 .가운데를 무시하고 다른 두 개의 추가를 0-4 범위의 정수에 매핑하고 이모티콘 얼굴의 앞면에 연결 한 다음 정렬합니다. 마지막 항목 (가장 깨어 있음)을 잡고 앞면에서 숫자를 제거한 다음 출력합니다.

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