Geh an dein Telefon! Es vibriert!

14

Sie haben vor kurzem ein neues Telefon bekommen, aber Sie mögen die Art und Weise, wie es vibriert, nicht ganz. Sie haben beschlossen, Ihre eigenen Vibrationsmuster zu erstellen. Sie haben also ein Programm geschrieben, in dem Sie die Schlüsselwörter verwendet longhaben shortund pausedas Ihr Telefon gemäß diesen Schlüsselwörtern vibrieren lässt.

Aufgabe

Erstellen Sie ein kleines Programm , das eine Reihe von akzeptiert long, shortund , pauseund gibt eine andere Zeichenfolge , die den phonetischen Klang eines Telefons darstellt schwing;Rrrr - Rr

longgeräusche sind Rrrr
shortgeräusche sind Rr
(gehäuse zählt)
pauseist ein strich -
alle geräusche werden durch striche mit umgebenden räumen abgegrenzt' - '

Testfälle

Eingabe:    long long short long short
Ausgabe:Rrrr - Rrrr - Rr - Rrrr - Rr

Eingabe:   long long long short short short
Ausgabe:Rrrr - Rrrr - Rrrr - Rr - Rr - Rr

Eingabe:   short short short pause short short short
Ausgabe:Rr - Rr - Rr - - - Rr - Rr - Rr

Eingabe:   long short short long long pause short short
Ausgabe:Rrrr - Rr - Rr - Rrrr - Rrrr - - - Rr - Rr

Dies ist eine Frage, daher werden die Antworten in Bytes gewertet, wobei die wenigsten Bytes gewinnen.

tisaconundrum
quelle
5
Ist das nicht ein subjektives Kriterium? Ich möchte eine leere Zeichenfolge verwenden, es klingt für mich wie ein vibrierendes Telefon.
6
Ihre "klingt wie" Regel ist viel zu vage. Ich würde vorschlagen, nur exakte Zeichenfolgen zu benötigen. Codegolf erfordert präzise Kriterien, damit wir den Code optimieren können, ohne darüber zu streiten, ob eine Verbesserung gültig ist.
Xnor
4
Müssen wir die Geräusche mit einem abgrenzen -? Dies ist in Ihrem Beispiel der Fall, wird jedoch nirgends angegeben.
JAD
12
In allen Beispielen wird ein Großbuchstabe gefolgt von Kopien eines Kleinbuchstaben verwendet. Ist das eine Regel?
Xnor
3
Was muss getan werden, bevor dies wieder geöffnet werden kann: 1) Geben Sie die genauen Zeichenfolgen (oder Sätze von Zeichenfolgen) an, die verwendet werden müssen, einschließlich der Einschränkungen in Groß- und Kleinschreibung Zeichen, 3) Geben Sie das genaue Trennzeichen an, das bei der Ausgabe als Zeichenfolge verwendet werden muss.
Shaggy

Antworten:

12

Pyke , 22 20 Bytes

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

Probieren Sie es hier aus!

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

Der Kern dieser Antwort ist die Umwandlung von ["long", "short", "pause"]in [4, 2, 0]. Es wird der Codepunkt des ersten Buchstabens jedes Wortes ermittelt und ANDmit 6 bewertet. Durch glücklichen Zufall verwandelt es sich in die Werte, nach denen wir suchen. (Ich habe einige andere längere Lösungen durchgesehen, bevor ich diese gefunden habe). Sobald dies erledigt ist, können wir diese Liste von Ints weiter transformieren, ["RRRR", "RR", ""]indem wir unser int mit multiplizieren, "R"was sich dann in ein Titelgehäuse verwandelt ["RRRR", "RR", "-"], um es zu erhalten ["Rrrr", "Rr", "-"]. Wir schließen uns dann der resultierenden Liste an, indem wir" - "

