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.


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


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!


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.


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


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






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.


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["-"]]&" - "]}

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

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

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.


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!


2

Vim (52 bytes)

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

Can probably be made shorter...


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,"")

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


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

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



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



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!


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!



Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.