Niedawno masz nowy telefon, ale nie podoba ci się sposób, w jaki wibruje, zdecydowałeś, że chcesz tworzyć własne wzorce wibracji. Napisałeś więc program, w którym użyłeś słów kluczowych long
, short
i pause
żeby twój telefon wibrował zgodnie z tymi słowami kluczowymi.
Zadanie
Stworzyć mały program, który akceptuje ciąg long
, short
oraz pause
i wyprowadza kolejny ciąg reprezentujący fonetyczną dźwięk telefonu wibrującym;Rrrr - Rr
long
Dźwięki to Rrrr
short
Dźwięki to Rr
(Sprawa obudowy)
pause
to myślnik, -
wszystkie dźwięki są rozdzielane myślnikiem z otaczającymi spacjami' - '
Przypadki testowe
wejście: long long short long short
wyjście:Rrrr - Rrrr - Rr - Rrrr - Rr
wejście: long long long short short short
wyjście:Rrrr - Rrrr - Rrrr - Rr - Rr - Rr
wejście: short short short pause short short short
wyjście:Rr - Rr - Rr - - - Rr - Rr - Rr
wejście: long short short long long pause short short
wyjście:Rrrr - Rr - Rr - Rrrr - Rrrr - - - Rr - Rr
To jest pytanie w golfa kodu, więc odpowiedzi będą oceniane w bajtach, przy najmniejszej liczbie wygranych bajtów.
-
? Tak jest w twoim przykładzie, ale nigdzie nie jest określone.Odpowiedzi:
Pyke ,
2220 bajtówWypróbuj tutaj!
Sednem tej odpowiedzi jest przekształcenie
["long", "short", "pause"]
w[4, 2, 0]
. Pobiera kod pierwszej litery każdego słowa iAND
ma 6. 6. Na szczęście przypadek przekształca się w wartości, których szukamy. (Przeszukałem kilka innych dłuższych rozwiązań, zanim znalazłem to). Gdy to zrobisz, możemy dalej przekształcić tę listę liczb całkowitych["RRRR", "RR", ""]
, mnożąc naszą liczbę wewnętrzną, przez"R"
którą następnie zamienia się["RRRR", "RR", "-"]
i na końcu tytuł, aby ją zdobyć["Rrrr", "Rr", "-"]
. Następnie dołączamy do wynikowej listy przez" - "
źródło
j" - "m|*\M.&Chd6\-c
:-)\xef
i\xa6
jest.o
i.&
odpowiednio. Jest to zmiana zgodna z poprzednimi wersjami, w przypadku gdy ustawiony jest wysoki bit, uruchamia go jak stare 2-bajtowe polecenia. Piszę to w ten sposób, aby ułatwić czytelnikowi, a ponieważ Pyke technicznie nie używa już strony kodowej i nie chcę wstawiać losowych bajtów, które nie działająJavaScript,
7063 bajtów2 bajty zapisane dzięki Łukaszowi
Wypróbuj online!
źródło
[]
!Haskell ,
716659 bajtówWypróbuj online!
No tak,
=<<
jest concatMap.Wykorzystuje fakt, że
"long"
i"short"
oba mają listo
.źródło
f=
funkcje bez punktów były dozwolone bez przypisania(>>=(\case 'o'->"Rr";'n'->"rr";'p'->"-";' '->" - ";_->""))
JavaScript (ES6),
6559 bajtówźródło
05AB1E ,
33272521 bajtówWypróbuj online!
Wyjaśnienie
Zapisane 3 bajty wykorzystujące
AND 6
sztuczki z muddyfish za PYKE odpowiedźźródło
Python 2,
766964 bytesTry it online!
Alternates:
Python 2,
7669 bytesTry it online!
Python 2, 69 bytes
Try it online!
źródło
Mathematica, 81 bytes
Try it online!
źródło
Retina,
3129 bytes1 byte saved thanks to Dom Hastings
1 byte saved thanks to Neil
Try it online!
This is different approach than @DomHastings's answer.
źródło
Perl 5, 39 bytes
37 bytes code + 2 for
-pa
.Try it online!
źródło
R, 77 bytes
Takes input through STDIN, checks whether the input matches
long
,short
orpause
and swaps the matches forRrrr
,Rr
or-
respectively.This is then printed with
-
padded with spaces as separator, matching the desired output.źródło
scan(,'') %in% c('long','short','pause')
a %in% b
checks whether entries in thea
are present inb
, whilematch(a, b)
returns the actual indices of the matches. Since we can assume that the input is valid, using%in%
would just return a vector ofTRUE
s.[
, it is interpreted as[which(bool) == TRUE]
, which in your example would be[c(1,2,3)]
, which in turn happens to give the correct output.sep=' - '
you can uses=' - '
for 2 bytes lessRöda,
735747464044 bytesTry it online!
+4 bytes due to rule change (must use
Rrrr
instead of any 4 letter variant).Previous code:
źródło
Mmm
andMm
is 1 byte shorter.C (gcc),
937776 bytes-2 bytes thanks to Scepheo!
-1 byte thanks to Cyoce!
Takes a NULL terminated **char or equivalent as an input.
Try it online!
Explanations:
źródło
a++,*a
into*++a
to save two bytes, and take advantage of the vague "sound" definition to use*a
instead of"Rrrr"
to save another four bytes.R, 72 bytes
Takes input from stdin, prints to stdout.
Try it online!
źródło
Batch, 88 bytes
Takes input on STDIN. Unfortunately loop overhead costs 26 bytes so this is just boring replacements.
źródło
@
sMmmm
andMm
withRrrr
andRr
, it would be nice to update your answer c:Retina, 31 bytes
-1 byte thanks to @fergusq!
Try it online!
źródło
PHP, 113 bytes
Try it online!
First attempt at code golf, so probably a lot of optimisations available!
źródło
Vim (52 bytes)
:s/long/Rrrr/ge|s/short/Rr/ge|s/pause/-/ge|s/ / - /g
enterCan probably be made shorter...
źródło
e
flag at the ends/[^ -]/r/
, capitalize the first R after every space, trim four-r to two-r) came out longer.Excel, 100 bytes
Per examples, Input is
SPACE
separated string, as is output.Question itself does not mention a
SPACE
requirement, allowing for a slightly shorter 97 byte solution:źródło
AutoIt, 145 bytes
(AutoIt is really bad choice for code golf, tried my best to make it small as possible)
źródło
Alice, 37 bytes
Try it online!
Explanation
This program makes the following substitutions:
l
,h
→R
o
,n
,g
→r
p
→-
źródło
Sed, 50 bytes
Takes input from
stdin
, prints tostdout
Edit - saved 2 bytes
Sed, 40 bytes
Copying idea from Nitrodon's answer
Edit: saved another 2 bytes
źródło
Python 2, 69 bytes
Try it online!
Port of my Pyke answer
źródło
Paradoc (v0.2.10), 21 bytes (CP-1252)
Try it online!
Takes a string on the stack and results in a string on the stack. Prepend
i
to turn into a full program that reads from STDIN.Uses
&6
like the Pyke answer and everybody else, but joins the tokens together slightly differently, by adding a"-"
token after each noise, deleting the last one, and then joining these tokens by spaces. Seems to save a byte over joining by" - "
.Explanation:
v0.2.11 will support shaving two more bytes by replacing
\°
withx
and"-"
with'-
.źródło
SOGL V0.12, 28 bytes
Try it Here!
fun fact: if it was allowed to delimit with
-
or-
it'd be a byte shorterźródło
Ruby, 67 bytes
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.Or, in alphabetical order:
Try it online!
źródło
Ruby, 78 bytes
The only important parts of the input are
p
,o
,g
, and space... ignore the rest.short
becomeso
long
becomesog
pause
becomesp
Try it online!
źródło
V, 32 bytes
Try it online!
źródło
Python 3, 66 bytes
Try it online!
źródło