画一个坎String的弦


26

受此挑战启发。)

假设我们有一个字符串ABBCBA。我们可以说,之间存在上升AB,为B如下A; 我们可以说B和之间有一个过渡B,没有任何变化;最后我们可以说C和之间有一个落差B。我们可以这样画一个图:

             A   B   B   C   B   A
Rising:        o       o
Continuing:        o
Falling:                   o   o

没有标签,并最小化空白:

o o
 o
   oo

这是输入的预期输出ABBCBA

您可以使用任何非空白字符替换o输出中的字符。此外,每列之间可以选择有一个额外的空间,如下所示:

o   o
  o 
      o o

输入内容将至少包含三个字符。该字符串将完全由大写字母组成,但是您可以改用小写字母。

测试用例

TEST CASE
LINE 1
LINE 2
LINE 3

HELLOWORLD
 o oo o
  o
o    o oo

TESTCASE
 oo  o

o  oo o

EXAMINATION
o o o o o

 o o o o o

ZSILENTYOUTH
  o ooo o

oo o   o oo

ABC
oo



ABCBA
oo

  oo

每个连续的os 之间是否可能有空格,或者输出必须紧凑?
JungHwan Min

@JHM当然可以。
科纳·奥布赖恩

另外,输出必须是字符串,还是只需要看起来类似于示例?
JungHwan Min

@JHM您要记住什么?
Conor O'Brien

我想到的代码会生成一个网格。
JungHwan Min

Answers:


6

果冻,11 字节

OIṠ“ o ”ṙZY

在线尝试!验证所有测试用例

怎么运行的

OIṠ“ o ”ṙZY  Main link. Argument: s (string)

O            Ordinal; replace all characters with their code points.
 I           Increments; compute the differences of consecutive code points.
  Ṡ          Sign function.
   “ o ”ṙ    Rotate that string -1, 0, or 1 unit(s) to the left.
         Z   Zip; transpose rows and columns.
          Y  Join, separating by linefeeds.

11

Mathematica,93 83 68 64字节

