휴대 전화를 들어요! 진동입니다!


14

최근에 새 휴대 전화를 받았지만 진동 방식이 마음에 들지 않으면 서 고유 한 진동 패턴을 생성하기로 결정했습니다. 그래서, 당신은 당신이 키워드를 사용하는 프로그램을 작성했습니다 long, short그리고 pause이 키워드에 따라 휴대 전화가 진동을하게합니다.

직무

문자열을 수용하는 작은 프로그램을 작성 long, shortpause및 진동 전화의 음성 사운드를 나타내는 다른 문자열을 출력하는 단계;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

이것은 질문이므로 답은 바이트 단위로 기록되며 가장 적은 바이트 수를 얻습니다.


5
그것은 주관적인 기준이 아닌가? 빈 줄을 사용하고 싶습니다. 진동하는 전화처럼 들립니다.

6
당신의 "같은 소리"규칙은 너무 모호합니다. 정확한 문자열을 요구하는 것이 좋습니다. 코드 골프는 정확한 기준을 요구하므로 개선이 유효한 지에 대한 논쟁없이 코드를 최적화 할 수 있습니다.
xnor

4
소리를로 구분해야 -합니까? 이것은 귀하의 예에서 그렇지만 어디에도 지정되지 않았습니다.
JAD

12
예제는 모두 대문자를 사용하고 소문자로 된 사본을 사용합니다. 이것이 규칙입니까?
xnor

3
이것을 다시 열기 전에해야 할 일 : 1) 대소 문자 제한을 포함하여 사용해야 하는 정확한 문자열 (또는 문자열 세트 )을 지정하십시오 . 2) 입력 및 / 또는 출력이 단어 또는 문자, 3) 문자열로 출력 할 때 사용해야하는 정확한 구분 기호를 지정하십시오.
Shaggy

답변:


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]. 그것은 각 단어의 첫 글자의 코드 포인트를 얻고 AND6으로 씁니다. 운이 우연의 일치로 우리가 찾고있는 값으로 변환합니다. (이 것을 찾기 전에 다른 몇 가지 더 긴 솔루션을 검색했습니다). 이 작업이 끝나면 int를 ["RRRR", "RR", ""]곱한 "R"다음 int 로 바꾸어 ["RRRR", "RR", "-"]제목 을 대입하여 해당 int 목록을 추가로 변환 할 수 ["Rrrr", "Rr", "-"]있습니다. 그런 다음 결과 목록에" - "


변신과 함께 멋진 방법!
tisaconundrum

이 솔루션은 Pyth와 비슷합니다 : j" - "m|*\M.&Chd6\-c:-)
Mr. Xcoder

또한 OP는 예제에 공간을 추가하지만 지정하지는 않으므로 설명을 요청했습니다.
Jonathan Allan

@JonathanAllan 바이트 \xef\xa6are .o.&각각. 높은 비트가 설정되면 이전 2 바이트 명령처럼 실행되는 이전 버전과 호환되는 변경입니다. 독자가 쉽게 읽을 수 있도록이 방법을 쓰고 있습니다. Pyke는 기술적으로 더 이상 코드 페이지를 사용하지 않으며 작동하지 않는 임의의 바이트를 삽입하고 싶지 않기 때문에
Blue


11

하스켈 , 71 66 59 바이트

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

온라인으로 사용해보십시오!

아 맞다 =<< concatMap이다.

그 사실을 활용 "long"하고 "short"둘 다 문자가 o.


당신은에 대한 2 바이트 지불 할 필요가 없습니다 f=할당없이 허용되는 점없는 기능을
포스트 록 Garf 헌터

lambdabot haskell로 전환하여 lambdacase를 사용하여 1 바이트 전체를 절약 할 수 있습니다.(>>=(\case 'o'->"Rr";'n'->"rr";'p'->"-";' '->" - ";_->""))
BlackCap

7

