¡Contesta tu teléfono! ¡Está vibrando!

14

Recientemente recibió un teléfono nuevo, pero no le gusta la forma en que vibra, ha decidido que desea crear sus propios patrones de vibración. Entonces, has escrito un programa donde usaste las palabras clave long,short y pausehacer que su teléfono vibre de acuerdo con estas palabras clave.

Tarea

Crear un pequeño programa que acepta una cadena de long, shorty pausey da salida a otra cadena que representa el sonido fonético de un teléfono vibra;Rrrr - Rr

longlos sonidos son Rrrr
shortsonidos son Rr
(la carcasa importa)
pausees un guión -
todos los sonidos están delimitados por guión con espacios circundantes' - '

Casos de prueba

entrada:    long long short long short
salida:Rrrr - Rrrr - Rr - Rrrr - Rr

entrada:   long long long short short short
salida:Rrrr - Rrrr - Rrrr - Rr - Rr - Rr

entrada:   short short short pause short short short
salida:Rr - Rr - Rr - - - Rr - Rr - Rr

entrada:   long short short long long pause short short
salida:Rrrr - Rr - Rr - Rrrr - Rrrr - - - Rr - Rr

Esta es una pregunta de , por lo que las respuestas se puntuarán en bytes, ganando la menor cantidad de bytes.

tisaconundrum
fuente
55
¿No es ese un criterio subjetivo? Me gustaría usar una cadena vacía, me parece un teléfono vibrante.
66
Su regla de "suena como" es demasiado vaga. Sugeriría solo requerir cadenas exactas. El código de golf requiere criterios precisos para que podamos optimizar el código sin tener que discutir si una mejora es válida.
xnor
44
¿Tenemos que delimitar los sonidos con a -? Este es el caso en su ejemplo, pero no se especifica en ninguna parte.
JAD
12
Todos los ejemplos usan una letra mayúscula seguida de copias de una letra minúscula. ¿Es esta una regla?
xnor
3
Lo que debe hacerse antes de que esto pueda reabrirse: 1) Especifique las cadenas exactas (o conjuntos de cadenas) que debemos usar, incluidas las limitaciones de mayúsculas y minúsculas, 2) Aclare si la entrada y / o salida puede ser una matriz de palabras o matrices de caracteres, 3) Especifique el separador exacto que se debe utilizar al generar como una cadena.
Shaggy

Respuestas:

12

Pyke , 22 20 bytes

cFh.o6.&\R*\-|l4)J" - 

Pruébalo aquí!

c                      -  split(input, " ")
 Fh.o6.&\R*\-|l4)      -  for i in ^:
  h                    -        ^[0]
   .o                  -       ord(^)
     6.&               -      ^ & 6
        \R*            -     ^
           \-|         -    ^ or "-"
              l4       -   ^.title()
                 J" -  - " - ".join(^)

El quid de esta respuesta es la transformación de ["long", "short", "pause"]en [4, 2, 0]. Obtiene el punto de código de la primera letra de cada palabra y ANDlo marca con 6. Por casualidad, se transforma en los valores que estamos buscando. (Busqué algunas otras soluciones más largas antes de encontrar esta). Una vez hecho esto, podemos transformar aún más esa lista de entradas ["RRRR", "RR", ""]multiplicando nuestro int por el "R"cual luego se convierte ["RRRR", "RR", "-"]y finalmente se convierte en una carcasa para obtener ["Rrrr", "Rr", "-"]. Luego nos unimos a la lista resultante por" - "

Azul
fuente
¡Una forma genial de hacerlo con la transformación!
tisaconundrum
La solución es absurdamente similar en Pyth: j" - "m|*\M.&Chd6\-c:-)
Mr. Xcoder
Además, el OP agrega espacio a los ejemplos pero no los especifica, he pedido aclaraciones al respecto.
Jonathan Allan
@JonathanAllan Los bytes \xefy \xa6son .oy .&respectivamente. Es un cambio compatible con versiones anteriores donde, si se establece el bit alto, se ejecuta como los comandos de 2 bytes anteriores. Lo escribo de esta manera para que sea más fácil para el lector y porque técnicamente Pyke ya no usa una página de códigos y no quiero tener que insertar bytes aleatorios que no funcionan
Azul
14

JavaScript, 70 63 bytes

2 bytes guardados gracias a Luke

a=>a.replace(/./g,a=>[['Rr','rr','-',' - ']['onp '.search(a)]])

