Parsonsコードの視覚化解除


22

前書き

パーソンズコードが記述するだけの簡単な方法であるピッチ変動をメモは、以前のものよりも高いか低いか、楽曲に。

曲を覚えるのが面倒くさいとしても、音が上がったり下がったりするかどうかはほとんど覚えているので、Parsonsコードは検索エンジンを使用して音楽を識別するのに役立ちます。


説明

各バリエーションは、次のいずれかの単一の文字で表されます。

  • Rメモが前のメモと同じ場合(R epeat」の略)
  • Uメモが前のメモより高い場合(U p」の略)
  • Dメモが前のメモより低い場合(D所有」の略)

最初のメモはとして書かれてい*ます。


次に、Parsonsコードの例を示します("Ode to Joy"の始まり):

*RUURDDDDRUURDR

次のように、実際に視覚化できます。

      *-*                    
     /   \                   
    *     *                  
   /       \                 
*-*         *         *-*    
             \       /   \   
              *     *     *-*
               \   /         
                *-*          

これを輪郭と呼びます。

このような国を描くためのルールは、上記の例で説明されていると考えられます。



チャレンジ

今、本当の挑戦が来ます。

入力として輪郭を与え、対応するパーソンズコードを出力するプログラムを作成します。

輪郭を描くように求められませんが、実際は反対です。
輪郭から、元のパーソンズコードを見つけます。


ルール

  • コードゴルフの通常の規則が適用されます
  • バイト数で最短のプログラムが勝ちます
  • 入力は等高線であり、出力は有効なパーソンズコードでなければなりません
  • 入力用の余分な空白に関する詳細は関係ありません。
  • 前のルールのために、余計な空白を使用して、何らかの方法で出力やプログラムの一部をハードコーディングすることはできません

ノート



だから、それ*は何もしないで始めなければなりませんか?
ニカエル

どういう意味ですか?入力がちょうど*?いや。*おそらく印刷するはずです。このコーナーケースを追加します。
ヘルゲフォンコッホ

1
@nicaelはい、先頭はでなければなりません*。常に。
ヘルゲフォンコッホ

回答:


4

Pyth- 28 25 27 25バイト

@ジャクベのおかげで2バイトが節約できました。

s+\*@L"RDU"-VFtBxR\*%2C.z

こちらからオンラインでお試しください


1
*入力としては機能しません。出力は*0それだけであるはず*です。邪悪な野生の末尾のゼロが登場しました。
ヘルゲフォンコッホ

@HelgevonKochは、固定
Maltysen

@ジャクベありがとう!
マルティセン

あなたはスワップましたUし、D道によります。そうでなければ、よくやった。
ヘルゲフォンコッホ

@HelgevonKochおっと
Maltysen

24

CJam、21バイト

