Angkat teleponmu! Bergetar!

14

Anda baru saja mendapat telepon baru, tetapi Anda tidak terlalu suka bergetar, Anda telah memutuskan ingin membuat pola getaran sendiri. Jadi, Anda telah menulis program tempat Anda menggunakan kata kunci long, shortdanpause membuat ponsel Anda bergetar sesuai dengan kata kunci ini.

Tugas

Buat sebuah program kecil yang menerima string dari long, short, dan pausedan output string lain yang mewakili suara fonetik dari ponsel bergetar;Rrrr - Rr

longsuara adalah Rrrr
shortsuara Rr
(masalah Casing)
pauseadalah tanda hubung -
semua suara dibatasi oleh tanda hubung dengan ruang sekitarnya' - '

Uji Kasus

input:    long long short long short
keluaran:Rrrr - Rrrr - Rr - Rrrr - Rr

input:   long long long short short short
keluaran:Rrrr - Rrrr - Rrrr - Rr - Rr - Rr

input:   short short short pause short short short
keluaran:Rr - Rr - Rr - - - Rr - Rr - Rr

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

Ini adalah pertanyaan sehingga jawaban akan dinilai dalam byte, dengan kemenangan paling sedikit.

tisaconundrum
sumber
5
Bukankah itu kriteria subyektif? Saya ingin menggunakan string kosong, sepertinya telepon bergetar untuk saya.
6
Aturan "kedengarannya" Anda terlalu kabur. Saya sarankan hanya membutuhkan string yang tepat. Code golf membutuhkan kriteria yang tepat sehingga kami dapat mengoptimalkan kode tanpa berargumentasi apakah peningkatan itu valid.
xnor
4
Apakah kita harus membatasi suara dengan -? Ini adalah kasus dalam contoh Anda, tetapi tidak ditentukan di mana pun.
JAD
12
Semua contoh menggunakan huruf kapital yang lebih rendah diikuti oleh salinan huruf yang lebih kecil. Apakah ini aturannya?
xnor
3
Apa yang perlu dilakukan sebelum ini dapat dibuka kembali: 1) Tentukan string yang tepat (atau set string) yang harus kita gunakan, termasuk batasan kasus, 2) Klarifikasi apakah input dan / atau output dapat berupa array kata atau array dari karakter, 3) Tentukan pemisah yang tepat yang harus digunakan saat mengeluarkan sebagai string.
Shaggy

Jawaban:

12

Pyke , 22 20 byte

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

Coba di sini!

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

Inti dari jawaban ini adalah transformasi ["long", "short", "pause"]menjadi [4, 2, 0]. Ia mendapat titik kode dari huruf pertama dari setiap kata dan ANDs dengan 6. Secara kebetulan itu berubah menjadi nilai-nilai yang kita cari. (Saya mencari melalui beberapa solusi yang lebih panjang sebelum menemukan yang ini). Setelah selesai, kita dapat mengubah daftar int menjadi lebih lanjut ["RRRR", "RR", ""]dengan mengalikan int "R"yang kemudian berubah menjadi ["RRRR", "RR", "-"]dan akhirnya diberi judul casing untuk mendapatkannya ["Rrrr", "Rr", "-"]. Kami kemudian bergabung dengan daftar yang dihasilkan oleh" - "

Biru
sumber
Cara keren untuk melakukannya dengan transformasi!
tisaconundrum
Solusinya mirip di Pyth: j" - "m|*\M.&Chd6\-c:-)
Mr. Xcoder
OP juga menambahkan ruang untuk contoh tetapi tidak menentukannya, saya sudah meminta klarifikasi.
Jonathan Allan
@JonathanAllan Bytes \xef dan \xa6yang .odan .&masing-masing. Ini adalah perubahan yang kompatibel ke belakang di mana jika bit tinggi diatur, itu berjalan seperti perintah 2 byte yang lama. Saya menulisnya dengan cara ini untuk memudahkan pembaca dan karena Pyke secara teknis tidak menggunakan halaman kode lagi dan saya tidak ingin harus memasukkan byte acak yang tidak berfungsi
Biru
14

JavaScript, 70 63 byte

2 byte disimpan berkat Luke

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

Cobalah online!


sumber
6
Trik yang bagus dengan []s luar !
Neil
11

Haskell , 71 66 59 byte

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

Cobalah online!

Oh benar, =<<adalah concatMap.

Mengambil keuntungan dari kenyataan itu "long"dan "short"keduanya memiliki surat ituo .

