Подними трубку! Это вибрирует!

14

Недавно вы приобрели новый телефон, но вам не нравится, как он вибрирует, вы решили создать свои собственные шаблоны вибрации. Итак, вы написали программу, в которой вы использовали ключевые слова long, shortиpause чтобы ваш телефон вибрировал в соответствии с этими ключевыми словами.

задача

Создайте небольшую программу , которая принимает строку long, shortи pauseи выводит другую строку , представляющую фонетический звук телефона вибрационного;Rrrr - Rr

longзвуки есть Rrrr
shortзвуки Rr
(Корпус имеет значение)
pauseэто тире -
все звуки ограничены тире с окружающими пространствами' - '

Тестовые случаи

вход:    long long short long short
выход:Rrrr - Rrrr - Rr - Rrrr - Rr

вход:   long long long short short short
выход:Rrrr - Rrrr - Rrrr - Rr - Rr - Rr

вход:   short short short pause short short short
выход:Rr - Rr - Rr - - - Rr - Rr - Rr

вход:   long short short long long pause short short
выход:Rrrr - Rr - Rr - Rrrr - Rrrr - - - Rr - Rr

Это вопрос по поэтому ответы будут оцениваться в байтах, при этом выигрывает наименьшее количество байтов.

tisaconundrum
источник
5
Разве это не субъективный критерий? Я хотел бы использовать пустую строку, для меня это звучит как вибрирующий телефон.
6
Ваше правило "звучит как" слишком расплывчато. Я бы предложил просто требовать точных строк. Код гольф требует точных критериев, поэтому мы можем оптимизировать код без спора о том, является ли улучшение действительным.
xnor
4
Нужно ли разделять звуки с помощью -? Это так в вашем примере, но нигде не указано.
JAD
12
Все примеры используют заглавные буквы, за которыми следуют копии строчных букв. Это правило?
xnor
3
Что нужно сделать, прежде чем это можно будет снова открыть: 1) Укажите точные строки (или наборы строк), которые мы должны использовать, включая ограничения по регистру. 2) Уточните, может ли ввод и / или вывод быть массивом слов или массивов символы, 3) Укажите точный разделитель, который должен использоваться при выводе в виде строки.
Лохматый

Ответы:

12

Пайк , 22 20 байт

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

Попробуй это здесь!

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

Суть этого ответа - превращение ["long", "short", "pause"]в [4, 2, 0]. Он получает кодовую точку первой буквы каждого слова и получает ANDего с 6. По счастливой случайности он преобразуется в значения, которые мы ищем. (Я искал несколько других более длительных решений, прежде чем нашел это). Как только это будет сделано, мы можем далее преобразовать этот список целых чисел ["RRRR", "RR", ""], умножив наше int на, "R"а затем превратившись в, ["RRRR", "RR", "-"]и, наконец, заголовок, получая его ["Rrrr", "Rr", "-"]. Затем мы присоединяемся к полученному списку" - "

синий
источник
Крутой способ сделать это с преобразованием!
tisaconundrum
Решение j" - "m|*\M.&Chd6\-c
Pyth
Также ОП добавляет пространство к примерам, но не указывает их, я попросил разъяснений по этому поводу.
Джонатан Аллан
@JonathanAllan Байты \xefи \xa6есть .oи .&соответственно. Это обратно совместимое изменение, при котором, если установлен старший бит, он запускает его, как старые 2-байтовые команды. Я пишу это таким образом, чтобы сделать его более легким для читателя, и поскольку Pyke технически больше не использует кодовую страницу, и я не хочу вставлять случайные байты, которые не работают
Blue
11

Haskell , 71 66 59 байт

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

Попробуйте онлайн!

Ах да, =<<это concatMap.

Воспользуется тем, что "long"и у "short"обоих есть письмо o.

betaveros
источник
Вам не нужно платить 2 байта за f=
Post Rock
Вы можете сохранить один целый байт с помощью lambdacase, переключившись на lambdabot haskell:(>>=(\case 'o'->"Rr";'n'->"rr";'p'->"-";' '->" - ";_->""))
BlackCap
7

JavaScript (ES6), 65 59 байт

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 байт

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

Попробуйте онлайн!

объяснение

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

Сохранено 3 байта с помощью AND 6трюка из ответа Pyke мутной рыбы

Emigna
источник
4

R 77 байт

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

Принимает ввод через STDIN, проверяет, совпадает ли ввод long, shortили pauseменяет местами совпадения Rrrr,Rr или -соответственно.

Затем он печатается с -дополнением пробелами в качестве разделителя, соответствующего желаемому результату.

