Siapa yang paling mengantuk di antara mereka semua?

31

Tulis program atau fungsi yang mengambil string karakter di -=o.mana karakter -=o's dan .' selalu berganti, menjadi karakter. String akan memiliki panjang ganjil lebih besar dari satu dan selalu mulai dan berakhir di salah satu -=o.

Pada dasarnya, input akan terlihat seperti garis wajah emotikon yang berbagi mata di berbagai keadaan kantuk, misalnya

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

Tujuan Anda adalah mencetak atau mengembalikan wajah yang paling mengantuk atau paling terjaga (terserah Anda yang Anda pilih). Jika ada banyak pilihan untuk siapa yang paling mengantuk / paling terjaga maka salah satu dari mereka mungkin menjadi output.

Ada sembilan wajah berbeda dan lima tingkat mengantuk:

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

Dalam kasus itu tidak jelas, persentase kantuk dihitung dengan menetapkan 1untuk -untuk sepenuhnya tertidur, 0.5untuk =selama setengah tertidur, dan 0untuk ountuk terjaga. Maka jumlah dari dua nilai mata dibagi dua adalah persentase.

Kode terpendek dalam byte menang.

Uji Kasus

Tertidur

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

Kebanyakan terjaga

-.- 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
Hobi Calvin
sumber
31
Saya merasa-.-
Kritixi Lithos

Jawaban:

28

Pyth, 12 10 byte

hoSN%2.:z3

Ini mencetak emotikon yang paling mengantuk. Verifikasi semua kasus uji sekaligus di Pyth Compiler .

Kredit diberikan ke @ Sp3000 untuk gagasan menggunakan penyortiran .

Bagaimana itu bekerja

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
sumber
18
Apa sihir ini?
AvZ
@ Dennis Saya baru mengenal Pyth jadi ini mungkin salah: Kenapa tidak hS%2.:z3?
Helix Quar
5
@ helix Karena kami ingin =.-lebih mengantuk daripada -.o, tetapi mereka disortir dengan cara lain. Saya telah melakukan kesalahan yang sama.
xnor
9

Python 2, 54 53 byte

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

Ini adalah fungsi yang mengembalikan wajah yang paling terjaga.

Terima kasih banyak kepada xnor karena telah memberikan banyak trik taktis untuk mempersingkat algoritma asli saya.

xsot
sumber
Yah, saya merasa konyol tidak menyadari simbol diurutkan berdasarkan kesadaran. Saya pikir Anda bisa maxmengulanginya daripada mengulanginya melalui:f=lambda s:s[3:]and max(s[:3],f(s[2:]))or s
xnor
Sebenarnya, saya pikir ini tidak berhasil =.-.o, karena =.-vs -.oadalah pengecualian pada aturan sortir.
xnor
Sebenarnya, saya baru menyadari bahwa saya salah membaca op. Saya pikir wajah-wajah itu diurutkan ketika muncul di tabel. Karena asumsi ini, kiriman saya gagal untuk "= .o.-". Saya pikir saya sudah memperbaikinya.
xsot
@ xsot Saya percaya ,key=sortedakan menjadi solusi, tapi ini 11 karakter jadi milik Anda mungkin lebih pendek.
xnor
Ya itu perbaikan yang ada dalam pikiran saya
xsot
6

CJam, 12 byte

q3ew2%{$}$0=

Ini mencetak emotikon yang paling mengantuk. Coba biola ini atau test suite ini dalam juru bahasa CJam.

Kredit diberikan ke @ Sp3000 untuk gagasan menggunakan penyortiran .

Bagaimana itu bekerja

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
sumber
4

Dyalog APL, 35 28 byte

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

Ini adalah fungsi monadik yang mengambil string di sebelah kanan dan menampilkan wajah paling mengantuk.

    {⊃{⍵[⍒{+/'.??o='⍳⍵}¨⍵]}3,/⍵}'o.=.=.-.-.o.o'
-.-
lirtosiast
sumber
{(⊃⍒3+/'.??o='⍳⍵)⊃3,/⍵}
user46915
Dan mengingat kendala input, itu ??juga tidak perlu.
user46915
4

Prolog, 205 189 byte

Kode

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

Penjelasan

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

Contoh

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

Sunting: Disimpan 16 byte dengan menyatukan r-klausa dengan OR.

Emigna
sumber
1

Clojure, 82 byte

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

Bonus: fungsi kecil berikut mencetak wajah yang sama, tetapi dengan lebih banyak gaya!

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

Tes di sini.

Galdre
sumber
1

Ruby, 59 byte

Fungsi mengembalikan wajah paling mengantuk, menggunakan trik penyortiran.

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

Disebut seperti ini:

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

Bekerja pada tatanan mata canggung karena jenis mata internal:

f.call("=.-.o")
# => "=.-"
Neil Slater
sumber
1

Minkolang 0,12 , 119 byte

Pada awalnya, saya mencoba melakukan ini pendek dan sangat golf. Saya menyerah dan pergi untuk sesuatu yang sedikit lebih "menyenangkan", tetapi masih relatif golf.

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

Coba di sini!

Penjelasan

Tapi sungguh, klik tautan di atas dan klik Slow! Bagaimanapun...

>2@fv

Ini melompati fv, yang akan menjadi penting nanti.

$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

Apa yang dilakukan adalah meletakkan di ^sebelah wajah yang cocok. Jadi sekarang kotak kode mungkin terlihat seperti ini:

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

