Telefonunu aç! Titreşiyor!


14

Yakın zamanda yeni bir telefonunuz var, ancak titreşim şeklini pek sevmiyorsunuz, kendi titreşim desenlerinizi oluşturmak istediğinize karar verdiniz. Yani, anahtar kelimeler kullanılan bir program yazdım long, shortve pausebu anahtar kelimelere göre senin telefonun titremesini sağlamak için.

Görev

Bir dizi kabul eden bir küçük program oluşturun long, shortve pauseve titreşimli bir telefon fonetik sesini temsil eden başka bir dize verir;Rrrr - Rr

longsesler Rrrr
shortsesler Rr
(Muhafaza konuları)
pausebir çizgi, -
tüm sesler çevreleyen boşluklarla çizgi ile sınırlandırılır' - '

Test Durumları

girdi:    long long short long short
çıktı:Rrrr - Rrrr - Rr - Rrrr - Rr

girdi:   long long long short short short
çıktı:Rrrr - Rrrr - Rrrr - Rr - Rr - Rr

girdi:   short short short pause short short short
çıktı:Rr - Rr - Rr - - - Rr - Rr - Rr

girdi:   long short short long long pause short short
çıktı:Rrrr - Rr - Rr - Rrrr - Rrrr - - - Rr - Rr

Bu bir sorusudur, bu yüzden cevaplar en az bayt kazanarak bayt cinsinden puanlanır.


5
Bu öznel bir kriter değil mi? Boş dize kullanmak istiyorum, bana titreşen bir telefon gibi geliyor.

6
"Kulağa benziyor" kuralınız çok belirsiz. Sadece kesin dizeler gerektiren öneririm. Kod golf kesin kriterler gerektirir, bu yüzden bir iyileştirmenin geçerli olup olmadığı konusunda tartışma olmadan kodu optimize edebiliriz.
xnor

4
Sesleri bir ile sınırlamak zorunda mıyız -? Örneğinizde durum budur, ancak hiçbir yerde belirtilmemiştir.
JAD

12
Örneklerin tümü büyük harfle ve ardından küçük harfle yazılmış bir harf kullanır. Bu bir kural mı?
xnor

3
Bundan önce yapılması gerekenler: 1) Vaka sınırlamaları da dahil olmak üzere kullanmamız gereken tam dizeleri (veya dizeleri ) belirtin , 2) Girdi ve / veya çıktının kelimelerden veya dizilerden oluşan bir dizi olup olmadığını netleştirin 3) Dize olarak çıktı alırken kullanılması gereken ayırıcıyı tam olarak belirtin.
Shaggy

Yanıtlar:


12

Pyke , 22 20 bayt

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

Burada deneyin!

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

Bu cevabın özü, ["long", "short", "pause"]haline dönüşmektir [4, 2, 0]. Her kelimenin ilk harfinin kod noktasını alır ve AND6 ile siler. Şanslı tesadüfle aradığımız değerlere dönüşür. (Bunu bulmadan önce birkaç başka çözüm aradım). Bu yapıldıktan sonra, int'ümüzü ["RRRR", "RR", ""]çarparak "R"ve daha sonra ["RRRR", "RR", "-"]elde etmek için başlık muhafazasını çarparak bu ints listesini daha da dönüştürebiliriz ["Rrrr", "Rr", "-"]. Ardından, sonuç listesine" - "


Dönüşüm ile bunun güzel yolu!
tisaconundrum

Çözüm Pyth'te saçma bir şekilde benzer: j" - "m|*\M.&Chd6\-c:-)
Bay Xcoder

Ayrıca OP örneklere yer katıyor ancak bunları belirtmiyor, bu konuda açıklama istedim.
Jonathan Allan

@JonathanAllan Bayt ve sırasıyla \xefve \xa6vardır . Yüksek bit varsa, eski 2 bayt komutları gibi çalıştırdığı geriye dönük olarak uyumlu bir değişikliktir. Okuyucu için daha kolay hale getirmek için bu şekilde yazıyorum ve Pyke teknik olarak artık bir kod sayfası kullanmıyor ve işe yaramayan rastgele baytlar eklemek istemiyorum.o.&
Blue