betaveros
sumber
Anda tidak perlu membayar 2 byte untuk f=fungsi bebas titik diizinkan tanpa penugasan
Post Rock Garf Hunter
Anda dapat menyimpan satu byte penuh dengan lambdacase dengan beralih ke 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

Johan Karlsson
sumber
7

05AB1E , 33 27 25 21 byte

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

Cobalah online!

Penjelasan

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

Disimpan 3 byte menggunakan AND 6trik dari muddyfish ini jawaban Pyke

Emigna
sumber
6

Python 2 , 76 69 64 byte

lambda s:' - '.join('Rrrr'[:ord(b[0])&6]or'-'for b in s.split())

Cobalah online!

Alternatif:

Python 2 , 76 69 byte

lambda s:' - '.join(['Rrrr','-','Rr'][ord(b[1])%3]for b in s.split())

Cobalah online!

Python 2 , 69 byte

lambda s:' - '.join('-Rrrr'['o'in b:8-ord(b[1])%9]for b in s.split())

Cobalah online!

TFeld
sumber
5

Mathematica, 81 byte

StringReplace[#,{"long"->"Bzzz -","short"->"Bz -","pause"->"- -"}]~StringDrop~-2&

Cobalah online!

J42161217
sumber
4

R , 77 byte

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

Mengambil input melalui STDIN, memeriksa apakah input cocok long, shortatau pausedan bertukar pasangan Rrrr, Rratau -masing - masing.

Ini kemudian dicetak dengan -bantalan dengan spasi sebagai pemisah, cocok dengan output yang diinginkan.

JAD
sumber
Anda dapat menghemat 2 byte dengan beralih dari kecocokan ke% dalam%:scan(,'') %in% c('long','short','pause')
YCR
@YCR Saya tidak berpikir itu akan berhasil. a %in% bmemeriksa apakah entri dalam ahadir b, sambil match(a, b)mengembalikan indeks yang sebenarnya dari pertandingan. Karena kita dapat mengasumsikan bahwa input tersebut valid, menggunakan %in%hanya akan mengembalikan vektor TRUEs.
JAD
Arf, benar. Saya telah mengujinya dengan c ('panjang', 'pendek', 'jeda').
YCR
Itu karena ketika Anda memasukkan vektor boolean [, itu ditafsirkan sebagai [which(bool) == TRUE], yang dalam contoh Anda akan [c(1,2,3)], yang pada gilirannya terjadi untuk memberikan output yang benar.
JAD
Alih-alih, sep=' - 'Anda dapat menggunakan s=' - 'kurang dari 2 byte
Rift
4

Röda , 73 57 47 46 40 44 byte

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

Cobalah online!

+4 byte karena perubahan aturan (harus menggunakan Rrrralih-alih varian 4 huruf apa pun).

Kode sebelumnya:

{[[split()|["Bzzz"]if[_="long"]else["Bz"]if[_1="short"]else["-"]]&" - "]}
fergusq
sumber
Menggunakan Mmmdan Mm1 byte lebih pendek.
ATaco
@ATaco Dikatakan dalam pertanyaan bahwa "Suara panjang harus 4 karakter, dan suara pendek harus 2 karakter" .
fergusq
ATaco, harap dicatat bahwa kriteria telah ditentukan lebih lanjut dalam pertanyaan.
tisaconundrum
4

C (gcc) , 93 77 76 byte

-2 byte terima kasih kepada Scepheo!
-1 byte terima kasih kepada Cyoce!

Mengambil NULL yang dihentikan ** char atau setara dengan input.

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

Cobalah online!

Penjelasan:

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
sumber
2
Saya pikir Anda dapat menggabungkan a++,*ake dalam *++auntuk menyimpan dua byte, dan mengambil keuntungan dari definisi "suara" yang tidak jelas untuk digunakan *adaripada "Rrrr"menyimpan empat byte lainnya.
Scepheo
Saran kedua Anda jenius!
scottinet
1
Bisakah Anda memindahkan bagian dari tahap kenaikan for-loop ke tubuh bukannya dipisahkan dengan koma?
Cyoce
Ini memang menghemat satu byte. Tangkapan yang bagus!
scottinet
3

R , 72 byte

Mengambil input dari stdin, mencetak ke stdout.

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

Cobalah online!

rturnbull
sumber
3

Batch, 88 byte

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

Mengambil input pada STDIN. Sayangnya biaya overhead loop 26 byte jadi ini hanya penggantian membosankan.

Neil
sumber
2
Edit yang disarankan untuk menghapus semua @s
Stephen
@Stephen Ya, saya mendapat pemberitahuan ...
Neil
Bagus! Hanya dua hal, meskipun: Saya menghitung jawaban itu menjadi 84 byte, bukan 88. Juga, OP telah mengganti Mmmmdan Mmdengan Rrrrdan Rr, akan menyenangkan untuk memperbarui jawaban Anda c:
Matheus Avellar
Batch pada platform apa? Saya ragu MS-DOS 6.22 akan melakukan apa yang dilakukan XP ketika dalam mode perintah yang ditingkatkan.
TOOGAM
@TOOGAM Ya, ketika saya mengatakan Batch, saya biasanya mengacu pada versi CMD.EXE 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);

Cobalah online!

Upaya pertama di kode golf, jadi mungkin banyak optimisasi tersedia!

crazyloonybin
sumber
2

Vim (52 ​​bytes)

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

Mungkin bisa dibuat lebih pendek ...

David Heyman
sumber
Merangkai perintah bersama seperti ini akan menghentikan kereta jika salah satunya kesalahan IE jika tidak ada jeda atau sesuatu dalam string yang diberikan, penggantian setelah yang gagal tidak akan berfungsi. Anda dapat membaginya pada garis yang terpisah atau meletakkan ebendera di akhir
nmjcman101
Memperbaiki kesalahan. Saya masih merasa harus ada cara untuk mempercepatnya, tetapi satu-satunya cara lain yang saya pikirkan (setelah mengubah "jeda" menjadi tanda hubung,, gunakan huruf s/[^ -]/r/R pertama setelah setiap spasi, pangkas empat-r ke dua-r) keluar lebih lama.
David Heyman
1

Excel, 100 byte

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

Per contoh, Input adalah SPACE dipisahkan string, seperti halnya output.

Pertanyaan itu sendiri tidak menyebutkan SPACEpersyaratan, yang memungkinkan solusi 97 byte yang sedikit lebih pendek :

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

Otomatis , 145 byte

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

(AutoIt adalah pilihan yang sangat buruk untuk kode golf, mencoba yang terbaik untuk membuatnya sekecil mungkin)

Algirdas Butkus
sumber
Selamat datang di situs ini! :)
DJMcMayhem
1