Pruébalo en línea!


fuente
66
Buen truco con el exterior []s!
Neil
11

Haskell , 71 66 59 bytes

g 'o'="Rr"
g 'n'="rr"
g 'p'="-"
g ' '=" - "
g _=""
f=(g=<<)

Pruébalo en línea!

Oh cierto, =<<es concatMap.

Aprovecha el hecho de que "long"y "short"ambos tienen la carta o.

betaveros
fuente
No es necesario pagar los 2 bytes para que f=las funciones sin puntos estén permitidas sin asignación
Post Rock Garf Hunter
Puede guardar un byte completo con lambdacase cambiando a lambdabot haskell:(>>=(\case 'o'->"Rr";'n'->"rr";'p'->"-";' '->" - ";_->""))
BlackCap
7

JavaScript (ES6), 65 59 bytes

s=>s.split` `.map(x=>x<'m'?'Rrrr':x<'q'?'-':'Rr').join` - `

let f =

s=>s.split` `.map(x=>x<'m'?'Rrrr':x<'q'?'-':'Rr').join` - `

console.log(f("long long short long short")); // => Rrrr - Rrrr - Rr - Rrrr - Rr
console.log(f("long long long short short short")); // => Rrrr - Rrrr - Rrrr - Rr - Rr - Rr
console.log(f("short short short pause short short short")); // => Rr - Rr - Rr - - - Rr - Rr - Rr
console.log(f("long short short long long pause short short")); // => Rrrr - Rr - Rr - Rrrr - Rrrr - - - Rr - Rr

Johan Karlsson
fuente
7

05AB1E , 33 27 25 21 bytes

#εÇн6&'m×™'-)éθ}… - ý

Pruébalo en línea!

Explicación

#                       # split input on spaces
 ε             }        # apply to each
  Çн                    # get the character code of the head
    6&                  # AND with 6
      'm×               # repeat "m" this many times
         ™              # title case
          '-)           # wrap in a list with "-"
             éθ         # get the longest string       
                … - ý   # join to string using " - " as separator

Guardado 3 bytes usando el AND 6truco de la respuesta pyke de muddyfish

Emigna
fuente
5

Mathematica, 81 bytes