14

JavaScript, 70 63 bayt

Luke sayesinde 2 bayt kurtardı

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

Çevrimiçi deneyin!


6
Dış []s ile güzel hile !
Neil

11

Haskell , 71 66 59 bayt

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

Çevrimiçi deneyin!

Ah doğru, =<<concatMap.

Gerçeği yararlanır "long"ve "short"hem mektup var o.



Lambdabot haskell'e geçerek lambdacase ile bir bütün bayt kaydedebilirsiniz:(>>=(\case 'o'->"Rr";'n'->"rr";'p'->"-";' '->" - ";_->""))
BlackCap

7

JavaScript (ES6), 65 59 bayt

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 bayt

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

Çevrimiçi deneyin!

açıklama

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

Çamurlu balıkların pke cevabındakiAND 6 numarayı kullanarak 3 bayt kaydedildi






4

R , 77 bayt

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

STDIN yoluyla girişi alır çekler girdi eşleşip long, shortya pauseve swap eşleşmelerinin Rrrr, Rrveya -sırasıyla.

Bu daha sonra -ayırıcı olarak boşluklarla dolgulu olarak istenen çıktıyla eşleşecek şekilde yazdırılır .


Maçtan% 'a% olarak geçiş yaparak 2 bayt kaydedebilirsiniz:scan(,'') %in% c('long','short','pause')
YCR

@YCR Bunun işe yarayacağını sanmıyorum. a %in% biçindeki girişlerin amevcut olup olmadığını kontrol bederken match(a, b), eşleşmelerin gerçek indekslerini döndürür. Girişin geçerli olduğunu varsayabildiğimiz için, kullanmak %in%sadece bir TRUEs vektörü döndürür .
JAD

Arf, doğru. Bunu c ile test ettim ('uzun', 'kısa', 'duraklat').
YCR