Alice , 37 byte

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

Cobalah online!

Penjelasan

Program ini membuat penggantian berikut:

  • l, hR
  • o, n, gr
  • p-
  • Space → Space
  • Yang lainnya → Tidak ada
"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
sumber
1

Sed, 50 byte

Mengambil input dari stdin, mencetak kestdout

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

Edit - disimpan 2 byte

Sed, 40 byte

Menyalin ide dari jawaban Nitrodon

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

Edit: menyimpan 2 byte lagi

John Gowers
sumber
0

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

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

Cobalah online!

Mengambil string di stack dan menghasilkan string di stack. Tergantungi untuk berubah menjadi program lengkap yang bertuliskan STDIN.

Menggunakan &6seperti jawaban Pyke dan yang lainnya, tetapi menggabungkan token bersama sedikit berbeda, dengan menambahkan "-"token setelah setiap suara, menghapus yang terakhir, dan kemudian menggabungkan token ini dengan spasi. Tampaknya menyimpan byte lebih dari bergabung dengan " - ".

Penjelasan:

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 akan mendukung mencukur dua byte lagi dengan mengganti dengan xdan "-"dengan '-.

betaveros
sumber
0

SOGL V0.12 , 28 byte

θ{K;⁄5κ« r*; p=?X┌}}¹" - ”∑ū

Coba Di Sini!

Fakta menyenangkan: jika diizinkan untuk membatasi dengan - atau - itu akan menjadi byte yang lebih pendek

dzaima
sumber
0

Ruby , 67 byte

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

Ini adalah solusi JavaScript Johan Karlsson yang diangkut ke Ruby. Jika Anda menyukai jawaban ini, Anda harus memilih jawaban Johan.

Ide kuncinya adalah membandingkan string kata 'short', dll. Dengan satu karakter untuk membedakan antara kata-kata.

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

Atau, dalam urutan abjad:

  • panjang
  • m
  • jeda
  • q
  • pendek

Cobalah online!

alexanderbird
sumber
0

Ruby , 78 byte

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

Bagian hanya penting dari input yang p, o, g, dan ruang ... mengabaikan sisanya.

  • short menjadi o
  • long menjadi og
  • pause menjadi p

Cobalah online!

alexanderbird
sumber