¿Quién es el más somnoliento de todos?

31

Escribir un programa o función que toma en una cadena de caracteres -=o., donde los -=o's y .' S siempre se alternan, un personaje a otro. La cadena tendrá una longitud impar mayor que uno y siempre comenzará y terminará en uno de -=o.

Básicamente, la entrada se verá como una línea de caras de emoticones que comparten ojos en varios estados de somnolencia, p. Ej.

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

Su objetivo es imprimir o devolver la cara que sea la más soñolienta o la más despierta (depende de usted cuál elija). Si hay varias opciones para saber quién está más somnoliento / más despierto, cualquiera de ellas puede salir.

Hay nueve caras distintas y cinco niveles de somnolencia:

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

En caso de que no esté claro, el porcentaje de somnolencia se calcula asignando 1a -completamente dormido, 0.5a =medio dormido y 0a odespierto. Entonces, la suma de los dos valores oculares divididos por dos es el porcentaje.

El código más corto en bytes gana.

Casos de prueba

Más somnoliento

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

Más despierto

-.- 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
Pasatiempos de Calvin
fuente
31
Me siento-.-
Kritixi Lithos

Respuestas:

28

Pyth, 12 10 bytes

hoSN%2.:z3

Esto imprime el emoticon más somnoliento. Verifique todos los casos de prueba a la vez en el Compilador Pyth .

El crédito va a @ Sp3000 por la idea de utilizar la clasificación .

Cómo funciona

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
fuente
18
¡¿Qué es esta hechicería?!
AvZ
@ Dennis Soy nuevo en Pyth, así que esto podría estar muy mal: ¿por qué no hS%2.:z3?
Helix Quar
55
@helix Porque queremos =.-estar más somnolientos que -.o, pero están ordenados de otra manera. Había cometido el mismo error.
xnor
9

Python 2, 54 53 bytes

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

Esta es una función que devuelve la cara que está más despierta.

Muchas gracias a xnor por proporcionar muchos trucos tácticos para acortar mi algoritmo original.

xsot
fuente
Bueno, me siento tonto al no darme cuenta de que los símbolos están ordenados por la vigilia. Creo que se puede recursivamente el maxlugar de iterar a través de:f=lambda s:s[3:]and max(s[:3],f(s[2:]))or s
XNOR
En realidad, creo que esto no funciona =.-.o, ya que =.-vs -.oes la excepción a la regla de clasificación.
xnor
En realidad, me acabo de dar cuenta de que leí mal la operación. Pensé que las caras están ordenadas tal como aparecen en la tabla. Debido a esta suposición, mi envío falla por "= .o.-". Aunque creo que tengo una solución.
xsot
@xsot creo ,key=sortedque sería una solución, pero esto son 11 caracteres, por lo que el tuyo es probablemente más corto
xnor
Sí, esa es la solución que tenía en mente
xsot
6

CJam, 12 bytes

q3ew2%{$}$0=

Esto imprime el emoticon más somnoliento. Pruebe este violín o este conjunto de pruebas en el intérprete de CJam.

El crédito va a @ Sp3000 por la idea de utilizar la clasificación .

Cómo funciona

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

Dyalog APL, 35 28 bytes

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

Esta es una función monádica que toma la cadena a la derecha y genera la cara más somnolienta.

    {⊃{⍵[⍒{+/'.??o='⍳⍵}¨⍵]}3,/⍵}'o.=.=.-.-.o.o'
-.-
lirtosiast
fuente
{(⊃⍒3+/'.??o='⍳⍵)⊃3,/⍵}
user46915
Y dadas las restricciones de entrada, eso ??también es innecesario.
user46915
4

Prólogo, 205 189 bytes

Código

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

Explicación

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

Ejemplo

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

Editar: se guardaron 16 bytes al unificar las cláusulas r con OR.

Emigna
fuente
1

Clojure, 82 bytes

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

Bonificación: la siguiente función más pequeña imprime la misma cara, ¡pero con más estilo!

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

Prueba aquí.

galdre
fuente
1

Ruby, 59 bytes

La función devuelve la cara más somnolienta, usando el truco de clasificación.

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

Llamado así:

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

Funciona en un orden de ojos incómodo debido a la clase interna de ojos:

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

Minkolang 0.12 , 119 bytes

Al principio, intenté hacer esto corto y realmente golfista. Me di por vencido y fui por algo un poco más "divertido", pero aún relativamente golfístico.

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

Pruébalo aquí!

Explicación

Pero realmente, ¡haz clic en el enlace de arriba y haz clic Slow! De todas formas...

>2@fv

Esto omite el fv, que será importante más adelante.

$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

Lo único que hizo fue poner un ^lado de las caras que coincidían. Entonces, el cuadro de código podría verse así:

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