Eğer içine bir boolean vektör beslemek saatler olduğu için [, zaman olarak yorumlanır [which(bool) == TRUE], sizin örnekte hangi olurdu [c(1,2,3)]sırayla doğru çıkış vermek olur ki,.
JAD

Bunun yerine 2 bayt daha az sep=' - 'kullanabilirsinizs=' - '
Rift

4

Röda , 73 57 47 46 40 44 bayt

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

Çevrimiçi deneyin!

Kural değişikliği nedeniyle +4 bayt ( Rrrr4 harfli değişken yerine kullanılmalıdır ).

Önceki kod:

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

Kullanılması Mmmve Mm1 bayt kısadır.
ATaco

@ATaco "Uzun sesler 4 karakter uzunluğunda ve kısa sesler 2 karakter uzunluğunda olmalı" sorusunda söyleniyor .
fergusq

ATaco, ölçütlerin soruda daha fazla belirtildiğini lütfen unutmayın.
tisaconundrum

4

C (gcc) , 93 77 76 bayt

Scepheo sayesinde -2 bayt!
-1 byte Cyoce sayesinde!

Giriş olarak NULL sonlandırılmış ** karakter veya eşdeğerini alır.

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

Çevrimiçi deneyin!

açıklamalar:

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
Sana birleştirebilirsiniz düşünüyorum a++,*aiçine *++aiki bayt kaydetmek ve kullanmak belirsiz "sesi" tanımının yararlanmak *ayerine "Rrrr"başka dört bayt kaydedin.
Scepheo

İkinci öneriniz deha!
scottinet

1
For-loop'un artış aşamasının bir kısmını virgülle ayrılmak yerine vücuda taşıyabilir misiniz?
Cyoce

Bu gerçekten bir bayt tasarrufu sağlar. İyi yakalama!
scottinet


3

Toplu, 88 bayt

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

STDIN üzerine girdi alır. Ne yazık ki döngü genel maliyeti 26 bayt, bu yüzden bu sadece sıkıcı yedek.


2
Tüm @s kaldırmak için önerilen düzenleme
Stephen

@Stephen Evet, bildirimi aldım ...
Neil

Güzel! Sadece iki şey olsa: Ben 84 bayt uzunluğunda, ayrıca değil 88. OP yerini aldı olmak o cevabı sayılır Mmmmve Mmile Rrrrve Rr: o cevap c güncellemek için iyi olurdu,
Matheus Avellar

Hangi platformdan toplu olarak? MS-DOS 6.22 gelişmiş komut modunda XP ne yaparsa yapacağından şüpheliyim.
TOOGAM

@TOOGAM Evet, Batch derken genellikle Windows NT'nin CMD.EXE sürümü anlamına gelir.
Neil


2

PHP, 113 bayt

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

Çevrimiçi deneyin!

Kod golf ilk denemede, bu yüzden muhtemelen çok optimizasyon mevcut!


2

Vim (52 ​​bayt)

:s/long/Rrrr/ge|s/short/Rr/ge|s/pause/-/ge|s/ / - /ggiriş

Muhtemelen daha kısa yapılabilir ...


Komutlar bu şekilde bir araya getirilirse, belirli bir dizede duraklama veya bir şey yoksa IE'de hata veriyorsa treni durdurur, başarısız olandan sonraki değiştirmeler çalışmaz. Onları ayrı satırlara bölebilir veya esonuna bir bayrak koyabilirsiniz
nmjcman101

Hata düzeltildi. Hâlâ hızlandırmanın bir yolu olması gerektiğini hissediyorum, ama düşündüğüm tek yol ("duraklamayı" bir tireye çevirdikten s/[^ -]/r/sonra, her boşluktan sonra ilk R'yi büyük harfle kullanın, dört-r'den iki-r'ye kırpın) daha uzun çıktı.
David Heyman

1

Excel, 100 bayt

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

Örnekler doğrultusunda, girdi SPACEçıktı olarak ayrılır dizedir.

Sorunun kendisi, SPACEbiraz daha kısa 97 bayt çözümüne izin veren bir gereksinimden bahsetmiyor :

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

1

Otomatik , 145 bayt

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

(AutoIt kod golf için gerçekten kötü bir seçimdir, mümkün olduğunca küçük yapmak için elimden geleni yaptım)


Siteye Hoşgeldiniz! :)
James

1

Alice , 37 bayt

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

Çevrimiçi deneyin!

açıklama

Bu program aşağıdaki ikameleri yapar:

  • l, hR
  • o, n, gr
  • p-
  • Uzay → Uzay
  • Diğer her şey → Hiçbir şey
"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 bayt

'Den girdi alır stdin,stdout

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

Düzenle - 2 bayt kaydedildi

Sed, 40 bayt

Nitrodon'un cevabından fikir kopyalanıyor

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

Düzenle: 2 bayt daha kaydetti



0

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

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

Çevrimiçi deneyin!

Yığında bir dize alır ve yığında bir dize ile sonuçlanır. STDIN'den okunan itam bir programa dönüşmek için önce.

Pyke yanıtı ve herkes &6gibi kullanır , ancak her gürültüden sonra bir jeton ekleyerek , sonuncuyu silerek ve daha sonra bu jetonları boşluklarla birleştirerek jetonları biraz farklı bir şekilde birleştirir. Tarafından katılmak için bir bayt kaydetmek gibi görünüyor ."-"" - "

Açıklama:

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 değiştirerek, tıraş iki bayt destekleyecek olan xve "-"birlikte '-.



0

Ruby , 67 bayt

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

Bu, Johan Karlsson'un Ruby'ye taşınan JavaScript çözümüdür . Bu yanıtı beğendiyseniz, Johan'ın cevabını onaylamalısınız.

Anahtar fikir, 'short'sözcükleri ayırt etmek için kelime dizgilerini , vb. Tek bir karakterle karşılaştırmaktır.

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

Veya alfabetik sırayla:

  • uzun
  • m
  • Duraklat
  • q
  • kısa

Çevrimiçi deneyin!


0

Ruby , 78 bayt

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

Girdinin sadece önemli parçalarıdır p, o, g, ve uzay ... gerisini görmezden.

  • short olur o
  • long olur og
  • pause olur p

Çevrimiçi deneyin!



Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.