Décrochez votre téléphone! Ça vibre!

14

Vous venez de recevoir un nouveau téléphone récemment, mais vous n'aimez pas vraiment la façon dont il vibre, vous avez décidé de créer vos propres modèles de vibration. Donc, vous avez écrit un programme où vous avez utilisé les mots - clés long, shortet pausede faire vibrer votre téléphone en fonction de ces mots - clés.

Tâche

Créer un petit programme qui accepte une chaîne de long, shortet pauseet émet une autre chaîne représentant le son phonétique d'un téléphone vibrant;Rrrr - Rr

longles sons sont les Rrrr
shortsons Rr
(le boîtier compte)
pauseest un tiret -
tous les sons sont délimités par un tiret avec les espaces environnants' - '

Cas de test

entrée:    long long short long short
sortie:Rrrr - Rrrr - Rr - Rrrr - Rr

entrée:   long long long short short short
sortie:Rrrr - Rrrr - Rrrr - Rr - Rr - Rr

entrée:   short short short pause short short short
sortie:Rr - Rr - Rr - - - Rr - Rr - Rr

entrée:   long short short long long pause short short
sortie:Rrrr - Rr - Rr - Rrrr - Rrrr - - - Rr - Rr

Il s'agit d'une question de donc les réponses seront notées en octets, avec le moins d'octets gagnants.

tisaconundrum
la source
5
N'est-ce pas un critère subjectif? Je voudrais utiliser une chaîne vide, cela ressemble à un téléphone vibrant pour moi.
6
Votre règle "sonne comme" est beaucoup trop vague. Je suggérerais simplement d'exiger des chaînes exactes. Le golf de code requiert des critères précis afin que nous puissions optimiser le code sans avoir d'argument sur la validité d'une amélioration.
xnor
4
Faut-il délimiter les sons avec un -? C'est le cas dans votre exemple, mais n'est spécifié nulle part.
JAD
12
Les exemples utilisent tous une majuscule inférieure suivie de copies d'une lettre minuscule. Est-ce une règle?
xnor
3
Ce qui doit être fait avant que cela puisse être rouvert: 1) Spécifiez les chaînes exactes (ou ensembles de chaînes) que nous devons utiliser, y compris les limitations de casse, 2) Clarifiez si l'entrée et / ou la sortie peut être un tableau de mots ou de tableaux de caractères, 3) Spécifiez le séparateur exact qui doit être utilisé lors de la sortie sous forme de chaîne.
Shaggy

Réponses:

12

Pyke , 22 20 octets

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

Essayez-le ici!

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

Le nœud de cette réponse est la transformation de ["long", "short", "pause"]en [4, 2, 0]. Il obtient le point de code de la première lettre de chaque mot et le ANDs avec 6. Par hasard, il se transforme en valeurs que nous recherchons. (J'ai cherché parmi pas mal d'autres solutions plus longues avant de trouver celle-ci). Une fois cela fait, nous pouvons transformer davantage cette liste d'entiers en ["RRRR", "RR", ""]multipliant notre entier par "R"lequel se transforme ensuite en ["RRRR", "RR", "-"]et enfin le titre en le mettant pour obtenir ["Rrrr", "Rr", "-"]. Nous rejoignons ensuite la liste résultante par" - "

Bleu
la source
Façon cool de s'y prendre avec la transformation!
tisaconundrum
La solution est absurdement similaire en Pyth: j" - "m|*\M.&Chd6\-c:-)
Mr. Xcoder
L'OP ajoute également de l'espace aux exemples mais ne les spécifie pas, j'ai demandé des éclaircissements à ce sujet.
Jonathan Allan
@JonathanAllan Les octets \xefet \xa6are .oet .&respectivement. C'est un changement rétrocompatible où si le bit haut est défini, il l'exécute comme les anciennes commandes de 2 octets. Je l'écris de cette façon pour le rendre plus facile pour le lecteur et parce que Pyke n'utilise plus techniquement une page de code et je ne veux pas avoir à insérer des octets aléatoires qui ne fonctionnent pas
Blue
14