(使用0,不是O

Row[Column@Insert[{,},0,2-#]&/@Sign@Differences@LetterNumber@#]&

说明

LetterNumber@#

获取输入的每个字符在字母表中的位置。

Sign@Differences@

取每个连续元素之间的差,并取符号(-1负/下降,00 /连续,1正/上升)

Insert[{,},0,2-#]&

0在两个Nulls 的列表中插入a ,如果上升则插入第一个位置,如果继续则插入中间,如果下降则插入第三个位置。

Row[Column@ ... ]

格式化输出。


如果输出看起来与问题中的输出不同,则上述代码可以缩短为41个字节:

ListPlot@*Sign@*Differences@*LetterNumber

...会创建以下内容(对于“ ABBCBA”):

在此处输入图片说明


41字节的外观如何?
Conor O'Brien

@ ConorO'Brien请参阅编辑。
JungHwan Min

10

MATL15,14个字节

dZSqtQtQv~79*c

在线尝试!

说明:

他们说一张图片值一千个单词,所以这里是一个beta在线解释器,它向您显示更新时实时显示的堆栈顶部的价值。请注意,它仍处于测试阶段,因此您可能需要多次运行。

所以首先,我们致电dZSd给我们每个连续元素之间的差,并ZS给我们每个元素的符号(-1、0或1)。因此,以“ HELLOWORLD”作为输入,第一步之后,我们将获得:

-1  1  0  1  1 -1  1 -1 -1

现在,我们只是使用q减量来获得:

-2  0 -1  0  0 -2  0 -2 -2

然后两次,我们复制堆栈的顶部并递增数组(tQ),之后我们将得到

-2  0 -1  0  0 -2  0 -2 -2
-1  1  0  1  1 -1  1 -1 -1
0   2  1  2  2  0  2  0  0

现在所有的“ 0”都是我们要输出字符的地方。因此,我们将这三个数组合并为一个矩阵(v),并在逻辑上取反(~)。然后,将矩阵中的每个值乘以ASCII值'O'(79*),然后将其显示为字符串c


一旦有了向量[-1,1,0,1,...],就可以将它们用作具有列索引[1,2,3,4,...]的稀疏矩阵的行索引,然后将其转换为完整矩阵。
Nick Alger

好吧,没关系,尝试过这个建议,似乎并没有节省任何东西
Nick Alger

@NickAlger无论如何,感谢小费!出于好奇,我能看看你的想法吗?
DJMcMayhem

当然。以下是19个字符,尽管可能会有所改善,dZS2 + tn:tnZ?XPg79 * c
Nick Alger

经过几次优化,将其设置为16,dZSqq_tn:lZ?79 * c
Nick Alger

8

Haskell,63个字节

f w=[do(e,y)<-zip w$tail w;max" "['o'|b e y]|b<-[(<),(==),(>)]]

返回三个字符串的列表,代表输出的行。不包含任何潜意识信息。

戴安娜(Dianne)使用do表示法而max不是列表理解和节省了三个字节last


3
太好了,它不包含任何潜意识的信息!那些是什么?
Conor O'Brien

5
['o'|b e y]..
izabera

是的,我的主人,等等,这是怎么回事?
CalculatorFeline

7

CJam,19个字节

l2ew{:-g)S3*0t}%zN*

0代替o

在线尝试!

说明

l      e# Read input.
2ew    e# Get all pairs of consecutive letters.
{      e# Map this block over the pairs...
  :-   e#   Compute the difference between the two letters.
  g    e#   Signum. Gives -1 for rises, 1 for falls, 0 otherwise.
  )    e#   Increment. Gives 0 for rises, 2 for falls, 1 otherwise. Call this i.
  S3*  e#   Push a string with three spaces.
  0t   e#   Replace the i'th space (zero-based) with a zero.
}%
z      e# Transpose.
N*     e# Join with linefeeds.

6

Python 2,76 71字节

lambda s:[''.join(' o'[cmp(*x)==n]for x in zip(s,s[1:]))for n in-1,0,1]

感谢@xnor通知我,允许返回字符串列表。

Ideone上进行测试


您可以输出三个字符串的列表,以便进行lambda
xnor

我是?那改变了一切。
丹尼斯

我在评论中询问是因为Lynn的Haskell回答正在这样做。
xnor

6

JavaScript(ES6),96 95 89 87 82字节

根据Conor O'Brien的建议,使用0代替节省了o
2个字节2 ETHproductions节省了6个字节

let f =

s=>[1,0,-1].map(k=>s.replace(/./g,(c,i)=>i--?(c>s[i])-(c<s[i])-k&&' ':'')).join`
`

console.log(f("HELLOWORLD"));
console.log(f("EXAMINATION"));


1
既然你可以使用任何字符,并替换'o'0任何帮助?
Conor O'Brien

@ ConorO'Brien-的确如此。;)
Arnauld

1
我认为s=>[1,0,-1].map(k=>[...s].map(c=>(r=p?(c>p)-(c<p)-k&&' ':'',p=c,r),p=0).join``).join`\n` 可以,节省2个字节。
ETHproductions's

您可以通过每次抓取上一个字符来保存另一个字节,而不用手动跟踪它:s=>[1,0,-1].map(k=>[...s].map((c,i)=>(p=s[i-1])?(c>p)-(c<p)-k&&' ':'').join``).join`\n` s.replace还将为您节省几个字节[...s].map().join()
ETHproductions 16/09/25

4

Perl,47个字节

包括+1的 -p

在STDIN上输入:

bumpy.pl <<< ABBCBA

bumpy.pl

#!/usr/bin/perl -p
$_ x=3;s%.%/\G(.)(.)/?$2cmp$1^$.&&$":--$.>0%eg

4

MATL,16 14字节

dZSqq_tn:79Z?c

在线尝试!

这源于对DJMCMahem答案的讨论。即使此答案在相同长度下2个字符,但方法还是有些不同,因此可能会引起人们的关注。

感谢Luis Mendo的建议,它节省了2个字节(请参阅注释)

说明:

'dZS'得到一个向量,其中每个条目都是连续字符之间差异的符号,然后'qq_'将每个条目减2并翻转符号,所以现在如果字符增加,则为1,如果保持不变,则为2,并减少3。例如,

dZSqq_ applied to 'HELLOWORLD' creates the vector [3 1 2 1 1 3 1 3 3]

接下来,“ t”在堆栈上复制前一个向量,然后“ n:”将向量[1,2,3,4,...]也放置在堆栈上。然后'79'将值79放置在堆栈上。选择值79是因为它是Unicode字符'o'的数字,稍后将作为输出。(感谢路易斯·门多(Luis Mendo)提出将值79放在此处而不是稍后的想法)

tn:79 applied to [3 1 2 1 1 3 1 3 3] creates the following items:
[3 1 2 1 1 3 1 3 3]   <-- first item on the stack
[1 2 3 4 5 6 7 8 9]   <-- second item on the stack
79                    <-- third item on the stack

在这一点上,我们正好有一个稀疏矩阵的行索引,列索引和非零值,无论何时需要输出字符,其值都为79;而要输出空白的位置,其值为0。我们将这三个项目从堆栈中取出,并使用MATL的稀疏矩阵命令'Z?'创建此稀疏矩阵。那是,

dZSqq_tn:79 Z? applied to 'HELLOWORLD' outputs the following:
[0  79 0  79 79 0  79 0  0 ]
[0  0  79 0  0  0  0  0  0 ]   <-- 3-by-n sparse matrix
[79 0  0  0  0  79 0  79 79]

剩下的就是将矩阵从数字转换为Unicode字符,这是通过命令“ c”完成的。79变成'o',0变成空格:

dZSqq_tn:79Z?c applied to 'HELLOWORLD' outputs:
[  o   o o   o    ]
[    o            ]   <-- 3-by-n sparse matrix of characters.
[o         o   o o]

然后隐式显示所得的字符矩阵。


您可以直接将79用作稀疏矩阵的非零值,从而节省两个字节。另外,我认为这是第一次在MATL答案中使用稀疏矩阵:-)
Luis Mendo

@LuisMendo谢谢!我编辑了帖子以做出您建议的更改
Nick Alger

3

PHP,95字节

for($b[1]=$b[0]=$b[-1]=" ";($s=$argv[1])[++$i];)$b[$s[$i-1]<=>$s[$i]][$i]=8;echo join("\n",$b);

1,创建索引为-1到1的字符串数组 $b=array_fill(-1,3," ");

2.填写由飞船操作员和输入位置所依赖的字符串

3.输出用新行连接数组

第一路111字节

for($o=" ";$i<$l=strlen($s=$argv[1])-1;)$o[$l*(1+($s[$i]<=>$s[$i+1]))+$i++]=8;echo join("\n",str_split($o,$l));

使用飞船操作员<=> 飞船操作员


1
如果您使用Latin-1编码程序,则是的便捷快捷方式"\n"不,认真!
林恩

1
同样的事情" ",可以例。您需要在查看时将浏览器编码设置为Latin-1。
林恩

@Lynn或〜³〜†〜'〜'谢谢您的想法。我会喜欢的unicode
约尔格Hülsermann

2

JavaScript(ES6),81个字节

s=>[s,s,s].map(f=([c,...s],n)=>(p=s[0])?((c<p)-(c>p)+n-1&&" ")+f(s,n):"").join`
`

从头开始编写,尽管它在很大程度上受到@Arnauld的回答的启发。使用递归计算每行的内容。


2

Ruby,66 64字节

->s{(-1..1).map{|n|s.gsub(/.(?=(.))/){"o  "[n+($1<=>$&)]}.chop}}

在eval.in上查看:https://eval.in/649503


2

Java 7中,158个 156字节

String c(char[]z){String a,b,c=a=b="";for(char i=1,q=z[0],o=79,s=32,x;i<z.length;a+=(x=z[i])>q?o:s,b+=x==q?o:s,c+=x<q?o:s,q=z[i++]);return a+"\n"+b+"\n"+c;}

@Frozn节省了2个字节。

非高尔夫球和测试用例:

在这里尝试。

class M{
  static String c(char[] z){
    String a,
           b,
           c = a = b = "";
    for(char i = 1,
             q = z[0],
             o = 79,
             s = 32,
             x; i < z.length; a += (x = z[i]) > q
                                     ? o
                                     : s,
                              b += x == q
                                     ? o
                                     : s,
                              c += x < q
                                     ? o
                                     : s,
                              q = z[i++]);
    return a + "\n" + b + "\n" + c;
  }

  public static void main(String[] a){
    print("HELLOWORLD");
    print("TESTCASE");
    print("EXAMINATION");
    print("ZSILENTYOUTH");
    print("ABC");
    print("ABCBA");
    print("ABBCBA");
    print("UVVWVVUVVWVVUVVW");
  }

  static void print(String s){
    System.out.println(c(s.toCharArray()));
    System.out.println("-------------------------");
  }
}

输出:

 O OO O  
  O      
O    O OO
-------------------------
 OO  O 

O  OO O
-------------------------
O O O O O 

 O O O O O
-------------------------
  O OOO O  

OO O   O OO
-------------------------
OO


-------------------------
OO  

  OO
-------------------------
O O  
 O   
   OO
-------------------------
O O   O O   O O
 O  O  O  O  O 
   O O   O O   
-------------------------

1
我不确定这是否有效,但是a,b,c=b=a=""会更短一些。
Frozn

@Frozn谢谢,编辑。确实有效。PS:您可以通过分叉检查自己是否处于ideone中。;)
Kevin Cruijssen 2016年

