Atenda seu telefone! Está vibrando!


14

Você recentemente adquiriu um telefone novo, mas não gosta da maneira como ele vibra; decidiu que deseja criar seus próprios padrões de vibração. Então, você escreveu um programa onde você usou as palavras-chave long, shorte pausepara fazer o telefone vibrar de acordo com essas palavras-chave.

Tarefa

Criar um pequeno programa que aceita uma série de long, shorte, pausee produz uma outra string representando o som fonético de um telefone vibrando;Rrrr - Rr

longsons são Rrrr
shortsons são Rr
(Casing importa)
pauseé um traço -
todos os sons são delimitados por traços com espaços ao redor' - '

Casos de teste

entrada:    long long short long short
saída:Rrrr - Rrrr - Rr - Rrrr - Rr

entrada:   long long long short short short
saída:Rrrr - Rrrr - Rrrr - Rr - Rr - Rr

entrada:   short short short pause short short short
saída:Rr - Rr - Rr - - - Rr - Rr - Rr

entrada:   long short short long long pause short short
saída:Rrrr - Rr - Rr - Rrrr - Rrrr - - - Rr - Rr

Esta é uma questão de para que as respostas sejam pontuadas em bytes, com o menor número possível de bytes.


5
Isso não é um critério subjetivo? Eu gostaria de usar uma corda vazia, parece um telefone vibratório para mim.

6
Sua regra "soa como" é muito vaga. Eu sugiro apenas exigir cordas exatas. O código de golfe requer critérios precisos para que possamos otimizar o código sem discutir se uma melhoria é válida.
Xnor

4
Temos que delimitar os sons com a -? Este é o caso do seu exemplo, mas não está especificado em nenhum lugar.
JAD

12
Todos os exemplos usam letras maiúsculas e minúsculas seguidas de cópias de uma letra minúscula. Isso é uma regra?
Xnor

3
O que precisa ser feito antes que isso possa ser reaberto: 1) Especifique as strings exatas (ou conjuntos de strings) que devemos usar, incluindo limitações de caso, 2) Esclareça se a entrada e / ou saída pode ser uma matriz de palavras ou matrizes de caracteres, 3) Especifique o separador exato que deve ser usado ao imprimir como uma sequência.
Shaggy

Respostas:


12

Pyke , 22 20 bytes

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

Experimente aqui!

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

O cerne desta resposta é a transformação de ["long", "short", "pause"]em [4, 2, 0]. Ele obtém o ponto de código da primeira letra de cada palavra e ANDo coloca com 6. Por uma coincidência feliz, ele se transforma nos valores que estamos procurando. (Pesquisei várias outras soluções antes de encontrar esta). Uma vez feito isso, podemos transformar ainda mais essa lista de ints ["RRRR", "RR", ""]multiplicando nosso int pelo "R"qual, então, se transforma em ["RRRR", "RR", "-"]e, finalmente, o título da caixa que obtém ["Rrrr", "Rr", "-"]. Em seguida, ingressamos na lista resultante" - "


Maneira legal de fazer isso com a transformação!
tisaconundrum 25/08

A solução é absurdamente similar em Pyth: j" - "m|*\M.&Chd6\-c:-)
Mr. Xcoder

Além disso, o OP adiciona espaço aos exemplos, mas não os especifica, solicitei esclarecimentos sobre isso.
Jonathan Allan

@JonathanAllan Os bytes \xefe \xa6são .oe .&respectivamente. É uma alteração compatível com versões anteriores, onde, se o bit alto estiver definido, ele será executado como os antigos comandos de 2 bytes. Eu estou escrevendo desta forma para tornar mais fácil para o leitor e porque Pyke tecnicamente não usa uma página de código mais e eu não quero ter que inserir bytes aleatórios que não funcionam
Azul

14

JavaScript, 70 63 bytes

2 bytes salvos graças a Luke

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

Experimente online!


6
Truque agradável com o exterior []!
Neil

11

Haskell , 71 66 59 bytes

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

Experimente online!

Ah, certo, =<<é concatMap.

Tira proveito do fato de que "long"e "short"ambos têm a letra o.


Você não precisa pagar os 2 bytes para f=funções livre de ponto são permitidos sem atribuição
post rock Garf Hunter

Você pode salvar um byte inteiro com lambdacase mudando para Haskell lambdabot:(>>=(\case 'o'->"Rr";'n'->"rr";'p'->"-";' '->" - ";_->""))
Cabeção

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


7

05AB1E , 33 27 25 21 bytes

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

Experimente online!

Explicação

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

Economizou 3 bytes usando o AND 6truque da resposta pyke de muddyfish






4

R , 77 bytes

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

Toma entrada através STDIN, verifica se a entrada corresponde long, shortou pausee permuta os resultados para Rrrr, Rrou- respectivamente.

Isso é impresso com -preenchimento com espaços como separador, correspondendo à saída desejada.


Você pode salvar 2 bytes alternando de correspondência para% em%:scan(,'') %in% c('long','short','pause')
YCR 25/17

@YCR Acho que não vai funcionar. a %in% bverifica se as entradas no aestão presentes em b, enquanto match(a, b)retorna os índices reais das correspondências. Como podemos assumir que a entrada é válida, usar %in%retornaria apenas um vetor de TRUEs.
JAD

Arf, é verdade. Eu testei com c ('long', 'short', 'pause').
YCR 25/08/19