Sin los comentarios, por supuesto. Ahora, el 40wagujero de gusano envió el puntero de instrucciones a v, que inmediatamente lo redirige F. Ahora, Fes un comando "gosub". Es como un goto, pero puedes volver a donde lo llamaste. En el momento en que Fse encuentra, la pila es [3,1], por lo que salta al 1(tal vez) en la segunda fila. Mientras el contador del programa se dirigía hacia abajo, continúa, empujando 1s en la pila a lo largo del camino. Es decir ... hasta que golpea a ^, en cuyo punto se redirige hacia arriba, donde empuja a cada uno 1nuevamente. Luego f, el puntero de instrucción golpea , lo que restaura su posición y dirección (cuando Fse encontró anteriormente). Por conveniencia, tomaré el siguiente código y cambiaré su diseño. (Los</\ servir para redirigir el puntero de instrucciones según sea necesario.)

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

De hecho, estoy un poco orgulloso de cómo utilicé varias funciones exclusivas de Minkolang que nunca antes había usado. Principalmente el ternario y el gosub. De todos modos, ahí lo tienes!

El'endia Starman
fuente
1

C, 70 bytes

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

La función devuelve la cara más despierta. Modifica la cadena de entrada en su lugar, para devolver una cadena terminada en nulo.

han
fuente
1

Python 2/3, 54 56 bytes

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

Solo quería tomar una táctica alternativa a la respuesta recursiva de xsot.

Esto toma la mejor (¿o la peor?) Tupla de pares de ojos adyacentes y los une.

Reemplace max con min para devolver el sueño más (ya que esto devuelve el más despierto)

Parece funcionar, usando la siguiente prueba:

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)

Lo que da el siguiente resultado:

-.- 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
fuente
Dos preguntas rápidas: 1) ¿se recomienda etiquetar como Python 2/3 cuando algo funciona con ambos? 2) ¿Se f=requiere la parte como parte del tamaño del código para este desafío? Si no hago eso, creará el lambda y luego lo tiraré inmediatamente de nuevo ...
TLW
1
1) "Python 2/3" o simplemente "Python" es bien pienso 2) Si usted no necesita la f=continuación, el consenso actual parece ser que las funciones anónimas están bien por defecto, lo que puede caer el f=en este caso ( xsot lo necesita ya que es recursivo)
Sp3000
0

Mathematica, 61 bytes

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

Va por el más somnoliento.

LegionMammal978
fuente
Esta función solo funciona una vez, a menos que repita el código completo cada vez que quiera llamarlo. El punto de las presentaciones de funciones es que sean reutilizables . Llamar a su función rompe el valor del global en el %que se basa.
Martin Ender
0

F # 60

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

Devuelve la cara más despierta (cambia maxpor minla más dormida)

Sehnsucht
fuente
0

Perl 5, 127 bytes

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

(Estoy seguro de que se puede hacer más brevemente). Cómo funciona:

  1. Tome cada cadena de tres caracteres de la cadena, con una superposición de uno (eso es lo que --poshace).
  2. Agregue esa cadena de tres caracteres a una matriz si su valor excede el del último elemento de la matriz; aquí, "valor" es solo la suma de los valores de sus personajes en la somnolencia.
  3. Imprime el último elemento de la matriz.
msh210
fuente
0

ES6, 81 72 bytes

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

Probablemente requiere Chrome 45 o Firefox 41.

Gracias a @ETHproductions por guardar 9 bytes.

Neil
fuente
1
Agradable, pero "=.-"debe cambiarse con "-.o"; lo mismo con "=.o"y "o.-". Además, puede guardar algunos bytes colocando todo en una cadena, separados por comas y utilizando .split`,` .
ETHproductions
Usar split podría ahorrar 9 caracteres
edc65
@ETHproductions Lo siento, no me di cuenta de que la lista original de caras no era en sí misma en orden de somnolencia.
Neil
0

> <> , 55 bytes

Pruébalo aquí!

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

Salidas cara más despierto.

Dado que los valores ASCII para -, = yo aumentan respectivamente, podría usar eso para mi ventaja. Básicamente, agrega los valores de la parte del ojo actual y anterior, verifique si es un valor más alto que antes, si lo es, guarda el nuevo valor y actualiza la cara que representa, luego realiza un bucle hasta el final de la entrada. Luego sale la cara que queda. (Estoy muy contento de lo bien que todo el código encaja en su lugar)

torcado
fuente
0

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

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

Pruébalo en línea!

Toma cada conjunto de tres caracteres, ignora el .del medio, asigna la suma de los otros dos a un número entero en el rango 0-4, concatena eso al frente de la cara del emoticón y luego lo ordena por eso. Agarra la última entrada (la más despierta), elimina el número del frente y lo emite.

Xcali
fuente