Bunların en uykusu kim?


31

Karakter dizesi alır bir program veya fonksiyon yazın 'ler ve hep karaktere alternatif, karakter s. Dize, tek bir taneden daha büyük bir uzunluğa sahip olacak ve her zaman birinde başlayıp bitecek .-=o.-=o.-=o

Temel olarak girdi, çeşitli uykululuk hallerinde gözleri paylaşan bir ifade yüzleri çizgisine benzeyecek, örneğin;

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

Amacınız, en uykulu veya en uyanık olan yüzü yazdırmak veya iade etmektir (seçtiğiniz size bağlıdır). En uykulu / en uyanık olan için birden fazla seçenek varsa, bunlardan herhangi biri çıktı olabilir.

Dokuz ayrı yüz ve beş uykululuk düzeyi vardır:

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

O açık değil halinde, uyku hali yüzdesi atayarak hesaplanır 1için -, tam uykuya için 0.5için =uykuya yarım için ve 0karşı ouyanık için. Daha sonra, iki göz değerinin toplamı ikiye bölerek yüzdedir.

Bayt cinsinden en kısa kod kazanır.

Test Kılıfları

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

Çoğu uyanık

-.- 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
Ben hissediyorum-.-
Kritixi Lithos 20:15

Yanıtlar:


28

Pyth, 12 10 bayt

hoSN%2.:z3

Bu uykulu ifadeyi yazdırır. Pyth Compiler'da tüm test durumlarını bir kerede doğrulayın .

Kredi sıralama fikri kullanmak için @ Sp3000 gider .

Nasıl çalışır

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
Bu büyücülük nedir?
AvZ

@Dennis Pyth için yeniyim, bu yüzden bu yanlış olabilir: Neden olmasın hS%2.:z3?
Helix Quar

5
@helix Çünkü biz =.-daha uykulu olmak istiyoruz -.o, ama diğer tarafa göre sıralanmışlar. Ben de aynı hatayı yapmıştım.
XNOR

9

Python 2, 54 53 bayt

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

Bu, en uyanık olan yüzü döndüren bir işlevdir.

Orijinal algoritmamı kısaltmak için taktiksel püf noktaları sağladığı için xnor'a teşekkür ederim.


Eh, sembollerin uyanıklık tarafından sıralandığını fark etmiyorum aptalca hissediyorum. Sanırım maxyinelemek yerine yineleyebilirsin:f=lambda s:s[3:]and max(s[:3],f(s[2:]))or s
xnor

Aslında, bunun işe yaramayacağını düşünüyorum =.-.o, çünkü =.-vs -.o, sıralama kuralının istisnasıdır.
xnor

Aslında, operasyonu yanlış yaptığımı farkettim. Yüzlerin tabloda göründüğü gibi sıralandığını düşündüm. Bu varsayım nedeniyle gönderim "= .o.-" için başarısız oldu. Sanırım bir fikrim var.
xsot

@ xsot ,key=sortedBir çözüm olacağına inanıyorum , ancak bu 11 karakter yani sizinki de daha kısa.
xnor

Evet, aklımdaki düzeltme
buydu

6

CJam, 12 bayt

q3ew2%{$}$0=

Bu uykulu ifadeyi yazdırır. Deneyin bu keman veya bu test paketi CJam yorumlayıcı.

Kredi sıralama fikri kullanmak için @ Sp3000 gider .

Nasıl çalışır

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 bayt

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

Bu, dizeyi sağa alan ve en uyuyan yüzü çıkaran monadik bir işlevdir.

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

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

Ve girdi kısıtlamaları verildiğinde, bu ??da gereksizdir.
user46915

4

Prolog, 205 189 bayt

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

açıklama

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

Örnek

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

Düzenleme: r yan tümcelerini OR ile birleştirerek 16 bayt kurtardı.


1

Clojure, 82 bayt

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

Bonus: Aşağıdaki daha küçük fonksiyon aynı yüzü basar ancak daha fazla stile sahiptir!

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

Burada test et.


1

Ruby, 59 bayt

İşlev, sıralama numarasını kullanarak en uyuyan yüzü döndürür.

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

Böyle denir:

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

Dahili göz türünden dolayı garip göz düzeni ile çalışır:

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

1

Minkolang 0.12 , 119 bayt

İlk başta bu kısa ve gerçekten golf oynamaya çalıştım. Vazgeçtim ve biraz daha "eğlenceli" bir şey için gittim, fakat yine de nispeten golfçüydüm.

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

Burada dene!

açıklama

Ama gerçekten, yukarıdaki linke tıklayın ve tıklayın Slow! Neyse ...

>2@fv

Bu fvdaha sonra önemli olacak olan üzerinden atlar .

$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

Bütün bunlar ^, eşleşen yüzlerin yanına kondu . Yani şimdi kod kutusu şöyle görünebilir:

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