Isso ocorre porque quando você alimenta um vetor booleano [, ele é interpretado como [which(bool) == TRUE], como seria o seu exemplo [c(1,2,3)], que por sua vez fornece a saída correta.
JAD

Em vez de sep=' - 'você pode usar s=' - 'para 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+;-; ; - `/";"}

Experimente online!

+4 bytes devido a alteração de regra (deve usar Rrrr vez de qualquer variante de 4 letras).

Código anterior:

{[[split()|["Bzzz"]if[_="long"]else["Bz"]if[_1="short"]else["-"]]&" - "]}

Usando Mmme Mmé 1 byte mais curto.
ATaco 25/08

@ATaco Diz-se na pergunta que "sons longos devem ter 4 caracteres e sons curtos devem ter 2 caracteres" .
Fergusq

ATaco, observe que os critérios foram especificados mais detalhadamente na pergunta.
tisaconundrum 25/08

4

C (gcc) , 93 77 76 bytes

-2 bytes graças ao Scepheo!
-1 byte graças a Cyoce!

Toma um caractere NULL ** terminado ou equivalente como uma entrada.

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

Experimente online!

Explicações:

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":"-");
}

2
Eu acho que você pode combinar a++,*apara *++asalvar dois bytes, e aproveitar a definição vaga "som" para usar *aem vez de "Rrrr"salvar mais quatro bytes.
Scepheo

Sua segunda sugestão é genial!
scottinet

1
Você pode mover parte do estágio de incremento do loop for para o corpo, em vez de ser separado por vírgula?
Cyoce 27/08/17

Isso realmente salva um byte. Boa pegada!
precisa saber é o seguinte


3

Lote, 88 bytes

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

Recebe entrada em STDIN. Infelizmente, a sobrecarga do loop custa 26 bytes, portanto, são apenas substituições chatas.


2
Edição sugerida para remover todos os @s
Stephen

@Stephen Sim, eu recebi a notificação ...
Neil

Agradável! Apenas duas coisas, no entanto: contei que a resposta tinha 84 bytes, e não 88. Além disso, o OP foi substituído Mmmme Mmcom Rrrre Rr, seria bom atualizar sua resposta c: #
Matheus Avellar

Lote a partir de qual plataforma? Duvido que o MS-DOS 6.22 faça o que o XP faz quando está no modo de comando avançado.
TOOGAM 27/08/17

@ TOOGAM Sim, quando digo Lote, normalmente me refiro à versão do CMD.EXE do 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);

Experimente online!

Primeira tentativa de código de golfe, provavelmente há muitas otimizações disponíveis!


2

Vim (52 ​​bytes)

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

Provavelmente pode ser reduzido ...


Juntar os comandos dessa maneira interrompe o trem se um deles errar no IE se não houver uma pausa ou algo na sequência especificada, as substituições após a que falhou não funcionarão. Você pode dividi-los em linhas separadas ou colocar uma ebandeira no final
nmjcman101

Corrigido o erro. Eu ainda sinto que deveria haver alguma maneira de acelerar, mas a única outra maneira em que pensei (depois de transformar "pausa" em um traço, colocar em s/[^ -]/r/maiúscula o primeiro R depois de cada espaço, aparar de quatro para dois) saiu por mais tempo.
David Heyman

1

Excel, 100 bytes

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

Por exemplos, Entrada é SPACEsequência separada, assim como saída.

A pergunta em si não menciona um SPACErequisito, permitindo uma solução de 97 bytes um pouco mais curta :

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

1

AutoIt , 145 bytes

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

(O AutoIt é uma péssima escolha para o código de golfe, tentei o meu melhor para torná-lo o menor possível)


Bem vindo ao site! :)
DJMcMayhem

1

Alice , 37 bytes

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

Experimente online!

Explicação

Este programa faz as seguintes substituições:

  • l, hR
  • o, n, gr
  • p-
  • Espaço → Espaço
  • Tudo o resto → 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

1

Sed, 50 bytes

Recebe entrada stdin, imprime emstdout

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

Editar - salvou 2 bytes

Sed, 40 bytes

Copiando a ideia da resposta de Nitrodon

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

Editar: salvou outros 2 bytes



0

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

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

Experimente online!

Pega uma sequência na pilha e resulta em uma sequência na pilha. Anexari para se transformar em um programa completo que leia STDIN.

Usa &6como a resposta do Pyke e todos os outros, mas une os tokens de maneira um pouco diferente, adicionando um "-"token após cada ruído, excluindo o último e juntando esses tokens por espaços. Parece salvar um byte ao ingressar no " - ".

Explicação:

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

A v0.2.11 suportará a depilação de mais dois bytes substituindo por xe "-"por '-.



0

Ruby , 67 bytes

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

Esta é a solução JavaScript de Johan Karlsson portada para Ruby. Se você gosta desta resposta, deve votar novamente na resposta de Johan.

A idéia principal é comparar as sequências de palavras 'short', etc., com um único caractere, a fim de distinguir entre as palavras.

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

Ou, em ordem alfabética:

  • grandes
  • m
  • pausa
  • q
  • curto

Experimente online!


0

Ruby , 78 bytes

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

As únicas partes importantes da entrada são p, o, g, e no espaço ... ignorar o resto.

  • short torna-se o
  • long torna-se og
  • pause torna-se p

Experimente online!



Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.