Nhấc điện thoại lên! Nó đang rung!


14

Gần đây bạn có một chiếc điện thoại mới, nhưng bạn không thích cách nó rung, bạn đã quyết định muốn tạo các kiểu rung của riêng mình. Vì vậy, bạn đã viết một chương trình mà bạn sử dụng các từ khóa long, shortpauseđể làm rung điện thoại của bạn theo các từ khóa này.

Bài tập

Tạo một chương trình nhỏ mà chấp nhận một chuỗi long, shortpausevà kết quả đầu ra một chuỗi đại diện cho thanh âm của một chiếc điện thoại rung;Rrrr - Rr

longâm thanh là Rrrr
shortâm thanh là Rr
(vấn đề vỏ)
pauselà một dấu gạch ngang -
tất cả các âm thanh được phân định bởi dấu gạch ngang với không gian xung quanh' - '

Các trường hợp thử nghiệm

đầu vào:    long long short long short
đầu ra:Rrrr - Rrrr - Rr - Rrrr - Rr

đầu vào:   long long long short short short
đầu ra:Rrrr - Rrrr - Rrrr - Rr - Rr - Rr

đầu vào:   short short short pause short short short
đầu ra:Rr - Rr - Rr - - - Rr - Rr - Rr

đầu vào:   long short short long long pause short short
đầu ra:Rrrr - Rr - Rr - Rrrr - Rrrr - - - Rr - Rr

Đây là một câu hỏi về vì vậy các câu trả lời sẽ được tính theo byte, với số byte ít nhất sẽ giành chiến thắng.


5
Đó không phải là một tiêu chí chủ quan sao? Tôi muốn sử dụng chuỗi trống, nó giống như một chiếc điện thoại rung đối với tôi.

6
Quy tắc "âm thanh như" của bạn là quá mơ hồ. Tôi muốn đề nghị chỉ yêu cầu các chuỗi chính xác. Code golf yêu cầu các tiêu chí chính xác để chúng tôi có thể tối ưu hóa mã mà không cần phải tranh luận về việc liệu một cải tiến có hợp lệ hay không.
xnor

4
Chúng ta có phải phân định âm thanh với một -? Đây là trường hợp trong ví dụ của bạn, nhưng không được chỉ định ở bất cứ đâu.
JAD

12
Tất cả các ví dụ đều sử dụng vốn thấp hơn theo sau là các bản sao của một chữ cái viết thấp hơn. Đây có phải là một quy tắc?
xnor

3
Những gì cần phải được thực hiện trước khi có thể mở lại: 1) Chỉ định các chuỗi (hoặc bộ chuỗi) chính xác mà chúng ta phải sử dụng, bao gồm các giới hạn trường hợp, 2) Làm rõ liệu đầu vào và / hoặc đầu ra có thể là một mảng của các từ hoặc mảng của ký tự, 3) Chỉ định dấu phân cách chính xác phải được sử dụng khi xuất ra dưới dạng chuỗi.
Xù xì

Câu trả lời:


12

Pyke , 22 20 byte

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

Hãy thử nó ở đây!

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

Mấu chốt của câu trả lời này là sự chuyển đổi ["long", "short", "pause"]thành [4, 2, 0]. Nó nhận được điểm mã của chữ cái đầu tiên của mỗi từ và ANDbằng 6. Với sự trùng hợp may mắn, nó biến đổi thành các giá trị mà chúng ta đang tìm kiếm. (Tôi đã tìm kiếm thông qua một vài giải pháp dài hơn khác trước khi tìm ra giải pháp này). Khi đã xong, chúng ta có thể chuyển đổi thêm danh sách ints đó ["RRRR", "RR", ""]bằng cách nhân int của chúng ta "R"sau đó biến thành ["RRRR", "RR", "-"]cuối cùng và đặt tiêu đề cho nó ["Rrrr", "Rr", "-"]. Sau đó chúng tôi tham gia danh sách kết quả bằng cách" - "


Cách tuyệt vời để đi về nó với sự chuyển đổi!
tisaconundrum

Giải pháp là ngớ ngẩn tương tự trong Pyth: j" - "m|*\M.&Chd6\-c:-)
Ông Xcoder

Ngoài ra OP thêm không gian cho các ví dụ nhưng không chỉ định chúng, tôi đã yêu cầu làm rõ về điều đó.
Jonathan Allan