Tanpa komentar, tentu saja. Sekarang, 40wlubang cacing mengirim pointer instruksi v, yang segera mengarahkannya kembali F. Sekarang, Fadalah perintah "gosub". Ini seperti goto, tetapi Anda dapat kembali ke tempat Anda menyebutnya. Pada saat Fditemui, tumpukan adalah [3,1], sehingga melompat ke 1(mungkin) di baris kedua. Saat penghitung program mengarah ke bawah, program berlanjut, mendorong 1s ke tumpukan di sepanjang jalan. Yaitu ... sampai menyentuh ^, pada titik mana itu diarahkan kembali, di mana ia mendorong masing-masing 1lagi. Penunjuk instruksi kemudian mengenai f, yang mengembalikan posisi dan arahnya (ketika Fditemui sebelumnya). Untuk kenyamanan, saya akan mengambil kode berikut dan mengubah tata letaknya. (Itu</\ berfungsi untuk mengarahkan pointer instruksi sesuai kebutuhan.)

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

Saya sebenarnya agak bangga dengan bagaimana saya menggunakan beberapa fitur unik untuk Minkolang yang belum pernah saya gunakan sebelumnya. Terutama ternary dan gosub. Bagaimanapun, begitulah!

El'endia Starman
sumber
1

C, 70 byte

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

Fungsi mengembalikan wajah yang paling terjaga. Ini memodifikasi string input di tempat, sehingga mengembalikan string yang diakhiri null.

han
sumber
1

Python 2/3, 54 56 byte

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

Hanya ingin mengambil taktik alternatif untuk jawaban rekursif xsot.

Ini mengambil tuple terbaik (atau terburuk?) Dari sepasang mata yang berdekatan dan menggabungkannya.

Ganti maks dengan min untuk mengembalikan paling mengantuk (seperti ini mengembalikan paling terjaga)

Tampaknya bekerja, menggunakan tes berikut:

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)

Yang memberikan hasil sebagai berikut:

-.- 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
sumber
Dua pertanyaan cepat: 1) apakah pelabelan sebagai Python 2/3 ketika sesuatu bekerja dengan keduanya disarankan? 2) Apakah f=bagian diperlukan sebagai bagian dari ukuran kode untuk tantangan ini? Jika saya tidak melakukan itu akan membuat lambda dan kemudian segera membuangnya lagi ...
TLW
1
1) "Python 2/3" atau hanya "Python" baik-baik saja saya pikir 2) Jika Anda tidak perlu yang f=kemudian konsensus saat ini tampaknya bahwa fungsi anonim baik-baik saja secara default, sehingga Anda bisa drop f=dalam kasus ini ( xsot membutuhkannya karena ini bersifat rekursif)
Sp3000
0

Mathematica, 61 byte

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

Cocok untuk yang paling mengantuk.

LegionMammal978
sumber
Fungsi ini hanya berfungsi sekali, kecuali jika Anda mengulangi seluruh kode setiap kali Anda ingin menyebutnya. Titik pengiriman fungsi adalah agar mereka dapat digunakan kembali . Memanggil fungsi Anda merusak nilai global %yang diandalkannya.
Martin Ender
0

F # 60

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

Pengembalian paling wajah terjaga (perubahan maxoleh minkarena yang tidur itu)

Sehnsucht
sumber
0

Perl 5, 127 byte

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

(Saya yakin ini bisa dilakukan lebih singkat.) Cara kerjanya:

  1. Raih masing-masing string tiga karakter dari string, dengan tumpang tindih satu (itulah yang --posdilakukannya).
  2. Tambahkan string tiga karakter ke array jika nilainya melebihi elemen terakhir array; di sini, "nilai" hanyalah jumlah nilai karakternya dalam kantuk.
  3. Cetak elemen terakhir dari array.
msh210
sumber
0

ES6, 81 72 byte

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

Mungkin membutuhkan Chrome 45 atau Firefox 41.

Terima kasih kepada @ETHproductions untuk menghemat 9 byte

Neil
sumber
1
Bagus, tetapi "=.-"harus diganti dengan "-.o"; sama dengan "=.o"dan "o.-". Anda juga dapat menyimpan beberapa byte dengan meletakkan semuanya dalam satu string, dipisahkan dengan koma, dan menggunakan .split`,` .
ETHproduk
Menggunakan split dapat menghemat 9 karakter
edc65
@ ETHproductions Maaf saya tidak melihat bahwa daftar asli wajah itu sendiri tidak dalam urutan mengantuk.
Neil
0

> <> , 55 byte

coba di sini!

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

Output wajah paling terjaga.

Karena nilai ASCII untuk -, =, dan o masing-masing meningkat, saya dapat menggunakannya untuk keuntungan saya. Pada dasarnya ia menambahkan nilai-nilai dari bagian mata saat ini dan sebelumnya, memeriksa apakah itu nilai yang lebih tinggi dari sebelumnya, jika itu menyimpan nilai baru dan memperbarui apa yang diwakilinya, kemudian loop sampai akhir input. Lalu output wajah yang tersisa. (Saya sangat senang melihat betapa bagusnya semua kode di tempatnya)

torcado
sumber
0

Perl 5 -MList::Util=max -p , 68 byte

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

Cobalah online!

Raih masing-masing set tiga karakter, abaikan .di tengah, petakan penambahan dua lainnya ke integer di kisaran 0-4, gabungkan bahwa ke depan wajah emotikon, lalu urutkan berdasarkan itu. Raih entri terakhir (paling terjaga), hapus nomor dari depan, dan keluarkan.

Xcali
sumber