Blau
quelle
Coole Art, mit der Transformation umzugehen!
Tisaconundrum
Die Lösung ist in Pyth absurd ähnlich: j" - "m|*\M.&Chd6\-c:-)
Mr. Xcoder
Auch das OP fügt den Beispielen Platz hinzu, spezifiziert sie jedoch nicht. Ich habe darum gebeten, dies zu klären.
Jonathan Allan
@ JonathanAllan Die Bytes \xefund \xa6sind .ound.& jeweils. Es ist eine abwärtskompatible Änderung, bei der das High-Bit wie die alten 2-Byte-Befehle ausgeführt wird, wenn es gesetzt ist. Ich schreibe es auf diese Weise, um es dem Leser zu erleichtern und weil Pyke technisch keine Codepage mehr verwendet und ich keine zufälligen Bytes einfügen möchte, die nicht funktionieren
Blue
14

JavaScript, 70 63 Bytes

2 Bytes gespart dank Luke

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

Probieren Sie es online!


quelle
6
Nizza Trick mit dem äußeren []s!
Neil
11

Haskell , 71 66 59 Bytes

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

Probieren Sie es online!

Ach =<<ja , ist concatMap.

Nutzt die Tatsache aus, dass "long"und "short"beide den Brief haben o.

betaveros
quelle
Sie müssen die 2 Bytes nicht bezahlen, damit f=punktfreie Funktionen ohne Zuordnung zulässig sind
Post Rock Garf Hunter
Sie können ein ganzes Byte mit Lambdacase speichern, indem Sie auf Lambdabot-Haskell umschalten:(>>=(\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
quelle
7

05AB1E , 33 27 25 21 Bytes

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

Probieren Sie es online!

Erläuterung

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

Mit dem AND 6Trick aus der Pyke-Antwort von muddyfish 3 Bytes gespeichert

Emigna
quelle
4

R , 77 Bytes

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

Übernimmt die Eingabe über STDIN, prüft, ob die Eingabe übereinstimmt long, shortoderpause und Swaps die Spiele für Rrrr,Rr oder aus- sind.

Dies wird dann -mit Leerzeichen als Trennzeichen gedruckt , die der gewünschten Ausgabe entsprechen.

JAD
quelle
Sie können 2 Bytes sparen, indem Sie von Match auf% in% scan(,'') %in% c('long','short','pause')
umschalten
@YCR Ich glaube nicht, dass das funktionieren wird. a %in% bprüft, ob Einträge in avorhanden sind b, während match(a, b)die tatsächlichen Indizes der Übereinstimmungen zurückgegeben werden. Da wir davon ausgehen können, dass die Eingabe gültig ist, %in%würde using nur einen Vektor von TRUEs zurückgeben.
JAD
Arf, stimmt. Ich habe es mit c getestet ('long', 'short', 'pause').
YCR
Dies liegt daran, dass beim Einspeisen eines booleschen Vektors [so interpretiert wird, wie [which(bool) == TRUE]dies in Ihrem Beispiel der Fall wäre [c(1,2,3)], was wiederum zu der richtigen Ausgabe führt.
JAD
Stattdessen sep=' - 'können Sie s=' - 'für 2 Bytes weniger verwenden
Rift
4

Röda , 73 57 47 46 40 44 Bytes

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

Probieren Sie es online!

+4 Byte aufgrund einer Regeländerung (muss Rrrranstelle einer 4-Buchstaben-Variante verwendet werden).

Vorheriger Code:

{[[split()|["Bzzz"]if[_="long"]else["Bz"]if[_1="short"]else["-"]]&" - "]}
fergusq
quelle
Verwenden von Mmmund Mmist 1 Byte kürzer.
ATaco
@ATaco In der Frage heißt es, dass "Lange Töne 4 Zeichen lang sein sollten und kurze Töne 2 Zeichen lang sein sollten" .
Fergusq
ATaco, bitte beachten Sie, dass die Kriterien in der Frage weiter spezifiziert wurden.
Tisaconundrum
4

C (GCC) , 93 77 76 Byte

-2 Bytes dank Scepheo!
-1 Byte danke an Cyoce!

Nimmt ein mit NULL abgeschlossenes ** Zeichen oder ein Äquivalent als Eingabe.

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

Probieren Sie es online!

Erklärungen:

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
quelle
2
Ich glaube , Sie kombinieren können a++,*ain *++azwei Bytes zu speichern und nutzen die vage „Sound“ Definition zu verwenden , *aanstatt "Rrrr"weitere vier Bytes zu speichern.
Scepheo
Ihr zweiter Vorschlag ist Genie!
Scottinet
1
Können Sie einen Teil der Inkrementstufe der for-Schleife in den Body verschieben, anstatt durch Kommas getrennt zu werden?
Cyoce
Das spart in der Tat ein Byte. Guter Fang!
Scottinet
3

R , 72 Bytes

Nimmt die Eingabe von stdin und druckt auf stdout.

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

Probieren Sie es online!

rturnbull
quelle
3

Stapel, 88 Bytes

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

Übernimmt die Eingabe für STDIN. Leider kostet der Schleifen-Overhead 26 Bytes, sodass dies nur ein langweiliger Ersatz ist.

Neil
quelle
2
Vorgeschlagene Bearbeitung , um alle @s zu entfernen
Stephen
@ Stephen Ja, ich habe die Benachrichtigung erhalten ...
Neil
Nett! Nur zwei Dinge: Ich zählte diese Antwort als 84 Bytes lang, nicht 88. Außerdem hat OP ersetzt Mmmmund Mmmit Rrrrund Rr, es wäre schön, Ihre Antwort zu aktualisieren. C:
Matheus Avellar
Batch ab welcher Plattform? Ich bezweifle, dass MS-DOS 6.22 das tun würde, was XP im erweiterten Befehlsmodus tut.
TOOGAM
@TOOGAM Ja, wenn ich Batch sage, meine ich normalerweise die CMD.EXE-Version von 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);

Try it online!

First attempt at code golf, so probably a lot of optimisations available!

crazyloonybin
quelle
2

Vim (52 bytes)

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

Can probably be made shorter...

David Heyman
quelle
Stringing the commands together like this stops the train if one of them errors IE if there's no pause or something in the given string, the replacements after the one that failed won't work. You can either split them on separate lines or put an e flag at the end
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.

Die Frage selbst erwähnt keine SPACEAnforderung, was eine etwas kürzere 97-Byte- Lösung ermöglicht:

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

AutoIt , 145 Bytes

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

(AutoIt ist wirklich eine schlechte Wahl für Codegolf. Ich habe mein Bestes gegeben, um es so klein wie möglich zu machen.)

Algirdas Butkus
quelle
Willkommen auf der Seite! :)
DJMcMayhem
1

Alice , 37 Bytes

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

Probieren Sie es online!

Explanation

Dieses Programm nimmt die folgenden Ersetzungen vor:

  • l, hR
  • o, n, gr
  • p-
  • Leertaste → Leertaste
  • Alles andere → Nichts
"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
quelle
1

Sed, 50 Bytes

Nimmt Eingaben von stdinaufstdout

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

Bearbeiten - 2 Bytes gespeichert

Sed, 40 Bytes

Idee aus Nitrodons Antwort kopieren

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

Bearbeiten: Weitere 2 Bytes gespeichert

John Gowers
quelle
0

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

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

Probieren Sie es online!

Nimmt eine Zeichenfolge auf den Stapel und führt zu einer Zeichenfolge auf dem Stapel. Voranstelleni to turn into a full program that reads from STDIN.

Verwendet &6wie die Pyke-Antwort und alle anderen, verbindet die Token jedoch leicht unterschiedlich, indem "-"nach jedem Rauschen ein Token hinzugefügt , das letzte gelöscht und diese Token dann durch Leerzeichen verbunden werden. Es scheint, als würde ein Byte gespart werden, während das Beitreten durch" - ".

Erläuterung:

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 unterstützt das Rasieren von zwei weiteren Bytes durch Ersetzen mit xund "-"mit '-.

betaveros
quelle
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
quelle
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
quelle