StringReplace[#,{"long"->"Bzzz -","short"->"Bz -","pause"->"- -"}]~StringDrop~-2&

Pruébalo en línea!

J42161217
fuente
4

R , 77 bytes

cat(c('Rrrr','Rr','-')[match(scan(,''),c('long','short','pause'))],sep=' - ')

Toma la entrada a través de STDIN, comprueba si la entrada coincide con long, shorto pausey intercambia los resultados para Rrrr, Rro- respectivamente.

Esto se imprime con -relleno con espacios como separador, haciendo coincidir la salida deseada.

JAD
fuente
Puede guardar 2 bytes cambiando de coincidencia a% en%:scan(,'') %in% c('long','short','pause')
YCR
@YCR No creo que eso funcione. a %in% bcomprueba si las entradas en el aestán presentes en b, mientras que match(a, b)devuelve los índices reales de las coincidencias. Como podemos suponer que la entrada es válida, usar %in%solo devolvería un vector de TRUEs.
JAD
Arf, cierto. Lo he probado con c ('largo', 'corto', 'pausa').
YCR
Esto se debe a que cuando se introduce un vector booleano [, se interpreta como [which(bool) == TRUE], lo que en su ejemplo sería [c(1,2,3)], lo que a su vez da la salida correcta.
JAD
En lugar de sep=' - 'que pueda usar s=' - 'por 2 bytes menos
Rift
4

Röda , 73 57 47 46 40 44 bytes

f&a{a~=*`s\w+|l;Rr;ong;rr;p\w+;-; ; - `/";"}

Pruébalo en línea!

+4 bytes debido al cambio de regla (debe usarse en Rrrrlugar de cualquier variante de 4 letras).

Código anterior:

{[[split()|["Bzzz"]if[_="long"]else["Bz"]if[_1="short"]else["-"]]&" - "]}
fergusq
fuente
Usando Mmmy Mmes 1 byte más corto.
ATaco
@ATaco Se dice en la pregunta que "los sonidos largos deben tener 4 caracteres de longitud y los sonidos cortos deben tener 2 caracteres de longitud" .
fergusq
ATaco, tenga en cuenta que los criterios se han especificado más en la pregunta.
tisaconundrum
4

C (gcc) , 93 77 76 bytes

-2 bytes gracias a Scepheo!
-1 byte gracias a Cyoce!

Toma un ** carácter NULL terminado ** o equivalente como entrada.

f(char**a){for(;*a;*++a&&printf(" - "))printf(**a&6?**a&1?"Rr":"Rrrr":"-");}

Pruébalo en línea!

Explicaciones:

f(char**a){
  // While the string at the current position is not NULL
  for(;*a;
    // Advances the pointer to the next string
    // Then if the current string is not NULL, prints a delimiter
    *++a&&printf(" - ")
  )
    /* 
      If the 1st char of the string is not a 'p'
        If the 1st char is not a 'l'
          Prints "Rr"
        Else
          Prints "Rrrr"
      Else:
        Prints "-"
     */
    printf(**a&6?**a&1?"Rr":"Rrrr":"-");
}
scottinet
fuente
2
Creo que se puede combinar a++,*aen *++aque salvar dos bytes, y tomar ventaja de la definición vaga "sonido", para usar *aen lugar de "Rrrr"salvar a otros cuatro bytes.
Scepheo
¡Tu segunda sugerencia es genial!
scottinet
1
¿Puedes mover parte de la etapa de incremento del ciclo for al cuerpo en lugar de estar separados por comas?
Cyoce
De hecho, esto ahorra un byte. ¡Buena atrapada!
scottinet
3

R , 72 bytes

Toma datos de stdin, imprime en stdout.

cat(sapply(scan(,''),switch,long="vvvv",short="vv",pause="-"),sep=" - ")

Pruébalo en línea!

rturnbull
fuente
3

Lote, 88 bytes

@set/ps=
@set s=%s: = - %
@set s=%s:long=Rrrr%
@set s=%s:short=Rr%
@echo %s:pause=-%

Toma entrada en STDIN. Desafortunadamente, la sobrecarga del bucle cuesta 26 bytes, por lo que estos son reemplazos aburridos.

Neil
fuente
2
Edición sugerida para eliminar todos los @s
Stephen
@Stephen Sí, recibí la notificación ...
Neil
¡Agradable! Sin embargo, solo dos cosas: conté que la respuesta tenía 84 bytes de longitud, no 88. Además, OP ha reemplazado Mmmmy Mmcon Rrrry Rr, sería bueno actualizar su respuesta c:
Matheus Avellar
¿Lote a partir de qué plataforma? Dudo que MS-DOS 6.22 haga lo que hace XP cuando está en modo de comando mejorado.
TOOGAM
@TOOGAM Sí, cuando digo Batch, generalmente me refiero a la versión CMD.EXE de Windows NT.
Neil
2

PHP, 113 bytes

<?$s=[];for($i=1;$i<$argc;$i++){$c=$argv[$i][0];$s[]=($c<'m')?'Rrrr':(($c<'q')?'-':'Rr');}echo implode(' - ',$s);

Pruébalo en línea!

Primer intento de golf de código, ¡así que probablemente haya muchas optimizaciones disponibles!

crazyloonybin
fuente
2

Vim (52 ​​bytes)

:s/long/Rrrr/ge|s/short/Rr/ge|s/pause/-/ge|s/ / - /gentrar

Probablemente se puede acortar ...

David Heyman
fuente
Al unir los comandos de esta manera, el tren se detiene si uno de ellos da error a IE si no hay pausa o algo en la cadena dada, los reemplazos después del que fallaron no funcionarán. Puede dividirlos en líneas separadas o poner una ebandera al final
nmjcman101
Corrected the error. I still feel there ought to be some way to speed it up, but the only other way I thought of (after turning "pause" into a dash, s/[^ -]/r/, capitalize the first R after every space, trim four-r to two-r) came out longer.
David Heyman
1

Excel, 100 bytes

=REPLACE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(A1,"long","- Bzzz"),"short","- Bz"),"pause","- -"),1,2,"")

Per examples, Input is SPACE separated string, as is output.

La pregunta en sí no menciona un SPACErequisito, lo que permite una solución de 97 bytes un poco más corta :

=REPLACE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(A1,"long","-Bzzz"),"short","-Bz"),"pause","--"),1,1,"")
Wernisch
fuente
1

AutoIt , 145 bytes