자바 스크립트 (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

muddyfish의 pyke answer AND 6 트릭을 사용하여 3 바이트를 절약했습니다.






4

R , 77 바이트

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

STDIN 통해 입력을 받아, 점검 입력이 일치하는지 long, short또는 pause과 일치하는 스왑Rrrr , Rr또는- 각각.

그런 다음 -원하는 출력과 일치하는 공백으로 구분 기호 로 채워져 인쇄됩니다 .


match에서 % in %로 전환하여 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

대신 2 바이트를 sep=' - '사용할 수 있습니다s=' - '
Rift

4

로다 , 73 57 47 46 40 44 바이트

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

온라인으로 사용해보십시오!

규칙 변경으로 인해 +4 바이트 ( Rrrr4 자 변형 대신 사용해야 함 )

이전 코드 :

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

사용 Mmm및은 Mm1 바이트 짧습니다.
ATaco

@ATaco이 질문에서 "긴 소리는 4 자 길이 여야하고 짧은 소리는 2 자 길이 여야합니다 . "
fergusq

ATaco, 문제에서 기준이 추가로 지정되었습니다.
tisaconundrum

4

C (gcc) , 93 77 76 바이트

Scepheo 덕분에 -2 바이트!
Cyoce 덕분에 -1 바이트!

입력으로 NULL 종료 ** char 또는 이와 동등한 값을 사용합니다.

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

2
두 바이트를 절약하기 위해 결합 a++,*a하여 또 다른 4 바이트를 저장 *++a하는 *a대신 모호한 "사운드"정의를 활용할 수 있다고 생각합니다 "Rrrr".
Scepheo

두 번째 제안은 천재입니다!
scottinet

1
for 루프의 증분 단계의 일부를 쉼표로 구분하지 않고 본문으로 이동할 수 있습니까?
Cyoce

이것은 실제로 바이트를 절약합니다. 잘 잡아!
scottinet


3

배치, 88 바이트

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

STDIN에서 입력을받습니다. 불행히도 루프 오버 헤드는 26 바이트이므로 비용이 많이 드는 교체입니다.


2
@s를 모두 제거하도록 제안 된 편집
Stephen

@Stephen 예, 알림을 받았습니다 ...
Neil

좋은! 그냥 두 가지, 비록 : 나는 84 바이트, 또한없는 88가, 영업 이익은 대체 한 것으로 그 답을 계산 Mmmm하고 MmRrrrRr: 당신의 대답 C를 업데이트하는 것이 좋을 것이다,
마테우스 Avellar

어떤 플랫폼으로 배치합니까? MS-DOS 6.22가 고급 명령 모드에서 XP가 수행하는 작업을 수행하지 않을 것입니다.
TOOGAM

@TOOGAM 그래, Batch라고 말할 때 보통 Windows NT의 CMD.EXE 버전을 의미합니다.
Neil



2

Vim (52 ​​바이트)

:s/long/Rrrr/ge|s/short/Rr/ge|s/pause/-/ge|s/ / - /g시작하다

아마도 더 짧아 질 수 있습니다 ...


주어진 문자열에 일시 중지 또는 무언가가 없으면 IE가 오류가 발생하면 명령을 함께 문자열로 묶으면 열차가 중지됩니다. 당신은 별도의 라인으로 분할하거나 e끝에 플래그를 넣을 수 있습니다
nmjcman101

오류를 수정했습니다. 나는 여전히 속도를 높일 수있는 방법이 있어야한다고 생각하지만, 내가 생각한 유일한 다른 방법은 ( "일시 중지"를 대시로 바꾼 s/[^ -]/r/후 모든 공간마다 첫 번째 R을 대문자 로 바꾸고 4r에서 2r 까지 트림합니다) 더 길게 나왔습니다.
David Heyman

1

엑셀, 100 바이트

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

예를 들어, 입력 SPACE은 출력과 같이 문자열 로 분리됩니다.

질문 자체에는 SPACE요구 사항이 언급되어 있지 않으므로 97 바이트 솔루션 이 약간 짧아집니다 .

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

1

AutoIt , 145 바이트

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

(자동 코드 골프는 정말 나쁜 선택입니다. 가능한 한 작게 만들려고 최선을 다했습니다)


사이트에 오신 것을 환영합니다! :)
James

1

Alice , 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

1

Sed, 50 bytes

Takes input from stdin, prints to stdout

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

Edit - saved 2 bytes

Sed, 40 bytes

Copying idea from Nitrodon's answer

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

Edit: saved another 2 bytes



0

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

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

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:

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 will support shaving two more bytes by replacing with x and "-" with '-.



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!



당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.