Rispondi al telefono! Sta vibrando!


14

Di recente hai ottenuto un nuovo telefono, ma non ti piace il modo in cui vibra, hai deciso di voler creare i tuoi schemi di vibrazione. Quindi, hai scritto un programma in cui si è utilizzato le parole chiave long, shorte pauseper rendere il vostro telefono vibrare in base alle queste parole chiave.

Compito

Creare un piccolo programma che accetta una stringa di long, shorte pauseed emette un'altra stringa che rappresenta il suono fonetico di un telefono vibrante;Rrrr - Rr

longi suoni sono i Rrrr
shortsuoni Rr
(il case è importante)
pauseè un trattino -
tutti i suoni sono delimitati da trattino con spazi circostanti' - '

Casi test

input:    long long short long short
output:Rrrr - Rrrr - Rr - Rrrr - Rr

input:   long long long short short short
output:Rrrr - Rrrr - Rrrr - Rr - Rr - Rr

input:   short short short pause short short short
output:Rr - Rr - Rr - - - Rr - Rr - Rr

input:   long short short long long pause short short
output:Rrrr - Rr - Rr - Rrrr - Rrrr - - - Rr - Rr

Questa è una domanda di quindi le risposte verranno classificate in byte, con il minor numero di byte vincenti.


5
Non è un criterio soggettivo? Vorrei usare una stringa vuota, mi sembra un telefono vibrante.

6
La tua regola "suona come" è troppo vaga. Suggerirei solo di richiedere stringhe esatte. Il golf del codice richiede criteri precisi in modo da poter ottimizzare il codice senza discutere se un miglioramento sia valido.
xnor

4
Dobbiamo delimitare i suoni con un -? Questo è il caso nel tuo esempio, ma non è specificato da nessuna parte.
JAD

12
Tutti gli esempi usano un maiuscolo più basso seguito da copie di una lettera minuscola. Questa è una regola?
xnor

3
Cosa deve essere fatto prima di poter riaprire: 1) Specificare le stringhe esatte (o insiemi di stringhe) che dobbiamo usare, comprese le limitazioni del caso, 2) Chiarire se input e / o output possono essere un array di parole o array di parole caratteri, 3) Specificare il separatore esatto che deve essere usato quando viene emesso come stringa.
Shaggy,

Risposte:


12

Pyke , 22 20 byte

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

Provalo qui!

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

Il nocciolo di questa risposta è la trasformazione di ["long", "short", "pause"]in [4, 2, 0]. Ottiene il punto di codice della prima lettera di ogni parola e ANDla inserisce con 6. Per coincidenza fortunata si trasforma nei valori che stiamo cercando. (Ho cercato alcune altre soluzioni più lunghe prima di trovare questo). Una volta fatto, possiamo trasformare ulteriormente tale elenco di in ["RRRR", "RR", ""]in moltiplicando il nostro int per "R"poi trasformarlo in ["RRRR", "RR", "-"]e infine racchiuderlo in un titolo per ottenerlo ["Rrrr", "Rr", "-"]. Quindi ci uniamo alla lista risultante da" - "


Modo fantastico di farlo con la trasformazione!
tisaconundrum,

La soluzione è assurdamente simile in Pyth: j" - "m|*\M.&Chd6\-c:-)
Mr. Xcoder il

Anche l'OP aggiunge spazio agli esempi ma non li specifica, ho chiesto chiarimenti al riguardo.
Jonathan Allan,

@JonathanAllan I byte \xefe \xa6sono .oe .&rispettivamente. È una modifica retrocompatibile in cui se è impostato il bit alto, lo esegue come i vecchi comandi a 2 byte. Lo sto scrivendo in questo modo per facilitare il lettore e poiché tecnicamente Pyke non utilizza più una tabella codici e non voglio inserire byte casuali che non funzionano
Blue

14

JavaScript, 70 63 byte

2 byte salvati grazie a Luke

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

Provalo online!


6
Bel trucco con la []s esterna !
Neil,

11

Haskell , 71 66 59 byte

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

Provalo online!

Oh giusto, =<<è concatMap.

Approfitta del fatto che "long"ed "short"entrambi hanno la lettera o.


Non è necessario pagare i 2 byte per le f=funzioni senza punti sono consentite senza assegnazione
Post Rock Garf Hunter,

Puoi salvare un intero byte con lambdacase passando a lambdabot haskell:(>>=(\case 'o'->"Rr";'n'->"rr";'p'->"-";' '->" - ";_->""))
BlackCap

7

JavaScript (ES6), 65 59 byte

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 byte

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

Provalo online!

Spiegazione

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

Hai salvato 3 byte usando il AND 6trucco della risposta pyke di muddyfish






4

R , 77 byte

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

Riceve l'input attraverso STDIN, verifica se corrisponde l'ingresso long, shorto pausee swap le partite per Rrrr, Rro -, rispettivamente.

Questo viene quindi stampato con -imbottito con spazi come separatore, corrispondente all'output desiderato.


Puoi salvare 2 byte passando dalla corrispondenza a% in%:scan(,'') %in% c('long','short','pause')
YCR

@YCR Non penso che funzionerà. a %in% bcontrolla se asono presenti voci in b, mentre match(a, b)restituisce gli indici effettivi delle partite. Dato che possiamo supporre che l'input sia valido, l'utilizzo %in%restituirebbe semplicemente un vettore di TRUEs.
JAD

Arf, vero. L'ho provato con c ('long', 'short', 'pause').
YCR,

