Kto jest najbardziej śpiący z nich wszystkich?

31

Napisać program lub funkcję, która pobiera ciąg znaków -=o., gdzie -=o's i .jest zawsze na przemian, charakter do charakteru. Ciąg będzie miał nieparzystą długość większą niż jeden i zawsze zaczyna się i kończy w jednym z -=o.

Zasadniczo dane wejściowe będą wyglądać jak linia emotikonów, które dzielą oczy w różnych stanach senności, np

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

Twoim celem jest wydrukowanie lub zwrócenie twarzy, która jest albo najbardziej śpiąca, albo najbardziej obudzona (to zależy od ciebie). Jeśli istnieje wiele opcji określających, kto jest najbardziej śpiący / najbardziej przebudzony, wówczas może zostać wyświetlony jeden z nich.

Istnieje dziewięć różnych twarzy i pięć poziomów senności:

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

W przypadku, gdy nie jest to jasne, procent senności jest obliczany przez przypisanie 1do -pełnego uśpienia, 0.5do =półśpienia i 0do oprzebudzenia. Następnie suma dwóch wartości oka podzielonych przez dwa jest procentem.

Najkrótszy kod w bajtach wygrywa.

Przypadki testowe

Najbardziej śpiący

-.- 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 =.-

Przebudźcie się

-.- 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
Hobby Calvina
źródło
31
Czuję się-.-
Kritixi Lithos

Odpowiedzi:

28

Pyth, 12 10 bajtów

hoSN%2.:z3

Drukuje najbardziej śpiący emotikon. Sprawdź wszystkie przypadki testowe jednocześnie w kompilatorze Pyth .

Podziękowania dla @ Sp3000 za pomysł użycia sortowania .

Jak to działa

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.
Dennis
źródło
18
Co to za czary?!
AvZ,
@ Dennis Jestem nowy w Pyth, więc może to być bardzo złe: dlaczego nie hS%2.:z3?
Helix Quar,
5
@helix Ponieważ chcemy =.-być bardziej śpiący -.o, ale oni są posortowani w drugą stronę. Popełniłem ten sam błąd.
xnor
9

Python 2, 54 53 bajtów

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

Jest to funkcja zwracająca budzącą się twarz.

Ogromne podziękowania dla xnor za udostępnienie wielu sztuczek taktycznych w celu skrócenia mojego oryginalnego algorytmu.

xsot
źródło
Cóż, czuję się głupio, nie zdając sobie sprawy, że symbole są posortowane według przebudzenia. Myślę, że można powtórzyć maxzamiast powtarzać:f=lambda s:s[3:]and max(s[:3],f(s[2:]))or s
xnor
Właściwie myślę, że to nie działa =.-.o, ponieważ =.-vs -.ojest wyjątkiem od reguły sortowania.
xnor
Właśnie zdałem sobie sprawę, że źle odczytałem op. Myślałem, że twarze są posortowane tak, jak pojawiają się w tabeli. Z powodu tego założenia moje przesłanie nie powiedzie się dla „= .o.-”. Myślę jednak, że mam poprawkę.
xsot
@xsot Myślę, że ,key=sortedbyłoby to rozwiązanie, ale to 11 znaków, więc twój jest prawdopodobnie krótszy.
xnor
Tak, to była poprawka, którą miałem na myśli
xsot
6

CJam, 12 bajtów

q3ew2%{$}$0=

Drukuje najbardziej śpiący emotikon. Wypróbuj to skrzypce lub zestaw testowy w interprecie CJam.

Podziękowania dla @ Sp3000 za pomysł użycia sortowania .

Jak to działa

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.
Dennis
źródło
4

Dyalog APL, 35 28 bajtów

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

Jest to monadyczna funkcja, która pobiera ciąg po prawej stronie i wyświetla najbardziej zaspaną twarz.

    {⊃{⍵[⍒{+/'.??o='⍳⍵}¨⍵]}3,/⍵}'o.=.=.-.-.o.o'
-.-
lirtosiast
źródło
{(⊃⍒3+/'.??o='⍳⍵)⊃3,/⍵}
user46915
Biorąc pod uwagę ograniczenia wejściowe, ??jest to również niepotrzebne.
user46915
4

Prolog, 205 189 bajtów

Kod

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).

Wyjaśnienie

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

Przykład

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

Edycja: Zapisano 16 bajtów poprzez ujednolicenie klauzul r z OR.

Emigna
źródło
1

Clojure, 82 bajty

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

Bonus: następująca mniejsza funkcja drukuje tę samą twarz, ale w większym stylu!

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

Przetestuj tutaj.

galdre
źródło
1

Ruby, 59 bajtów

Funkcja zwraca senną twarz za pomocą sztuczki sortowania.

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

Nazywany tak:

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

Działa na niewygodnej kolejności oczu ze względu na wewnętrzne oczy:

f.call("=.-.o")
# => "=.-"
Neil Slater
źródło
1

Minkolang 0.12 , 119 bajtów

Na początku próbowałem robić to krótko i naprawdę golfowo. Zrezygnowałem i zdecydowałem się na coś bardziej „zabawnego”, ale wciąż stosunkowo golfowego.

>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].

Wypróbuj tutaj!

Wyjaśnienie

Ale tak naprawdę kliknij powyższy link i kliknij Slow! Tak czy inaczej...

>2@fv

Pomija to fv, co będzie ważne później.

$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

Wszystko, co to zrobiło, znalazło się ^obok pasujących twarzy. Więc teraz codbox może wyglądać tak:

>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].

