平滑vs.矮胖vs.断花体


12

基于块状vs.平滑字符串

/\_/\/\__/\/\/\/\_/\_/\当您真的很无聊时,在键盘上制作花粉很有趣。但是,并非所有的花鼓都是一样的。有些花鼓是光滑的,例如\___/,而有些是矮胖的,例如/\/\/\/\。其他人则完全崩溃,例如////_\\\

在每个N字形字符中,都有字形N-1连接点。每个弯头连接点分为以下三种类型之一:

  • 平滑(角度>“ 90度”):

    \_ __ _/

  • 矮胖(角度=“ 90度”)

    /\ \/

  • 坏了(没有连接的任何东西)

    // \\ /_ _\

让我们来定义的平滑度是那些光滑,结的比例chunkiness破碎类似定义。每个值的范围在0和之间1。花样的光滑度,粗大度和断裂度之和始终等于1。

例如,该花体/\/\\_//\_具有3个平滑结,4个块状结和2个折断结。因此0.3333,它是光滑,0.4444厚实和0.2222破碎的。

空字符串和只有一个字符的字符串具有未定义的值,所有输入的长度至少为2个字符。

挑战

编写一个程序,接受任意长度的花样,并输出其平滑度,块度和破损值中的任意两个。

  • 您可以编写程序或函数,并通过STDIN,命令行或字符串参数输入。
  • 您可以假定输入的长度至少为> = 2,并且仅由/\_带有可选尾随换行符的字符组成。
  • 打印(或返回一个函数)两个浮点数的精度至少为四舍五入,四舍五入或截断。如果真实值为2/3,可接受的值包括0.6666和之间的任何值0.6667,甚至是诸如0.666637104。如果确切值为1/3,则任何包含的答案0.3333都是有效的。如果值小于1,则可以省略尾随零,也可以省略前导零。
  • 根据需要输出三个值中的任意一对,只需确保说明两个值和顺序。

以字节为单位的最短代码获胜。

例子

/\/\\/\//\\→平滑0,Chunkiness 0.7,残破0.3

_/\\_/\\/__/\\\//_→平滑0.29411764705,Chunkiness 0.29411764705,残破0.41176470588

//\\__/_\/→平滑0.3333333,Chunkiness 0.2222222,残破0.4444444

奖励问题:您更喜欢哪个,平滑的,粗大的或折断的花形?


输出这三者是否有好处,还是您只选择了两个就有特定的原因?
Aᴄʜᴇʀᴏɴғᴀɪʟ

1
@Callodacity 2足以定义第三个,因为它们的总和为1
trichoplax

2
病人: - @trichoplax好点很明显,我一直在打高尔夫球太长了,我不能再理解简单的事情
Aᴄʜᴇʀᴏɴғᴀɪʟ

Answers:


2

Pyth,25个字节

mcl@.:d2.:z2tlzc2"\__//\/

测试套件

输出平滑度,粗块度。基本上,它采用硬编码的字符串并将其切成两半。每个半都分解为2个字符的子字符串,对输入内容也是如此。我们采取相交,得到南方和矮矮胖胖的对。然后,我们取长度,除以对数,然后打印。


2

Japt,42个字节

U=U¬ä@2+"\\/\\__/"bX+Y)f2};[T2]£U¬fX l /Ul

输出损坏,粗大。在线尝试!

怎么运行的

            // Implicit: U = input string
U=UŠ@   }  // Set U to U split into chars, with each pair mapped by this function:
"..."bX+Y)  // Take the index in this string of the two chars concatenated.
            // This is 0-1 for chunky, 2-4 for smooth, and -1 for broken.
2+    f2    // Add two and floor to the nearest multiple of 2.
            // This is now 2 for chunky, 4 or 6 for smooth, and 0 for broken.
[T2]£       // Map each item X in [0,2] through this function:
U¬fX l      //  Count the occurances of X in U.
/Ul         //  Divide by U.length.
            // Implicit: output last expression

非竞争版本,36字节

U=Uä@2+"\\/\\__/"bZ)f2};[T2]£UèX /Ul

基本上以与其他方法相同的方式工作,但有一些小的更改:

  • ä现在适用于字符串。字符按顺序传递到函数中(X, Y, X+Y)
  • è 计算参数在字符串/数组中出现的次数。

1

Python 3,149字节

这将输出平滑度和矮胖度。

def f(s):
 for i in"012":s=s.replace("\_/"[int(i)],i)
 a=len(s)-1;t=["bscbssbbc"[int(s[i:i+2],3)]for i in range(a)]
 for x in"sc":print(t.count(x)/a)

取消高尔夫:

def f(s):
    for i in "012":
        s = s.replace("\_/"[int(i)], i)
    a = len(s) - 1
    t = []
    for i in range(a):
        t.append("bscbssbbc"[int(s[i:i+2],3)])
    for x in "sc":
        print(t.count(x) / a)

1

Ruby,71岁

输出平滑度,粗块度。

获取最小的平滑且粗大的字符串,并在初始字符串中搜索每个两个字符的字符串。

感谢Kevin Lau的八个字节!

->x{%w{\\__/ /\\/}.map{|t|(0..n=x.size-2).count{|i|t[x[i,2]]}/(n+1.0)}}

1
(0..x.size-2).count{|i|t[x[i,2]]}节省5个字节x.chars.each_cons(2).count{|i|t[i*'']}。现在,您x.size在函数中使用了两次,将其分配给变量,并使用它节省了一个额外的字节。
Value Ink

@KevinLau使用您的方法设法节省了8个字节。谢谢!
并非查尔斯(Charles)
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.