JavaScript, 70 63 octets

2 octets économisés grâce à Luke

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

Essayez-le en ligne!


la source
6
Belle astuce avec les []s extérieurs !
Neil
11

Haskell , 71 66 59 octets

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

Essayez-le en ligne!

Ah =<<oui , c'est concatMap.

Profite du fait que "long"et les "short"deux ont la lettre o.

betaveros
la source
Vous n'avez pas besoin de payer les 2 octets pour que f=les fonctions sans point soient autorisées sans affectation
Post Rock Garf Hunter
Vous pouvez enregistrer un octet entier avec lambdacase en passant à lambdabot haskell:(>>=(\case 'o'->"Rr";'n'->"rr";'p'->"-";' '->" - ";_->""))
BlackCap
7

JavaScript (ES6), 65 59 octets

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
la source
7

05AB1E , 33 27 25 21 octets

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

Essayez-le en ligne!

Explication

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

Enregistré 3 octets en utilisant l' AND 6astuce de la réponse pyke de muddyfish

Emigna
la source
5

Mathematica, 81 octets

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

Essayez-le en ligne!

J42161217
la source
4

R , 77 octets

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

Prend l'entrée via STDIN, vérifie si l'entrée correspond long, shortou pauseet échange les correspondances pour Rrrr, Rrou- respectivement.

Il est ensuite imprimé avec -des espaces remplis comme séparateur, correspondant à la sortie souhaitée.