Tabii ki, yorumlar olmadan. Şimdi, 40wsolucan deliği için talimat işaretçisi gönderilen vhemen üzerine yönlendirir, F. Şimdi Fbir "gosub" komutu var. Bu bir goto gibi, ama onu aradığınız yere geri dönebilirsiniz. Zaman Fkarşılaşıldığında, yığın [3,1], yani 1ikinci satırda (belki) atlar . Program sayacı aşağı doğru ilerlerken 1, yol boyunca yığının üzerine iterek devam eder . Bu ... bir vuruş yapana kadar, o ^noktada tekrar yönlendirilir, tekrar basar 1. Talimat işaretçisi daha sonra fpozisyonunu ve yönünü geri kazandı ( Fdaha önce karşılaşıldığında). Kolaylık olması için aşağıdaki kodu alıp düzenini değiştireceğim. (</\ talimat işaretçisini gerektiği gibi yönlendirmek için kullanılır.)

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

Aslında daha önce hiç kullanmadığım Minkolang'a özgü birden fazla özelliği nasıl kullandığımla gurur duyuyorum. Esas olarak üçlü ve gosub. Neyse, işte oradasın!


1

C, 70 bayt

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

İşlev en uyanık yüzü döndürür. Boş bir sonlandırılmış dize döndürecek şekilde giriş dizesini yerinde değiştirir.


1

Python 2/3, 54 56 bayt

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

Sadece xsot'un özyinelemeli cevabına alternatif bir vuruş yapmak istedim.

Bu, bitişik göz çiftlerinin en iyi (veya en kötü?) Demetini alır ve birleştirir.

En uykulu olanı döndürmek için maks.

Aşağıdaki testi kullanarak iş gibi görünüyor:

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)

Aşağıdaki sonucu verir:

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

İki hızlı soru: 1) her ikisi de önerilen bir şeyle çalıştığında Python 2/3 olarak etiketleniyor mu? 2) f=Bu meydan okuma için kod boyutunun bir parçası olarak gerekli mi? Bunu yapmazsam lambda yaratacak ve hemen hemen tekrar fırlatacak ...
TLW

1
1) "Python 2/3" veya sadece "Python" Ben 2 düşünüyorum ince) Eğer yoksa olduğunu lüzumf= sen bırak, böylece daha sonra şimdiki konsensüs isimsiz fonksiyonlar varsayılan olarak iyi misin gibi görünüyor f=(bu durumda xsot'un özyinelemeli olduğundan beri ihtiyacı var)
Sp3000


0

Mathematica, 61 bayt

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

En uykulu olana gider.


Bu işlev yalnızca bir kez çalışır, kodun tamamını aramak istediğiniz her seferinde tekrar etmediğiniz sürece. İşlev gönderimlerinin amacı yeniden kullanılabilir olmalarıdır . İşlevinizi çağırmak, %dayandığı globalin değerini bozar.
Martin Ender

0

F # 60

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

İade çoğu uyanık yüzü (değiştir maxtarafından minsleepest için)


0

Perl 5, 127 bayt

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

(Daha kısa sürede yapılabildiğinden eminim.) Nasıl çalışıyor:

  1. Her üç karakterli dizgiyi dizeden al, tek tek üst üste gel (bu ne --posyapar).
  2. Değeri dizinin son öğesinin değerini aşıyorsa, bu üç karakterli dizeyi bir diziye ekleyin; Burada "değer", karakterlerinin uykululuktaki değerlerinin toplamıdır.
  3. Dizinin son elemanını yazdır.

0

ES6, 81 72 bayt

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

Muhtemelen Chrome 45 veya Firefox 41 gerektirir.

9 byte tasarruf için @ETHproductions sayesinde.


1
Güzel, ama "=.-"değiştirilmelidir "-.o"; "=.o"ve ile aynı "o.-". Ayrıca, her şeyi bir dizgeye koyarak virgüllerle ayırarak ve kullanarak bazı baytları kaydedebilirsiniz .split`,` .
ETHProductions

9 karakter kurtarabilecek bölünmüş kullanma
edc65

@ETHproductions Özgün yüz listesinin uykululuk sırasına göre olmadığını fark ettim.
Neil

0

> <> , 55 bayt

burada dene!

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

Çoğu uyanık yüzü çıkarır.

ASCII değerleri sırasıyla -, = ve o arttıkça, bunu avantajım için kullanabilirim. Temel olarak mevcut ve önceki göz kısmının değerlerini ekler, öncekinden daha yüksek bir değer olup olmadığını kontrol edin, eğer yeni değeri kaydediyorsa ve temsil ettiği yüzü güncellerse, girişin sonuna kadar döngüler. Sonra kalan yüzü çıkarır. (Tüm kodların yerine ne kadar uyduğuna çok sevindim)


0

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

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

Çevrimiçi deneyin!

Her üç karakter kümesini alın ., ortadakileri yok sayar, diğer ikisinin ilavesini 0-4 aralığında bir tamsayıya eşler, bunu ifade yüzünün önüne birleştirir, sonra sıralar. Son girişi kapar (çoğu uyanık), numarayı önden kaldırır ve çıkarır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.