qN/:.e>(o2%:i"DRXU"f=

文字単位の最大演算を:ベクトル化(.)して、行()を折りたたみますe>。各列にはスペース以外の文字が1つしかないため、スペースはすべての印刷可能な非スペース文字よりも小さいASCIIコードを持っているため、これが結果になります。

シフトを解除して最初のアスタリスクを出力し(o、モジュラーインデックス2%UDR使用して残りのchar ()をすべてマップします。

古いソリューション(29バイト)

'*qN/z2%'*f#0+2ew);::-"RDU"f=

qN/入力行を取得します。zこの文字行列を転置します。2%奇数行ごとにドロップします。'*f#各行のアスタリスクのインデックスを検索します。0+2ew);連続するすべてのインデックスのペアを取得します。::-その違いを計算し、"RDU"f=文字にマップ(モジュラーインデックス経由:0 → R2 → U-2 ≡ 1 → D)。大手は、'*アスタリスクを付加します。

編集:私はCJam が短すぎるリストで(連続したスライス)を処理しない2ewよう0+2ew);に動作するように変更しましたew。これにより、入力文字列に対してコードが機能します*

ここ試してみるか、動作を確認してください。

              

7
これは本当に見ものです。
Jeel Shah

2
同意する!コードに+ 1、GIFに+10があればいいのに。
ETHproductions

ところで、コード長17のスマイリーが好き:-p
ETHproductions

1
私は同意します、これは見るのが素晴らしいです。*ただし、入力としては機能しません。RuntimeException代わりにいい感じがします。
ヘルゲフォンコッホ

うーん、私はCJamのバグだと考えています:エラーで[X]2ew[]なく返すべきです。ただし、回避策を追加します。
リン

4

Pythonの3、129の 108 98 86バイト

おそらくこれをゴルフするいくつかの方法がありますが、私はむしろそれをすべて1行にまとめました。

編集:現在使用中''.translate()

編集:多くのおかげで wnnmawにます

編集:バイトを節約するために、改行で区切られた文字列ではなく、文字列の配列に入力形式を変更しました。また、最後の編集では、私が混同Uし、R私はそれを固定して、。

lambda a:'*'+"".join(('UR'[j<'/']+'D')[j>'/']for l in zip(*a)for j in l if j in'-/\\')

入力は文字列の配列でなければなりません。上記の例では、これは次のようになります。

["      *-*                    ","     /   \                   ","    *     *                  ","   /       \                 ","*-*         *         *-*    ","             \       /   \   ","              *     *     *-*","               \   /         ","                *-*          "]

ゴルフをしていない:

def f(a):
    s = ''
    for c in zip(*a):           # transpose
        for d in c:             # for each letter in column c
            if e in "-/\\":     # if that letter is either -,/,\
                if e < '/':     # if < '/' (same as if == '-')
                    s += "R"
                elif e > '/':   # if > '/' (same as if == '\')
                    s += "D"
                else:           # if == '/'
                    s += "U"
        return "*" + s          # in the code we ''.join() it all together
                                # in this ungolfing, we add to an empty string

私はあなたから多くを借りたので、新しい答えをしたくありませんがlambda s:'*'+"".join((('D','R')[j=='-'],'U')[j=='/']for l in zip(*s.split('\n'))for j in l if j in'\\/-')、105バイトで記録します。主な違いは、使用しているタプル条件の代わりに、翻訳
wnnmaw

ありがとう@wnnmaw!それをさらに下にゴルフできると思います!
シャーロック9

前部の条件付きでの素晴らしいゴルフ、それはとても賢いことです!
wnnmaw

ああシャック。ヒントをありがとう@wnnmaw
Sherlock9

3

ルビー、87バイト

すべての行が同じ長さになるように、入力に後続スペースが必要です。

$><<?*+$<.readlines.map(&:chars).transpose.join.gsub(/./,{?-=>:R,?/=>:U,?\\=>:D}).strip

4
確かに、これには悪意のあるコードが含まれています>:D
アレックスA.

3

Japt、38バイト40 41 45 46 48

@ETHproductionsのおかげで2バイト節約

'*+U·y £Yu ?"RUD"g1+(XrS c -47 g):P} q

トリムコマンドがあった場合、これはたった38バイトです;-; ゴルフが終わったら説明を追加します。:P面白い、それは実際に重要でない文字を無視して、プログラムのことしようとしているプログラムではありません。

オンラインで試す


アレイの転置を実際に必要とする課題があり、Doᴡɴɢᴏᴀᴛがそれに答えたのを見たとき、私はそれがJaptでなければならないことを知った。
ETHproductions

ところで、私は時のトリム機能に追加しますxと、転置と回転機能でyz(改行で分割、配列関数を使用し、改行で参加)
ETHproductions

次のように2バイトを保存できます。Yu ?"RUD"g1+(XrS c -47 g):P
ETHproductions

@ETHproductionsありがとう、40バイト未満に!
ダウンゴート

3

Haskell、89バイト

import Data.List
m '/'="U"
m '-'="R"
m '\\'="D"
m _=""
('*':).(>>=(>>=m)).transpose.lines

使用例:

*Main> ('*':).(>>=(>>=m)).transpose.lines $ "      *-*                    \n     /   \\                   \n    *     *                  \n   /       \\                 \n*-*         *         *-*    \n             \\       /   \\   \n              *     *     *-*\n               \\   /         \n                *-*          "
"*RUURDDDDRUURDR"

*Main> ('*':).(>>=(>>=m)).transpose.lines $ "*"
"*"

入力を転置し、文字// -/ \をシングルトン文字列"U"/ "R"/に置き換え"D"ます。他のすべての文字は、空の文字列""に置き換えられます。空の文字列は、すべてを連結することで消えます。最後に、アスタリスクを付加します*


2

Mathematica、103バイト

"*"<>(Differences@Position[Thread@Characters@StringSplit[#,"
"],"*"][[;;,2]]/.{-2->"U",0->"R",2->"D"})&

これは文字列処理の課題であることを考えると、かなり短いです。


2

JavaScript(ES6)90

匿名関数。入力文字列を文字ごとにスキャンし、現在の行の位置を考慮に入れます。これをやって、それがsubsituting出力配列構築するU D Rための/ \ -適切な場所で

c=>[...c].map(c=>c>'*'?t[i++]=c>'/'?'D':c<'/'?'R':'U':c<' '?i=0:++i,t=['*'],i=0)&&t.join``

2

Matlab、62バイト

r=@(s)[85-(s<14)*3-(s>59)*17,''];@(p)r(sum(p(:,2:2:end)-32))

これには、入力が長方形(各行に同じ数の文字)であることが必要です。例えば

    ['      *-*                    ';    '     /   \                   ';    '    *     *                  ';    '   /       \                 ';    '*-*         *         *-*    ';    '             \       /   \   ';    '              *     *     *-*';    '               \   /         ';    '                *-*          '];

説明

sum(p(:,2:2:end)-32)        % exctract every second column, substract 32 (spaces->zeros) 
                            % and sum column wise (results in a vector of 3 different values)
[85-(s<14)*3-(s>59)*17,'']  % map each of the values to the corresponding value of the letter and convert back to characters
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.