JAD
la source
Vous pouvez économiser 2 octets en passant de la correspondance à% en%:scan(,'') %in% c('long','short','pause')
YCR
@YCR Je ne pense pas que cela fonctionnera. a %in% bvérifie si les entrées dans le asont présentes dans b, tandis que match(a, b)renvoie les indices réels des correspondances. Puisque nous pouvons supposer que l'entrée est valide, l'utilisation %in%retournerait simplement un vecteur de TRUEs.
JAD
Arf, c'est vrai. Je l'ai testé avec c ('long', 'short', 'pause').
YCR
En effet, lorsque vous introduisez un vecteur booléen dans [, il est interprété comme [which(bool) == TRUE]ce qui, dans votre exemple, serait [c(1,2,3)], ce qui à son tour donne la sortie correcte.
JAD
Au lieu de sep=' - 'vous pouvez utiliser s=' - 'pour 2 octets de moins
Rift
4

Röda , 73 57 47 46 40 44 octets

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

Essayez-le en ligne!

+4 octets en raison du changement de règle (doit utiliser à la Rrrrplace de toute variante à 4 lettres).

Code précédent:

{[[split()|["Bzzz"]if[_="long"]else["Bz"]if[_1="short"]else["-"]]&" - "]}
fergusq
la source
En utilisant Mmmet Mmest 1 octet plus court.
ATaco
@ATaco Il est dit dans la question que "les sons longs doivent avoir 4 caractères et les sons courts doivent avoir 2 caractères" .
fergusq
ATaco, veuillez noter que les critères ont été précisés dans la question.
tisaconundrum
4

C (gcc) , 93 77 76 octets

-2 octets grâce à Scepheo!
-1 octet grâce à Cyoce!

Prend un caractère ** terminé par NULL ou équivalent comme entrée.

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

Essayez-le en ligne!

Explications:

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
la source
2
Je pense que vous pouvez combiner a++,*aen *++apour économiser deux octets, et profiter de la définition vague de "son" à utiliser *aau lieu d' "Rrrr"enregistrer quatre autres octets.
Scepheo
Votre deuxième suggestion est le génie!
scottinet
1
Pouvez-vous déplacer une partie de l'étape d'incrémentation de la boucle for vers le corps au lieu d'être séparé par des virgules?
Cyoce
Cela économise en effet un octet. Bonne prise!
scottinet
3

R , 72 octets

Prend l'entrée de stdin, imprime sur stdout.

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

Essayez-le en ligne!

rturnbull
la source
3

Lot, 88 octets

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

Prend entrée sur STDIN. Malheureusement, la surcharge de la boucle coûte 26 octets, ce n'est donc que des remplacements ennuyeux.

Neil
la source
2
Modification suggérée pour supprimer tous les @s
Stephen
@Stephen Oui, j'ai reçu la notification ...
Neil
Agréable! Juste deux choses, cependant: j'ai compté que cette réponse était de 84 octets de long, pas 88. De plus, OP a remplacé Mmmmet Mmavec, Rrrret Rrce serait bien de mettre à jour votre réponse c:
Matheus Avellar
Lot de quelle plateforme? Je doute que MS-DOS 6.22 fasse ce que fait XP en mode de commande amélioré.
TOOGAM
@TOOGAM Ouais, quand je dis Batch, je veux généralement dire la version CMD.EXE de Windows NT.
Neil
2

PHP, 113 octets

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

Essayez-le en ligne!

Première tentative de code golf, donc probablement beaucoup d'optimisations disponibles!

crazyloonybin
la source
2

Vim (52 ​​octets)

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

Peut probablement être raccourci ...

David Heyman
la source
En enchaînant les commandes comme ceci, le train s'arrête si l'une d'elles fait erreur sur IE s'il n'y a pas de pause ou quelque chose dans la chaîne donnée, les remplacements après celui qui a échoué ne fonctionneront pas. Vous pouvez soit les diviser sur des lignes distinctes, soit mettre un edrapeau à la fin
nmjcman101
Correction de l'erreur. Je pense toujours qu'il devrait y avoir un moyen d'accélérer, mais la seule autre façon à laquelle j'ai pensé (après avoir transformé "pause" en un tiret s/[^ -]/r/, capitaliser le premier R après chaque espace, couper quatre-r à deux-r) est sorti plus longtemps.
David Heyman
1

Excel, 100 octets

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

Par exemple, l'entrée est SPACE une chaîne séparée, tout comme la sortie.

La question elle-même ne mentionne pas d' SPACEexigence, permettant une solution légèrement plus courte de 97 octets :

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

AutoIt , 145 octets

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

(AutoIt est vraiment un mauvais choix pour le golf de code, j'ai fait de mon mieux pour le rendre aussi petit que possible)

Algirdas Butkus
la source
Bienvenue sur le site! :)
James
1

Alice , 37 octets

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

Essayez-le en ligne!

Explication

Ce programme effectue les substitutions suivantes:

  • l, hR
  • o, n, gr
  • p-
  • Espace → Espace
  • Tout le reste → Rien
"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
la source
1

Sed, 50 octets

Prend des entrées de stdin, imprime versstdout

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

Modifier - enregistré 2 octets

Sed, 40 octets

Copie de l'idée de la réponse de Nitrodon

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

Modifier: enregistré encore 2 octets

John Gowers
la source
0

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

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

Essayez-le en ligne!

Prend une chaîne sur la pile et entraîne une chaîne sur la pile. Préparez-vous ià devenir un programme complet qui lit à partir de STDIN.

Utilise &6comme la réponse de Pyke et tout le monde, mais joint les jetons ensemble légèrement différemment, en ajoutant un "-"jeton après chaque bruit, en supprimant le dernier, puis en joignant ces jetons par des espaces. Semble enregistrer un octet au lieu de rejoindre par" - " .

Explication:

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 prendra en charge le rasage de deux octets supplémentaires en remplaçant par xet "-"par '-.

betaveros
la source
0

Rubis , 67 octets

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

Il s'agit de la solution JavaScript de Johan Karlsson portée sur Ruby.Si vous aimez cette réponse, vous devriez voter pour la réponse de Johan.

L'idée clé est de comparer les chaînes de mots 'short', etc. à un seul caractère afin de distinguer les mots.

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

Ou, par ordre alphabétique:

  • longue
  • m
  • pause
  • q
  • court

Essayez-le en ligne!

alexanderbird
la source
0

Rubis , 78 octets

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

Les parties importantes que de l'entrée sont p, o, get l' espace ... ignorer le reste.

  • short devient o
  • long devient og
  • pause devient p

Essayez-le en ligne!

alexanderbird
la source