你是对的!我总是忽略链接,只是因为那不值得而开始蚀:)
Frozn

2

Clora(20字节)

<IN?o ;=IN?o ;>IN?o

说明:

有3个Clora程序,每条输出线一个。

第一个程序 <IN?o

检查当前输入的char I是否小于<下一个char N。将结果保存在全局标志中。检查标志结果?,如果为true,则输出output o,否则为空格(是的,那里有一个空格。

所有其他程序,遵循相同的规则,并由分隔;,每个程序都将执行并接收输入作为参数。

您可以自己测试它,包括clora.js并执行

(function() {
  var x = new Clora('<IN?o ;=IN?o ;>IN?o ');
  x.execute('EXAMINATION', function(r) {
    console.log(r)
  })
})();

这似乎是完全不竞争的,因为它是在挑战之后创建的。这看起来像个有趣的郎!
Conor O'Brien

1

Pyth,21个字节

jCmX*3\ h._d0-M.:CMz2

一个程序,该程序在STDIN上输入未加引号的字符串并打印结果。

这使用了类似于@MartinEnder的CJam答案的想法。

在线尝试验证所有测试用例

怎么运行的

jCmX*3\ h._d0-M.:CMz2  Program. Input: z
                 CMz   Map ordinal over z, yielding the code-points of the characters
               .:   2  Yield all length-2 sublists of that
             -M        Map subtraction over that
  m                    Map the following over that with variable d:
         ._d            Yield the sign of d
        h               Increment that (i)
    *3\                 Yield string literal of 3 spaces, "   "
   X        0           Replace the space at index i with 0
 C                     Transpose that
j                      Join that on newlines
                       Implicitly print

1

PHP 7,81 80 77字节

注意:使用Windows-1252编码

for($x=2;~$x--;print~õ)for($a=$argn;$c=$a[$$x+1];)echo$c<=>$a[$$x++]^$x?~ß:o;

像这样运行:

echo HELLOWORLD | php -nR 'for($x=2;~$x--;print"\n")for($a=$argn;$c=$a[$$x+1];)echo$c<=>$a[$$x++]^$x?" ":o;';echo

说明

通过线迭代(编号10-1)。然后遍历每行的输入字符串。当飞船比较的结果等于行号时,输出o,否则输出一个空格。每行之后,打印换行符。

调整

  • 停止对$xis进行迭代-1,可以通过二进制取反(结果0)找到。与添加相比节省一个字节1(或2个带预增量的字节)。
  • 通过使用节省了3个字节 $argn

1
您忘了增加-d error_reporting=30709字节数。
泰特斯(Titus)2016年

@Titus为什么在世界上我需要将其添加到字节数中?只是这样,PHP通知(可忽略)不会被打印!
2016年

也增加2>/dev/null,但将摆脱所有的错误,包括致命的
aross


有点像If you get warnings, set the default value with ...。请原谅我的学究;我没有解码该值。
泰特斯

0

LUA 326 303字节TL = 0 S = io.read()O1,O2,O3 = “”, “” “” T = {},对于i = 1,#就做T [1] = S:子(ⅰ ,i)v = 1,tl-1的tl = tl + 1结尾,如果t [v] t [v + 1]则o1 = o1 ..“” o2 = o2 ..“” o3 = o3 ..“ o“结束打印(o1 ..” \ n“ .. o2 ..” \ n“ .. o3)

非高尔夫版本

tl = 0 --set the tables length to 0
s = io.read() --Get the string from input
o1,o2,o3="","","" --Set the 3 output rows to empty strings
t = {} --Make a table for the string to be sent into
for i = 1, #s do --Loop from 1 to the length of the string
    t[i] = s:sub(i, i) --Set the I-th term in the table to the I-th character in the string
    tl = tl+1 --Add 1 to the table length
end --End the loop
for v=1,tl-1, 1 do --Loop from 1 to the tables length - 1, incrementing by 1
    if t[v] < t[v+1] then --Lua supports greater than less than and equals to with charactes, so this if statement detects if the string is rising
        o1=o1.."o" --Adds an o to the end of the first line of output
        o2=o2.." " --Adds a space to the second line
        o3=o3.." " --Adds a space to the third line
    elseif t[v] == t[v+1] then --Detects if the string is continuing
        o1=o1.." " --Adds a space to the first line
        o2=o2.."o" --Adds an o to the second line
        o3=o3.." " --Adds a space to the third line
    elseif t[v] > t[v+1] then --Detects if string is falling
        o1=o1.." " --Adds a space to the first line
        o2=o2.." " --Adds a space to the second line
        o3=o3.."o" --Adds an o to the third line
    end --Ends the if statement
end --Ends the loop
print(o1.."\n"..o2.."\n"..o3) --Prints the output

我认为您可以从中打出一些空白,例如t1 = 0?到t1=0?和类似的地方。
·奥布莱恩

我现在将解决这个问题
Alex Allen

0

R,114字节

非竞争性的R答案。

v=y=z=rep(" ",length(x<-diff(utf8ToInt(scan(,"")))));v[x>0]="#";y[x==0]="#";z[x<0]="#";cat(v,"\n",y,"\n",z,sep="")

说明

  1. 从命令行读取输入并转换为ASCII十进制向量
  2. 求第一差,并用空格创建相同长度的3x向量
  3. 然后用更换的白色空间矢量#,如果差异>0==0<0
  4. 强制矢量并用换行符分隔打印

为什么不竞争?
Conor O'Brien

@ ConorO'Brien我想它正在与其他R答案竞争,但是原始的解决方案很长,而且不够独特,以至于在一般意义上不那么有趣。
Billywob
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.