@JonathanAllan Các byte \xef\xa6đang .o.&tương ứng. Đó là một thay đổi tương thích ngược trong đó nếu bit cao được đặt, nó sẽ chạy như các lệnh 2 byte cũ. Tôi viết nó theo cách này để giúp người đọc dễ dàng hơn và vì về mặt kỹ thuật Pyke không sử dụng trang mã nữa và tôi không muốn phải chèn các byte ngẫu nhiên không hoạt động
Blue

14

JavaScript, 70 63 byte

Lưu 2 byte nhờ Luke

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

Hãy thử trực tuyến!


6
Thủ thuật đẹp với []s bên ngoài !
Neil

11

Haskell , 71 66 59 byte

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

Hãy thử trực tuyến!

Oh đúng, =<<là concatMap.

Lợi dụng thực tế là "long""short"cả hai đều có thư o.


Bạn không cần phải trả 2 byte cho f=các chức năng không có điểm được cho phép mà không cần chuyển nhượng
Post Rock Garf Hunter

Bạn có thể lưu toàn bộ một byte bằng lambdacase bằng cách chuyển sang 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×™'-)éθ}… - ý

Hãy thử trực tuyến!

Giải trình

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

Đã lưu 3 byte bằng cách sử dụng AND 6mẹo từ câu trả lời pyke của bùn






4

R , 77 byte

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

Đưa đầu vào thông qua STDIN, kiểm tra xem các đầu vào phù hợp long, shorthoặc pausevà giao dịch hoán đổi các trận đấu cho Rrrr, Rrhoặc -tương ứng.

Điều này sau đó được in với phần -đệm với khoảng trắng dưới dạng dấu phân cách, khớp với đầu ra mong muốn.


Bạn có thể lưu 2 byte bằng cách chuyển từ khớp thành% theo%:scan(,'') %in% c('long','short','pause')
YCR

@YCR Tôi không nghĩ rằng nó sẽ làm việc. a %in% bkiểm tra xem các mục trong acó hiện diện hay không b, trong khi match(a, b)trả về các chỉ số thực tế của các kết quả khớp. Vì chúng ta có thể giả sử rằng đầu vào là hợp lệ, sử dụng %in%sẽ chỉ trả về một vectơ TRUEs.
JAD

Arf, đúng. Tôi đã thử nghiệm nó với c ('dài', 'ngắn', 'tạm dừng').
YCR

Đó là bởi vì khi bạn đưa một vectơ boolean vào [, nó được hiểu là [which(bool) == TRUE], trong ví dụ của bạn [c(1,2,3)], điều này sẽ xảy ra để đưa ra đầu ra chính xác.
JAD

Thay vì sep=' - 'bạn có thể sử dụng s=' - 'ít hơn 2 byte
Rift

4

Röda , 73 57 47 46 40 44 byte

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

Hãy thử trực tuyến!

+4 byte do thay đổi quy tắc (phải sử dụng Rrrrthay vì bất kỳ biến thể 4 chữ cái nào).

Mã trước:

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

Sử dụng MmmMmngắn hơn 1 byte.
ATaco

@ATaco Người ta đã nói trong câu hỏi rằng "Âm thanh dài phải dài 4 ký tự và âm thanh ngắn phải dài 2 ký tự" .
fergusq

ATaco, xin lưu ý rằng các tiêu chí đã được chỉ định thêm trong câu hỏi.
tisaconundrum

4

C (gcc) , 93 77 76 byte

-2 byte nhờ Scepheo!
-1 byte nhờ Cyoce!

Làm cho NULL chấm dứt ** char hoặc tương đương làm đầu vào.

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

Hãy thử trực tuyến!

Giải thích:

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
Tôi nghĩ rằng bạn có thể kết hợp a++,*athành *++ađể cứu hai byte, và tận dụng lợi thế của mơ hồ "âm thanh" định nghĩa để sử dụng *athay vì "Rrrr"để tiết kiệm thêm bốn byte.
Scepheo

Đề nghị thứ hai của bạn là thiên tài!
scottinet

1
Bạn có thể di chuyển một phần của giai đoạn tăng của vòng lặp for sang cơ thể thay vì được phân tách bằng dấu phẩy không?
Cyoce

Điều này thực sự tiết kiệm một byte. Nắm bắt tốt!
scottinet


3

Mẻ, 88 byte

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

Đưa đầu vào vào STDIN. Thật không may, chi phí vòng lặp là 26 byte nên đây chỉ là sự thay thế nhàm chán.


2
Đề xuất chỉnh sửa để xóa tất cả các @s
Stephen

@Stephen Có, tôi đã nhận được thông báo ...
Neil

Đẹp! Chỉ cần hai điều, mặc dù: Tôi đếm được câu trả lời mà là 84 byte dài, không 88. Ngoài ra, OP đã thay thế MmmmMmvới RrrrRr, nó sẽ được tốt đẹp để cập nhật câu trả lời của bạn c:
Matheus Avellar

Hàng loạt như nền tảng gì? Tôi nghi ngờ MS-DOS 6.22 sẽ làm những gì XP làm khi ở chế độ lệnh nâng cao.
TẤT CẢ NGÀY 27/8/2017

@TOOGAM Vâng, khi tôi nói Batch tôi thường có nghĩa là phiên bản CMD.EXE của 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);