EXECUTE(STRINGREPLACE('MSGBOX(0,0,STRINGSTRIPWS(====INPUTBOX(0,0),"PAUSE",""),"LONG","Rrrr"),"SHORT","Rr")," "," - "),4))',"=","STRINGREPLACE("))

(Auto es realmente una mala elección para el golf de código, hice mi mejor esfuerzo para hacerlo lo más pequeño posible)

Algirdas Butkus
fuente
Bienvenido al sitio! :)
DJMcMayhem
1

Alice , 37 bytes

/ lRnrhR
\""orgrp-""!yi'."?-e"ySNo?@/

Pruébalo en línea!

Explicación

Este programa realiza las siguientes sustituciones:

  • l, hR
  • o, n, gr
  • p-
  • Espacio → espacio
  • Todo lo demás → Nada
"longhp "!i.?eyN?"RrrrR- "y' " - "So@

"longhp "    Push this string
!            Immediately move to tape
i            Take input string
.            Duplicate
?ey          Remove all instances of the characters "longhp " from copy
N            Remove the remaining characters from the original, leaving only "longhp "
?"RrrrR- "y  Replace the characters in "longhp " with the corresponding characters in "RrrrR- "
' " - "S     Replace all spaces with " - "
o            Output
@            Terminate
Nitrodon
fuente
1

Sed, 50 bytes

Toma entrada de stdin, imprime astdout

s/l\w*/Rrrr -/g
s/s\w*/Rr -/g
s/p\w*/- -/g
s/ -$//

Editar - guardado 2 bytes

Sed, 40 bytes

Copiando la idea de la respuesta de Nitrodon

s/[srtaue]//g
y/lhongp/RRrrr-/
s/ / - /g

Editar: guardado otros 2 bytes

John Gowers
fuente
0

Paradoc (v0.2.10), 21 bytes (CP-1252)

Wμ‹6&'r\°"-":Ãu}« rTc

Try it online!

Takes a string on the stack and results in a string on the stack. Prepend i to turn into a full program that reads from STDIN.

Uses &6 like the Pyke answer and everybody else, but joins the tokens together slightly differently, by adding a "-" token after each noise, deleting the last one, and then joining these tokens by spaces. Seems to save a byte over joining by " - ".

Explanation:

W                     .. Break into words
 μ             }      .. Map over this block:
  ‹                   .. Take the first character
   6&                 .. Binary AND with 6, to get 4, 2, or 0
     'r               .. Character "r"
       \              .. Swap top two of stack
        °             .. Replicate, to get "rrrr", "rr", or ""
         "-"          .. Push string "-"
            :         .. Duplicate on stack
             Ã        .. Compute the max...
              u       .. ... underneath the top of the stack (so, of the
                      .. second and third elements on the stack, i.e. the
                      .. string of "r"s and "-")
                      .. The mappped block ends here; we now have
                      .. something like ["rrrr", "-", "-", "-", "rr", "-"]
                «     .. Take all but the last
                  r   .. Join with spaces (this built-in's name is two
                      .. characters, the first of which is a space)
                   Tc .. Title-case

v0.2.11 will support shaving two more bytes by replacing with x and "-" with '-.

betaveros
fuente
0

SOGL V0.12, 28 bytes

θ{K;⁄5κ« r*; p=?X┌}}¹" - ”∑ū

Try it Here!

fun fact: if it was allowed to delimit with - or - it'd be a byte shorter

dzaima
fuente
0

Ruby, 67 bytes

p ARGV[0].split(' ').map{|w|w<'m'?'Rrrr':w<'q'?'-':'Rr'}.join ' - '

This is Johan Karlsson's JavaScript solution ported to Ruby. If you like this answer, you should upvote Johan's answer.

The key idea is to compare the word strings 'short', etc. to a single character in order to distinguish between words.

| Word  | < 'm' | < 'q' | Output |
|-------|-------|-------|--------|
| short | false | false | 'Rr'   |
| long  | true  | N/A   | 'Rrrr' |
| pause | false | true  | '-'    |

Or, in alphabetical order:

  • long
  • m
  • pause
  • q
  • short

Try it online!

alexanderbird
fuente
0

Ruby, 78 bytes

p ARGV[0].chars.map{|c|{p:'-',o:'Rr',g:'rr',' '.to_sym=>' - '}[c.to_sym]}.join

The only important parts of the input are p, o, g, and space... ignore the rest.

  • short becomes o
  • long becomes og
  • pause becomes p

Try it online!

alexanderbird
fuente