一番眠いのは誰ですか?


31

文字の文字列を取り込みプログラムまたは機能書くのと'は常に文字への代替、文字だが。文字列の奇数の長さは1より大きく、常にのいずれかで開始および終了します。-=o.-=o.-=o

基本的に、入力はさまざまな眠気状態で目を共有する絵文字の顔のラインのようになります。

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

あなたの目標は、最も眠い顔または最も目覚めている顔を印刷するか返すことです(選択するのはあなた次第です)。誰が最も眠い/最も起きているかについて複数の選択肢がある場合、それらのいずれかが出力されます。

9つの異なる顔と5つのレベルの眠気があります。

-.- 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=眠って半分のために、と0o目を覚ましのために。次に、2つの目の値を2で割った合計がパーセンテージです。

バイト単位の最短コードが優先されます。

テストケース

最も眠い

-.- 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
この魔術とは何ですか?!
AvZ

@デニス私はPythが初めてなので、これはかなり間違っているかもしれません:なぜhS%2.:z3ですか?
Helix Quar

5
@helix =.-より眠くなるようにしたいのです-.oが、それらは他の方法でソートされています。私は同じ間違いを犯していました。
xnor

9

パイソン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から、=.--.oソートルールに例外はあります。
xnor

実際、私はopを読み違えていることに気付いた。表に表示されるとおりに面がソートされていると思いました。この仮定のため、「=。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

Dyalog 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.-').
-.=

編集: r節をORで統合して16バイトを保存しました。


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

Minkolang 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、2行目の(おそらく)にジャンプします。プログラムカウンターが下に向かっていたとき、プログラムカウンターは継続し、1sを途中でスタックにプッシュします。つまり、...がヒットする^まで、リダイレクトされて1再びプッシュされます。次に、命令ポインターがヒットしf、その位置と方向を復元します(F以前に検出されたとき)。便宜上、次のコードを使用してレイアウトを変更します。(</\ 必要に応じて命令ポインタをリダイレクトします。)

$+                 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固有の複数の機能をどのように使用したかを誇りに思っています。主に三元とgosub。とにかく、そこにあります!


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;}

この関数は、最も目覚めている顔を返します。nullで終わる文字列を返すように、入力文字列を適切に変更します。


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

2つの簡単な質問:1)両方で機能する場合、Python 2/3としてラベル付けすることをお勧めしますか?2)f=このチャレンジのコードサイズの一部としてその部分が必要ですか?そうしないと、ラムダが作成され、すぐに再び
廃棄さ

1
あなたがいない場合は1)「Pythonの2/3」または単に「Pythonは」私は2を考えて結構です)必要があるf=、現在のコンセンサスはあなたがドロップすることができますので、無名関数はデフォルトで大丈夫ですということのようですf=(この場合、 xsotのニーズに、それは、再帰的なので)
SP3000



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. 文字列から各3文字の文字列を1つずつオーバーラップして取得します(これが何をするか--posです)。
  2. 値が配列の最後の要素の値を超える場合、その3文字の文字列を配列に追加します。ここで、「値」は、眠気におけるキャラクターの値の合計です。
  3. 配列の最後の要素を出力します。

0

ES6、81の 72バイト

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

おそらくChrome 45またはFirefox 41が必要です。

9バイトを節約してくれた@ETHproductionsに感謝します。


1
いいですが、"=.-"で切り替える必要があり"-.o"ます; "=.o"およびと同じ"o.-"です。また、すべてを1つのストリングに入れ、コンマで区切ってを使用することで、いくつかのバイトを節約できる場合があります.split`,`
ETHproductions

splitを使用すると、9文字節約できます
-edc65

@ETHproductions申し訳ありませんが、元の顔のリスト自体が眠気順ではなかったことに気付きませんでした。
ニール

0

> <>、55バイト

ここで試してみてください!

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

最も目覚めている顔を出力します。

-、=、およびoのASCII値がそれぞれ増加するため、それを有利に使用できます。基本的に、現在と以前の目の部分の値を追加し、以前よりも高い値であるかどうかを確認し、新しい値を保存し、表現する面を更新してから、入力の最後までループします。次に、残っている顔を出力します。(すべてのコードが適切に適合していることに非常に満足しています)


0

Perl 5、68 -MList::Util=max -pバイト

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

オンラインでお試しください!

3文字の各セットを取得.し、中央の文字を無視し、他の2 文字の追加を0〜4の範囲の整数にマッピングし、それを絵文字の前面に連結して、それでソートします。最後のエントリ(最も目覚めている)を取得し、その番号を前面から削除して出力します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.