JAD
источник
Вы можете сэкономить 2 байта, переключаясь с совпадения на% в%:scan(,'') %in% c('long','short','pause')
YCR
@YCR Не думаю, что это сработает. a %in% bпроверяет наличие записей в a, в bто время как match(a, b)возвращает фактические индексы совпадений. Поскольку мы можем предположить, что ввод действителен, использование %in%просто вернет вектор TRUEs.
JAD
Арф, правда. Я проверил это с помощью c («long», «short», «pause»).
YCR
Это потому, что когда вы вводите логический вектор в [, он интерпретируется как [which(bool) == TRUE], что в вашем примере будет [c(1,2,3)], что, в свою очередь, даст правильный результат.
JAD
Вместо sep=' - 'него можно использовать s=' - 'на 2 байта меньше
Rift
4

Röda , 73 57 47 46 40 44 байта

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

Попробуйте онлайн!

+4 байта из-за изменения правила (необходимо использовать Rrrrвместо любого 4-буквенного варианта).

Предыдущий код:

{[[split()|["Bzzz"]if[_="long"]else["Bz"]if[_1="short"]else["-"]]&" - "]}
fergusq
источник
Использование Mmmи Mmна 1 байт короче.
ATaco
@ATaco В вопросе сказано, что «длинные звуки должны быть длиной 4 символа, а короткие звуки должны быть длиной 2 символа» .
fergusq
AТако, обратите внимание, что критерии были дополнительно указаны в вопросе.
tisaconundrum
4

C (gcc) , 93 77 76 байтов

-2 байта благодаря Scepheo!
-1 байт благодаря Cyoce!

Принимает ** завершенный ** символ или эквивалент в качестве ввода.

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

Попробуйте онлайн!

Пояснения:

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
источник
2
Я думаю, можно объединить a++,*aв , *++aчтобы сохранить два байта, и воспользоваться смутным определением «звука» , чтобы использовать *aвместо , "Rrrr"чтобы сохранить еще четыре байта.
Скефео
Ваше второе предложение гениально!
Скоттинет
1
Можете ли вы переместить часть этапа увеличения цикла for в тело вместо разделения через запятую?
Cyoce
Это действительно экономит байт. Хороший улов!
scottinet
3

R , 72 байта

Принимает ввод из стандартного ввода, печатает в стандартный вывод.

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

Попробуйте онлайн!

rturnbull
источник
3

Пакетная, 88 байтов

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

Принимает участие в STDIN. К сожалению, издержки цикла стоят 26 байтов, так что это просто скучные замены.

Нил
источник
2
Предлагается изменить, чтобы удалить все @с
Стивен
@Stephen Да, я получил уведомление ...
Нил
Ницца! Только две вещи: я посчитал, что этот ответ имеет длину 84 байта, а не 88. Кроме того, OP заменил Mmmmи Mmна Rrrrи Rr, было бы неплохо обновить ваш ответ c:
Matheus Avellar
Пакет с какой платформы? Я сомневаюсь, что MS-DOS 6.22 будет делать то же, что и XP в расширенном командном режиме.
TOOGAM
@TOOGAM Да, когда я говорю «Пакетный режим», я обычно имею в виду версию CMD.EXE для Windows NT.
Нил
2

PHP, 113 байт

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

Попробуйте онлайн!

Первая попытка кода гольф, так что, вероятно, много оптимизаций!

crazyloonybin
источник
2

Vim (52 ​​байта)

:s/long/Rrrr/ge|s/short/Rr/ge|s/pause/-/ge|s/ / - /gвойти

Возможно, можно сделать короче ...

Дэвид Хейман
источник
Объединение команд таким образом останавливает поезд, если одна из них выдает ошибку IE, если в данной строке нет паузы или чего-то еще, замены после неудачной не будут работать. Вы можете либо разбить их на отдельные строки, либо поставить eфлаг в конце
nmjcman101
Исправил ошибку. Я все еще чувствую, что должен быть какой-то способ ускорить его, но единственный другой способ, о котором я подумал (после превращения «паузы» в тире s/[^ -]/r/, начинайте с первого пробела после каждого пробела, обрезайте четыре-r на два-r) вышел дольше.
Дэвид Хейман
1

Excel, 100 байт

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

В соответствии с примерами, ввод SPACE отдельная строка, как и output.

В самом вопросе не упоминается SPACEтребование, предусматривающее несколько более короткое 97-байтовое решение:

=REPLACE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(A1,"long","-Bzzz"),"short","-Bz"),"pause","--"),1,1,"")
Wernisch
источник
1

AutoIt , 145 байт

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

(AutoIt действительно плохой выбор для кода гольф, старался изо всех сил, чтобы сделать его как можно меньше)

Альгирдас Буткус
источник
Добро пожаловать на сайт! :)
Джеймс
1

Алиса , 37 байт

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

Попробуйте онлайн!

объяснение

Эта программа делает следующие замены:

  • l, hR
  • o, n, gr
  • p-
  • Космос → Космос
  • Все остальное → Ничего
"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
источник
1

Sed, 50 байтов

Принимает данные от stdin, печатает вstdout

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

Изменить - сохранено 2 байта

Sed, 40 байт

Копирование идеи из ответа Нитродона

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

Изменить: сохранил еще 2 байта

Джон Гауэрс
источник
0

Paradoc (v0.2.10), 21 байт (CP-1252)

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

Попробуйте онлайн!

Принимает строку в стеке и приводит к строке в стеке. Prependi превратиться в полноценную программу, которая читает из STDIN.

Использует &6как ответ Pyke и всех остальных, но соединяет токены немного по-другому, добавляя"-" токен после каждого шума, удаляя последний, а затем соединяя эти токены пробелами. Кажется, чтобы сохранить байт за присоединение" - " .

Объяснение:

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 будет поддерживать Shaving еще два байта, заменив с xи "-"с '-.

betaveros
источник
0

Рубин , 67 байт

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

Это JavaScript-решение Johan Karlsson, портированное на Ruby. Если вам нравится этот ответ, вы должны проголосовать за ответ Йохана.

Основная идея состоит в том, чтобы сравнить строки слов 'short'и т. Д. С одним символом, чтобы различать слова.

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

Или в алфавитном порядке:

  • длинная
  • м
  • Пауза
  • Q
  • короткая

Попробуйте онлайн!

alexanderbird
источник
0

Рубин , 78 байт

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

Единственные важные части ввода являются p, o, gи пространство ... игнорировать все остальное.

  • short становится o
  • long становится og
  • pause становится p

Попробуйте онлайн!

alexanderbird
источник