Hãy thử trực tuyến!

Lần thử đầu tiên tại mã golf, vì vậy có lẽ rất nhiều tối ưu có sẵn!


2

Vim (52 ​​byte)

:s/long/Rrrr/ge|s/short/Rr/ge|s/pause/-/ge|s/ / - /gđi vào

Có thể rút ngắn lại ...


Việc xâu chuỗi các lệnh lại với nhau như thế này sẽ dừng tàu nếu một trong số chúng bị lỗi IE nếu không có tạm dừng hoặc có gì đó trong chuỗi đã cho, các thay thế sau khi lỗi không thành công. Bạn có thể chia chúng thành các dòng riêng biệt hoặc đặt một elá cờ ở cuối
nmjcman101

Đã sửa lỗi. Tôi vẫn cảm thấy cần phải có một cách nào đó để tăng tốc nó, nhưng cách khác duy nhất tôi nghĩ đến (sau khi biến "tạm dừng" thành dấu gạch ngang s/[^ -]/r/, viết hoa chữ R đầu tiên sau mỗi khoảng trắng, cắt bốn r thành hai r) ra lâu hơn
David Heyman

1

Excel, 100 byte

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

Mỗi ví dụ, đầu vào là SPACE chuỗi riêng biệt, như là đầu ra.

Bản thân câu hỏi không đề cập đến một SPACEyêu cầu, cho phép giải pháp 97 byte ngắn hơn một chút :

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

1

Tự động , 145 byte

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

(AutoIt thực sự là lựa chọn tồi cho môn đánh gôn, đã cố gắng hết sức để làm cho nó nhỏ nhất có thể)


Chào mừng đến với trang web! :)
DJMcMayhem

1

Alice , 37 byte

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

Hãy thử trực tuyến!

Giải trình

Chương trình này thực hiện các thay thế sau:

  • l, hR
  • o, n, gr
  • p-
  • Không gian → Không gian
  • Mọi thứ khác → Không có gì
"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

Đưa đầu vào từ stdin, in rastdout

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

Chỉnh sửa - đã lưu 2 byte

Sed, 40 byte

Sao chép ý tưởng từ câu trả lời của Nitrodon

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

Chỉnh sửa: đã lưu 2 byte khác



0

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

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

Hãy thử trực tuyến!

Lấy một chuỗi trên ngăn xếp và kết quả là một chuỗi trên ngăn xếp. Chuẩn bị iđể biến thành một chương trình đầy đủ đọc từ STDIN.

Sử dụng &6như câu trả lời Pyke và mọi người khác, nhưng kết hợp các mã thông báo với nhau một chút khác nhau, bằng cách thêm "-"mã thông báo sau mỗi tiếng ồn, xóa mã cuối cùng và sau đó nối các mã thông báo này bằng khoảng trắng. Có vẻ để tiết kiệm một byte hơn khi tham gia" - " .

Giải trình:

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 sẽ hỗ trợ cạo thêm hai byte bằng cách thay thế bằng x"-"bằng '-.



0

Ruby , 67 byte

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

Đây là giải pháp JavaScript của Johan Karlsson được chuyển đến Ruby. Nếu bạn thích câu trả lời này, bạn nên nêu lên câu trả lời của Johan.

Ý tưởng chính là so sánh các chuỗi từ 'short', v.v ... với một ký tự đơn để phân biệt giữa các từ.

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

Hoặc, theo thứ tự bảng chữ cái:

  • Dài
  • m
  • tạm ngừng
  • q
  • ngắn

Hãy thử trực tuyến!


0

Ruby , 78 byte

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

Các bộ phận chỉ quan trọng của đầu vào là p, o, g, và không gian ... bỏ qua phần còn lại.

  • short trở thành o
  • long trở thành og
  • pause trở thành p

Hãy thử trực tuyến!



Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.