Кто из них самый спящий?


31

Напишите программу или функцию, которая принимает строку символов, -=o.где символы -=o's .' и 's' всегда чередуются, символ за символом. Строка будет иметь нечетную длину больше единицы и всегда начинаться и заканчиваться одним из -=o.

По сути, ввод будет выглядеть как линия смайликов, которые разделяют глаза в различных состояниях сонливости, например

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

Ваша цель - напечатать или вернуть лицо, которое является либо самым сонным, либо самым бодрствующим (вы сами выбираете). Если есть несколько вариантов для тех, кто спит / наиболее бодрствует, то может быть выведен любой из них.

Есть девять отдельных лиц и пять уровней сонливости:

-.- 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чтобы =за полусне, и 0в oтечение бодрствования. Тогда сумма двух значений глаз, деленная на два, представляет собой процент.

Самый короткий код в байтах побеждает.

Тестовые случаи

Sleepiest

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

Most Awake

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

Кредит идет к @ 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

Python 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, так как =.-vs -.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

Дьялог АПЛ, 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.-').
-.=

Изменить: 16 байтов сохранены путем объединения r-предложений с ИЛИ.


1

Clojure, 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

Минколанг 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". Это как гото, но вы можете вернуться туда, где вы его назвали. В то время, когда Fвстречается, стек есть [3,1], поэтому он переходит к 1(возможно) во второй строке. Когда счетчик программ движется вниз, он продолжает работу, вставляя 1s в стек по пути. То есть ... до тех пор, пока он не коснется a ^, в этот момент он перенаправляется обратно вверх, где он 1снова толкает каждого . Указатель инструкций затем нажимает f, что восстанавливает его положение и направление (когда Fвстречалось ранее). Для удобства я возьму следующий код и поменяю его раскладку. (The</\ служат для перенаправления указателя инструкций по мере необходимости.)

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

Я на самом деле горжусь тем, как я использовал несколько уникальных для Минколанга функций, которыми раньше не пользовался. В основном троичный и госуб. Во всяком случае, у вас есть это!


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

Python 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) «Python 2/3» или просто «Python» отлично я думаю , 2) Если вы не нужныf= то текущий консенсус , кажется, что анонимные функции в порядке по умолчанию, так что вы можете опускать f=в этом случае ( xsot нуждается в этом, так как он рекурсивный)
Sp3000


0

Mathematica, 61 байт

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

Идет к самому сонному.


Эта функция работает только один раз, если вы не повторяете весь код каждый раз, когда хотите ее вызвать. Смысл представления функций в том, чтобы их можно было многократно использовать . Вызов вашей функции нарушает значение глобальной %переменной, на которую она опирается.
Мартин Эндер

0

F # 60

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

Возвращает наиболее просыпается лицо (изменение maxот minза спящий)


0

Perl 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. Возьмите каждую трехсимвольную строку из строки, с перекрытием на одно (это то, что --posделает).
  2. Добавьте эту трехсимвольную строку в массив, если ее значение превышает значение последнего элемента массива; здесь «значение» - это просто сумма значений его символов в сонливости.
  3. Распечатать последний элемент массива.

0

ES6, 81 72 байта

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

Вероятно, требуется Chrome 45 или Firefox 41.

Спасибо @ETHproductions за сохранение 9 байтов.


1
Хорошо, но "=.-"следует переключаться с "-.o"; то же самое с "=.o"и "o.-". Кроме того, вы можете сохранить несколько байтов, поместив все в одну строку, разделив их запятыми, и используя .split`,` .
ETHproductions

Использование сплита может сохранить 9 символов
edc65

@ETHproductions Извините, я не заметил, что оригинальный список лиц сам по себе не был в порядке сонливости.
Нил

0

> <> , 55 байт

попробуйте это здесь!

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

Выходы самого бодрствующего лица.

Поскольку значения ASCII для -, = и o увеличиваются соответственно, я мог бы использовать это в своих интересах. В основном это добавляет значения текущей и предыдущей части глаза, проверяет, является ли это более высоким значением, чем прежде, если это - оно сохраняет новое значение и обновляет то, что представляет лицо, а затем зацикливается до конца ввода. Затем выводит лицо, которое осталось. (Я очень рад тому, как хорошо все код помещается на место)


0

Perl 5 -MList::Util=max -p , 68 байт

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

Попробуйте онлайн!

Захватывает каждый набор из трех символов, игнорирует .в середине, отображает сложение двух других в целое число в диапазоне 0-4, объединяет это с передней частью лица смайлика, а затем сортирует по этому. Захватывает последнюю запись (наиболее активную), удаляет номер спереди и выводит его.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.