不可视化帕森斯代码


22

介绍

帕森斯的代码只是为了说明一个简单的方法的音调变化在一段音乐,音符是否高于或低于前一个低。

即使您乐于记住音乐,您仍然可以很清楚地记起音符的高低,因此,帕森斯代码可以帮助您使用搜索引擎识别音乐。


描述

每个变体都由单个字符表示,该字符是以下之一:

  • R如果该音符与上一个音符相同(代表R epeat”
  • U如果该音符高于上一个音符(代表U p”
  • D如果该音符低于上一个音符(代表D拥有”

首字母写为*


这是帕森斯代码的示例(“欢乐颂”的开头):

*RUURDDDDRUURDR

您实际上可以可视化,如下所示:

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

从现在开始,我们将其称为轮廓

上面的示例认为绘制此类国家的规则是不言自明的



挑战

现在是真正的挑战。

编写一个程序,以轮廓为输入,输出其相应的帕森斯代码。

不要求您绘制轮廓,但实际上是相反。
从轮廓中找到原始的帕森斯代码。


规则

  • 打高尔夫球的通常规则适用
  • 字节数最短的程序获胜
  • 输入为轮廓,输出为有效的帕森斯码
  • 与输入的多余空格有关的细节无关紧要,尽一切可能为您效劳
  • 由于前面的规则,不允许您使用额外的空格对输出和/或程序的部分内容进行一种或另一种硬编码。

笔记



所以它必须以*什么都不做开始?
nicael

你什么意思?当输入是*什么时候?不。*我猜应该打印出来。我将添加这个特殊情况。
Helge von Koch 2015年

1
@nicael是的,必须以开头*。总是。
Helge von Koch 2015年

Answers:



24

CJam,21个字节

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

:通过向量化()逐.字符最大操作来折行()e>。由于每一列中只有一个非空格字符,因此将得到此结果,因为空格比所有可打印的非空格字符具有更小的ASCII码。

取消移位并打印第一个星号(o,然后将其他所有2%剩余字符映射为UDR使用模块化索引。

旧解决方案(29个字节)

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

qN/获取输入行。z转置此字符矩阵。2%丢弃每一奇数行。'*f#在每一行中找到星号的索引。0+2ew);获取所有连续的索引对。::-计算它们的差异,以及"RDU"f=它们映射到的字母(通过模块化的索引:0 → R2 → U-2 ≡ 1 → D)。领导'*加上星号。

编辑:我改为2ew0+2ew);解决CJam不能处理ew列表太短的(成功切片)。这使代码适用于输入字符串*

在这里尝试,或观看实际操作:

              

7
真的很棒。
Jeel Shah 2015年

2
我同意!+1表示代码,希望我可以+10表示GIF。
ETHproductions 2015年

顺便说一句,我喜欢代码长度为17的笑脸:-p
ETHproductions

1
我同意,这太棒了。但是,它不能*作为输入使用。我得到一个不错的RuntimeException代替。
Helge von Koch 2015年

gh,我认为是CJam错误:[X]2ew应该返回[]而不是出错。不过,我将添加一种解决方法。
林恩

4

Python 3中,129 108 98 86个字节

打高尔夫球可能有几种方法,但我很喜欢将其全部归结为一条线。

编辑:现在使用''.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!我想我可以进一步降低它!
Sherlock15年

前面有条件的情况下打高尔夫很不错,那超级聪明!
wnnmaw 2015年

啊,糟透了。感谢您的提示@wnnmaw
Sherlock9

3

Ruby,87个字节

在输入中需要尾随空格,以便所有行的长度相同。

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

4
当然,这是恶意代码,因为其中包含>:D
Alex 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 2015年

顺便说一句,我将在微调功能在增加x和转置和旋转功能,在yz(于换行分割,使用阵列功能,用换行加入)
ETHproductions

您可以像这样保存两个字节:Yu ?"RUD"g1+(XrS c -47 g):P
ETHproductions 2015年

@ETHproductions多亏了40字节以下!
Downgoat,2015年

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

匿名函数。它逐字符扫描输入字符串char,并考虑当前行中的位置。这样做,它将在正确的位置构建一个替换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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.