Oczywiście bez komentarzy. Teraz 40wtunel czasoprzestrzenny wysłał wskaźnik instrukcji v, na który natychmiast przekierowuje go F. Teraz Fjest poleceniem „gosub”. To jak goto, ale możesz wrócić do miejsca, w którym to nazwałeś. W momencie Fnapotkania stos jest [3,1], więc przeskakuje do 1(być może) w drugim rzędzie. Gdy licznik programu zmierza w dół, kontynuuje, przesuwając 1s na stos po drodze. To jest ... dopóki nie uderzy w ^, w którym to momencie jest przekierowywany z powrotem w górę, gdzie naciska 1ponownie. Następnie wskaźnik instrukcji uderza f, co przywraca jego pozycję i kierunek (kiedy Fwcześniej się napotkano). Dla wygody wezmę następujący kod i zmienię jego układ. (The</\ służą do przekierowania wskaźnika instrukcji w razie potrzeby).

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

Jestem naprawdę dumny z tego, że użyłem wielu funkcji unikalnych dla Minkolang, z których często nie korzystałem. Głównie trójskładnikowy i gosub. W każdym razie, masz!

El'endia Starman
źródło
1

C, 70 bajtów

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

Funkcja zwraca najbardziej rozbudzoną twarz. Zmienia wejściowy ciąg znaków, aby zwrócić ciąg zakończony znakiem null.

Han
źródło
1

Python 2/3, 54 56 bajtów

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

Po prostu chciałem zastosować alternatywny hals do rekurencyjnej odpowiedzi xsot.

To zajmuje najlepszą (lub najgorszą?) Krotkę sąsiednich par oczu i łączy je razem.

Zamień max na min, aby zwrócić najbardziej śpiący (ponieważ to zwraca najbardziej przebudzony)

Wydaje się działać, stosując następujący test:

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)

Co daje następujący wynik:

-.- 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
TLW
źródło
Dwa szybkie pytania: 1) czy etykietowanie jako Python 2/3 jest zalecane, gdy coś działa z oboma? 2) Czy f=część jest wymagana jako część rozmiaru kodu dla tego wyzwania? Jeśli tego nie zrobię, utworzy lambdę, a następnie natychmiast ją wyrzuci ...
TLW
1
1) „Python 2/3” lub po prostu „Python” jest w porządku, myślę, 2) Jeśli nie trzebaf= wtedy obecny konsensus wydaje się, że anonimowe funkcje są domyślnie w porządku, więc można upuścić f=w tym przypadku ( xsot potrzebuje go, ponieważ jest rekurencyjny)
Sp3000,
0

Mathematica, 61 bajtów

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

Idzie najbardziej senny.

LegionMammal978
źródło
Ta funkcja działa tylko raz, chyba że powtórzysz cały kod za każdym razem, gdy chcesz go wywołać. Ich przesłanie polega na tym, aby można je było ponownie wykorzystać . Wywołanie funkcji powoduje uszkodzenie wartości globalnej, na %której się opiera.
Martin Ender
0

F # 60

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

Zwraca najbardziej obudzić twarz (zmiana maxprzez mindla śpisz)

Sehnsucht
źródło
0

Perl 5, 127 bajtów

%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]

(Jestem pewien, że jest to wykonalne w skrócie.) Jak to działa:

  1. Chwyć każdy trzyznakowy ciąg z ciągu, z nakładaniem się jednego (to jest to --pos robi).
  2. Dołącz ten trzyznakowy ciąg do tablicy, jeśli jego wartość przekracza wartość ostatniego elementu tablicy; tutaj „wartość” jest po prostu sumą wartości postaci w senności.
  3. Wydrukuj ostatni element tablicy.
msh210
źródło
0

ES6, 81 72 bajtów

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

Prawdopodobnie wymaga Chrome 45 lub Firefox 41.

Dzięki @ETHproductions za oszczędność 9 bajtów.

Neil
źródło
1
Fajnie, ale "=.-"powinno się je zamieniać "-.o"; to samo z "=.o"i "o.-". Ponadto możesz zapisać niektóre bajty, umieszczając wszystko w jednym ciągu, oddzielając je przecinkami i używając .split`,` .
ETHprodukcje
Korzystanie z podziału może zaoszczędzić 9 znaków
edc65
@ETHproductions Niestety nie zauważyłem, że oryginalna lista twarzy nie była sama w sobie senna.
Neil,
0

> <> , 55 bajtów

spróbuj tutaj!

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

Wyprowadza najbardziej rozbudzoną twarz.

Ponieważ wartości ASCII odpowiednio dla -, = i o wzrosły, mogłem to wykorzystać na swoją korzyść. Zasadniczo dodaje wartości bieżącej i poprzedniej części oka, sprawdza, czy jest to wyższa wartość niż wcześniej, jeśli tak, zapisuje nową wartość i aktualizuje reprezentowaną powierzchnię, a następnie zapętla się do końca wejścia. Następnie wyprowadza twarz, która pozostaje. (Jestem bardzo zadowolony z tego, jak dobrze cały kod pasuje na swoim miejscu)

torcado
źródło
0

Perl 5 -MList::Util=max -p , 68 bajtów

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

Wypróbuj online!

Pobiera każdy zestaw trzech znaków, ignoruje .środek, mapuje dodanie pozostałych dwóch na liczbę całkowitą z zakresu 0-4, łączy to z przodu twarzy emotikonu, a następnie sortuje według tego. Pobiera ostatni wpis (najbardziej przebudzony), usuwa numer z przodu i wysyła go.

Xcali
źródło