携帯電話を受け取ります!振動している!


14

あなたは最近新しい電話を手に入れましたが、それが振動する方法があまり好きではないので、独自の振動パターンを作成したいと決めました。だから、あなたはあなたがキーワードを使用するプログラムを書いてlongshortそしてpauseこれらのキーワードに応じてお使いの携帯電話を振動させるために。

仕事

文字列を受け取り、小さなプログラムを作成しlongshortし、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

これは質問なので、回答はバイト単位でスコア付けされ、最も少ないバイトが勝ちます。


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]。各単語の最初の文字のコードポイントを取得し、6でそれを取得しますAND。幸運な偶然により、探している値に変換されます。(これを見つける前に、他のかなり長いソリューションを検索しました)。それが完了したら、さらにintを["RRRR", "RR", ""]掛けることでintのリストをさらに変換し、"R"それがに["RRRR", "RR", "-"]なり、最後にタイトルを取得して取得し["Rrrr", "Rr", "-"]ます。次に、結果のリストに参加します" - "


トランスフォーメーションでそれを行うクールな方法!
-tisaconundrum

ソリューションは、Pythでばかばかしいほど似ていますj" - "m|*\M.&Chd6\-c:-)
ミスターXcoder

また、OPは例にスペースを追加しますが、それらを指定しません。それについての説明を求めました。
ジョナサンアラン

@JonathanAllanバイト\xef\xa6are .oおよび.&それぞれ。これは下位互換性のある変更であり、上位ビットが設定されている場合、古い2バイトコマンドのように実行されます。パイクは技術的にはもうコードページを使用していないと私は仕事をしませんランダムバイトを挿入する必要はしたくないので、私はそれを読者のためにそれを容易にするために、このように書いています
ブルー


11

Haskell71 66 59バイト

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

オンラインでお試しください!

そうそう、=<<concatMapです。

"long""short"両方に手紙があるという事実を利用しoます。


f=ポイントなしの機能は割り当てなしで許可されるため、2バイトを支払う必要はありません
ポストロックガーフハンター

lambdabot haskellに切り替えると、lambdacaseで1バイト全体を保存できます(>>=(\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

05AB1E33 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を介して入力を受け取り、チェック入力が一致するか否かlongshort又はpause、およびスワップの一致RrrrRr又は-それぞれ。

次に、これ-をセパレータとしてスペースで埋めて印刷し、目的の出力に一致させます。


一致から%in%に切り替えることで2バイトを節約できますscan(,'') %in% c('long','short','pause')
。– YCR

@YCRうまくいかないと思う。a %in% bのエントリaがに存在するかどうかを確認し、一致の実際のインデックスbmatch(a, b)返します。入力が有効であると想定できるため、using %in%TRUEsのベクトルを返すだけです。
-JAD

アルフ、本当。c( 'long'、 'short'、 'pause')でテストしました。
YCR

これは、ブールベクトルを[に入力すると、として解釈される[which(bool) == TRUE]ためです。この例では[c(1,2,3)]、が正しい出力を生成することになります。
-JAD

代わりに2バイト少なくsep=' - '使用できますs=' - '
リフト

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["-"]]&" - "]}

Mmmand を使用すると、Mm1バイト短くなります。
-ATaco

@ATaco 「長い音は4文字、短い音は2文字にする必要があります」という質問で言われました。
fergusq

ATaco、質問でさらに基準が指定されていることに注意してください。
-tisaconundrum

4

C(gcc)93 77 76バイト

-2バイトはScepheoのおかげです!
チョイスのおかげで-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*++a2バイトを節約し、さらに4バイトを節約する*a代わりに、あいまいな「サウンド」定義を利用することができると思います"Rrrr"
Scepheo

2番目の提案は天才です!
スコチネット

1
forループのインクリメント段階の一部を、カンマ区切りではなく本体に移動できますか?
チョイス

これは実際にバイトを節約します。良いキャッチ!
スコッティネ


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はい、通知を受け取りました...-
ニール

いいね!ただ、二つのこと、にもかかわらず:私は84であることをその答えを数えていない88。また、OPに交換された、バイトの長さMmmmMmしてRrrrRr、あなたの答えcを更新するとよいでしょう:
マテウスAvellar

どのプラットフォームのバッチ?MS-DOS 6.22は、拡張コマンドモードの場合にXPが行うことを行うとは思いません。
TOOGAM

@TOOGAMうん、バッチと言うとき、私は通常Windows NTのCMD.EXEのバージョンを意味します。
ニール



2

Vim(52バイト)

:s/long/Rrrr/ge|s/short/Rr/ge|s/pause/-/ge|s/ / - /g入る

おそらく短くすることができます...


このようにコマンドをつなぎ合わせると、指定された文字列に一時停止や何かがない場合、それらのいずれかがIEにエラーを起こすと、列車が停止します。それらを別々の行に分割するかe、最後にフラグを付けることができます
-nmjcman101

エラーを修正しました。私はまだそれをスピードアップする何らかの方法があるべきだと感じていますが、私が考えた唯一の他の方法(「一時停止」をダッシュ​​に変えたs/[^ -]/r/後、すべてのスペースの後に最初のRを大文字にし、4-rから2-rをトリミングします)長く出てきました。
デビッドヘイマン

1

Excel、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("))

(AutoItはコードゴルフには本当に悪い選択です。できるだけ小さくするように最善を尽くしました)


サイトへようこそ!:)
DJMcMayhem

1

アリス、37バイト

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

オンラインでお試しください!

説明

このプログラムは、次の置換を行います。

  • lhR
  • ongr
  • 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バイト

から入力を受け取り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

オンラインでお試しください!

スタック上の文字列を取得し、スタック上の文字列になります。プリペンドiSTDINから読み取る完全なプログラムに変わるをします。

Pykeの回答や他の人と&6同じように使用しますが、各ノイズの後にトークンを追加し、最後のトークンを削除してからスペースでこれらのトークンを結合することにより、トークンをわずかに異なる方法で結合します。による結合でバイトを節約するようです。"-"" - "

説明:

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はx"-"で置き換えることにより、さらに2バイトのシェービングをサポートし'-ます。



0

ルビー、67バイト

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

これは、Rubyに移植されたJohan KarlssonのJavaScriptソリューションです。この答えが気に入ったら、ヨハンの答えに賛成してください。

重要な考え方は、単語'short'を区別するために、単語列などを単一の文字と比較することです。

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

または、アルファベット順に:

  • 長いです
  • m
  • 一時停止
  • q
  • ショート

オンラインでお試しください!




弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.