Хто з них найсоніший?


31

Напишіть програму або функцію, яка містить рядок символів, -=o.де -=o'і і .завжди чергуються, символ на символ. Рядок буде мати непарну довжину більше, ніж одна, і завжди починається і закінчується в одному з -=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протягом неспання. Тоді сума двох очних значень, розділених на два, становить відсоток.

Виграє найкоротший код у байтах.

Випробування

Найсонічніший

-.- 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
Що це за чаклунство ?!
АвЗ

@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

Діалог 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.-').
-.=

Редагувати: Збережено 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.

Я насправді якось пишаюся тим, як використовував кілька унікальних для Minkolang функцій, якими я не часто користувався раніше. Переважно тернар і госуб. У всякому разі, там у вас є!


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.

Це займає найкращий (чи найгірший?) Кортеж сусідніх пар очей та з’єднує їх.

Замініть макс на 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

Математика, 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.