Questo perché quando si alimenta un vettore booleano [, viene interpretato come [which(bool) == TRUE], come nel tuo esempio [c(1,2,3)], che a sua volta dà l'output corretto.
JAD

Invece di sep=' - 'te puoi usare s=' - 'per 2 byte in meno
Rift

4

Röda , 73 57 47 46 40 44 byte

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

Provalo online!

+4 byte a causa della modifica della regola (deve utilizzare Rrrr posto di qualsiasi variante di 4 lettere).

Codice precedente:

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

Utilizzando Mmme Mmè più corto di 1 byte.
ATaco,

@ATaco Si dice nella domanda che "I suoni lunghi devono essere lunghi 4 caratteri e i suoni brevi devono essere lunghi 2 caratteri" .
Fergusq,

ATaco, si noti che i criteri sono stati ulteriormente specificati nella domanda.
tisaconundrum,

4

C (gcc) , 93 77 76 byte

-2 byte grazie a Scepheo!
-1 byte grazie a Cyoce!

Accetta un carattere ** con terminazione NULL o equivalente come input.

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

Provalo online!

spiegazioni:

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
Penso che è possibile combinare a++,*ain *++aper salvare due byte, e sfruttare la definizione vaga "suono" di utilizzare *a, invece di "Rrrr"salvare altri quattro byte.
Scepheo,

Il tuo secondo suggerimento è geniale!
scottinet,

1
Puoi spostare parte dello stadio di incremento del for-loop sul corpo invece di essere separato da virgola?
Cyoce,

Questo effettivamente salva un byte. Buona pesca!
scottinet,

3

R , 72 byte

Prende input da stdin, stampa su stdout.

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

Provalo online!


3

Lotto, 88 byte

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

Accetta input su STDIN. Purtroppo il sovraccarico del ciclo costa 26 byte, quindi questo è solo noioso sostituto.


2
Modifica suggerita per rimuovere tutti gli @s
Stephen

@Stephen Sì, ho ricevuto la notifica ...
Neil,

Bello! Solo due cose, però: ho considerato che la risposta fosse lunga 84 byte, non 88. Inoltre, OP ha sostituito Mmmme Mmcon Rrrre Rr, sarebbe bello aggiornare la risposta c:
Matheus Avellar

Lotto da quale piattaforma? Dubito che MS-DOS 6.22 farebbe ciò che XP fa in modalità di comando avanzata.
TOOGAM,

@TOOGAM Sì, quando dico batch di solito intendo la versione CMD.EXE di Windows NT.
Neil,


2

PHP, 113 byte

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

Provalo online!

Primo tentativo di code golf, quindi probabilmente molte ottimizzazioni disponibili!


2

Vim (52 ​​byte)

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

Probabilmente può essere ridotto ...


Stringendo i comandi insieme in questo modo si arresta il treno se uno di essi errore IE se non c'è pausa o qualcosa nella stringa data, i rimpiazzi dopo quello fallito non funzioneranno. Puoi dividerli su linee separate o mettere una ebandiera alla fine
nmjcman101

Corretto l'errore. Sento ancora che dovrebbe esserci un modo per accelerarlo, ma l'unico altro modo in cui ho pensato (dopo aver trasformato la "pausa" in un trattino s/[^ -]/r/, capitalizzare la prima R dopo ogni spazio, tagliare quattro r in due r) è uscito più a lungo.
David Heyman,

1

Excel, 100 byte

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

Per esempi, Input è SPACE una stringa separata, così come l'output.

La domanda in sé non menziona un SPACErequisito, consentendo una soluzione a 97 byte leggermente più corta :

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

1

AutoIt , 145 byte

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

(AutoIt è davvero una pessima scelta per il golf del codice, ho fatto del mio meglio per renderlo il più piccolo possibile)


Benvenuti nel sito! :)
James,

1

Alice , 37 byte

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

Provalo online!

Spiegazione

Questo programma effettua le seguenti sostituzioni:

  • l, hR
  • o, n, gr
  • p-
  • Spazio → Spazio
  • Tutto il resto → niente
"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 byte

Riceve input da stdin, stampa sustdout

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

Modifica: salvato 2 byte

Sed, 40 byte

Copia dell'idea dalla risposta di Nitrodon

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

Modifica: salvato altri 2 byte



0

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

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

Provalo online!

Prende una stringa nello stack e risulta in una stringa nello stack. anteporrei a trasformarti in un programma completo che legge da STDIN.

Utilizza &6come la risposta di Pyke e tutti gli altri, ma unisce i token insieme in modo leggermente diverso, aggiungendo un "-"token dopo ogni rumore, eliminando l'ultimo e quindi unendo questi token per spazi. Sembra salvare un byte oltre l'unione di" - " .

Spiegazione:

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 supporterà la rasatura di altri due byte sostituendo con xe "-"con '-.



0

Rubino , 67 byte

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

Questa è la soluzione JavaScript di Johan Karlsson trasferita su Ruby. Se ti piace questa risposta, dovresti votare la risposta di Johan.

L'idea chiave è di confrontare le stringhe di parole 'short', ecc. Con un singolo carattere per distinguere tra le parole.

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

Oppure, in ordine alfabetico:

  • lungo
  • m
  • pausa
  • q
  • corto

Provalo online!


0

Rubino , 78 byte

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

Le uniche parti importanti del ingresso sono p, o, g, e lo spazio ... ignorare il resto.

  • short diventa o
  • long diventa og
  • pause diventa p

Provalo online!



Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.