绘制文本的对角线


46

给定单词列表的输入,输出单词,其字母对角排列:

p
 r
  o
p  g
 u  r
  z  a
a  z  m
 n  l  m
  d  e  i
c     s  n
 o        g
  d
g  e
 o
  l
   f

(以上应该是输入的输出programming puzzles and code golf。)

准确地说,每个单词都从第一列开始,在前一个单词的下方三行,并且每个连续的字母向右移动一列,向下移动一列。

输入可以提供为单个字符串,由精确的一个空格分隔,也可以提供单词的列表/数组。单词将仅由小写字母组成a-z,并且始终至少一个字符长。

输出可以是单个字符串,行的数组或字符数组的数组。除单个尾随换行符外,不允许前导或尾随空格。

进一步的测试案例:

a bcd efgh i j

a


b
 c
  d
e
 f
  g
i  h


j

x

x

verylongword short

v
 e
  r
s  y
 h  l
  o  o
   r  n
    t  g
        w
         o
          r
           d

由于这是,因此以字节为单位的最短代码将获胜!


我觉得我应该能够在5分钟内为此编写一个Python程序,但是它似乎总是失败了……; _;
HyperNeutrino

哇,似乎为Turtlèd设计了许多挑战
Destructible Lemon

是否允许使用终端转义码?:)
Chromium

Answers:


17

VIM,85,76,66,52的击键/字节

当我第一次看这个挑战时,我以为“这对vim来说是完美的!” 然后当我尝试它时,一切都出了问题。这就是杂乱无章的荣耀:

:se ve=all|s/ /\r\r\r/g
qqGo<esc>?\<.\S
lDjP@qq@qG?.
jdG

由于(主要是)向后兼容的V解释器因此可以在线尝试

说明:

起初我以为我可以做这个漂亮的简单的37字节版本:

:se ve=all
qq:g/\S\S/norm ^lDjP
@qq@q

不幸的是,这并不是那么简单。让我们逐行介绍:

:se ve=all

这启用了称为“虚拟编辑”的功能。它允许光标移动到尚不存在的列。没有它,这个答案基本上是不可能的。

现在我们需要将单词分成不同的行。因此,我们将用3个换行符替换每个空格。由于这是一个ex命令,因此我们可以与上一个ex命令同时运行它,方法是用:se ve=all竖线将两者分开。

|s/ /\r\r\r/g

现在缓冲区看起来像这样:

Programming


Puzzles


and


code-golf

这就是乐趣的开始。我们使用设置了传统的递归宏qq,然后将其称为:

G               " Move to the last line
 o<esc>         " Append an extra newline

?               " Search backwards for
 \<.            " Any character at the beginning of a word
    \S          " Followed by a non-space character
l               " Move one character to the right
 D              " Delete eveything until the end of this line
  j             " Move down one line
   P            " Paste what we just deleted

然后,使用完成@qq@q。至此,我们有了所有的对角线,我们只需要进行一些清理即可。

G                   " Move to the last line
 ?.                 " Search backwards for any character
j                   " Move down one line
 dG                 " Delete until the end of the buffer

哇,JavaScript(当前)比Vim短。这些天来这是相当罕见的
事情

@ETHproductions不再。:)
DJMcMayhem

6

Turtlèd28 26字节

哦,天哪,我似乎在击败一种专门为打高尔夫球而设计的语言。这是美好的一天。

!_4[*.[ rd+.]ul[ ul]r;_+]_

在线尝试!

说明

(写入表示写入网格上的单元格,尖角char表示输入字符串指针指向的char中的字符)

!                         Take string input into variable
 _                        Normally conditional, with >1 input (there will be), write ' '
  4                       set register to 4
   [*                   ] until the current cell is *
     .                    Write pointed char, initially first char
      [     ]             Until space is written on cell
        rd+.              move right, down, string pointer++, write pointed char
             ul[ ul]      Move back up to the top of the word
                    r;    Move right, down 4 (because this is register value)
                      _+  write * if end of input, else ' ', increment string pointer
                        _ will always write ' ', since it will always point at start char

注意尾随空格。

输入也需要尾随空格。看到python可以列出列表,这很像在Turtlèd中列出列表


5

MATL,28字节

c!t&n:q3_*ts_b+5M4$XdZ!cZ{Zv

输入是一个字符串单元格数组,其中逗号作为可选的分隔符:

{'programming' 'puzzles' 'and' 'code' 'golf'}

要么

{'programming', 'puzzles', 'and', 'code', 'golf'}

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

说明

考虑以下输入作为示例:

{'aaaa' 'bb' 'ccc'}

您可以查看部分结果(堆栈内容),该注​​释%在代码的任何位置插入注释符号。例如,在第四个功能()之后查看堆栈内容&n

c        % Input cell array of strings implicitly. Convert to 2D char array,
         % right-padding with spaces
         % STACK: ['aaaa'; 'bb  '; 'ccc']
!        % Transpose
         % STACK: ['abc'
                   'abc'
                   'a c'
                   'a  ']
t        % Duplicate
         % STACK: ['abc'
                   'abc'
                   'a c'
                   'a  '],
                  ['abc'
                   'abc'
                   'a c'
                   'a  '],
&n       % Number of rows and of columns
         % STACK: ['abc'
                   'abc'
                   'a c'
                   'a  '], 4, 3
:q       % Range, subtract 1
         % STACK: ['abc'
                   'abc'
                   'a c'
                   'a  '], 4, [0 1 2]
3_*      % Multiply by -3
         % STACK: ['abc'
                   'abc'
                   'a c'
                   'a  '], 4, [0 -3 -6]
ts_      % Duplicate, sum, negate
         % STACK: ['abc'
                   'abc'
                   'a c'
                   'a  '], 4, [0 -3 -6], 9
b        % Bubble up in stack
         % STACK: ['abc'
                   'abc'
                   'a c'
                   'a  '], [0 -3 -6], 9, 4
+        % Add
         % STACK: ['abc'
                   'abc'
                   'a c'
                   'a  '], [0 -3 -6], 13
5M       % Push second input of last function again
         % STACK: ['abc'
                   'abc'
                   'a c'
                   'a  '], [0 -3 -6], 13, 4
4$Xd     % Buld numerical sparse matrix from the above four arguments. The
         % columns of the first input argument will be the diagonals of the
         % result, with indices given bu the second input (negative is below
         % main diagonal). The matrix size is the third and fourth arguments
         % STACK: [97  0  0  0
                    0 97  0  0
                    0  0 97  0
                   98  0  0 97
                    0 98  0  0
                    0  0 32  0
                   99  0  0 32
                    0 99  0  0
                    0  0 99  0
                    0  0  0 32
                    0  0  0  0
                    0  0  0  0
                    0  0  0  0]
Z!c      % Convert from sparse to full, and then to char. Character 0 is
         % displayed as space
         % STACK: ['a   '
                   ' a  '
                   '  a '
                   'b  a'
                   ' b  '
                   '    '
                   'c   '
                   ' c  '
                   '  c '
                   '    '
                   '    '
                   '    '
                   '    ']
Z{       % Split into cell array, with each row in a cell
         % STACK: {'a   ', ' a  ', '  a ', 'b  a', ' b  ', '    ', 'c   ', ' c  ', '  c ', '   ', '   ', '   ', '   '}
Zv       % Deblank: remove trailing space from each string. Implicitly display,
         % each string on a different line. Empty strings do not generate
         % a newline
         % STACK: {'a   ', ' a', '  a', 'b  a', ' b', '', 'c', ' c', '  c', '', '', '', ''}

4

JavaScript(ES6),118 109 84字节

将输入作为单词数组。返回字符数组。

s=>s.map((w,y)=>[...w].map((c,x)=>(a[p=y*3+x]=a[p]||Array(x).fill(' '))[x]=c),a=[])&&a

替代版本,109字节

返回一个字符串。


2

Common Lisp的,673个 668 597字节

糟糕的解决方案,我知道。睡一会后,我可能会编辑更多内容。

(defun f(&rest z)(let((l)(a 0)(s)(o)(b)(c 0))(loop(setf b(length l))(setf l"")(loop for w in z for i from 0 do(if(>(+(length w)(* i 3))c)(setf c(+(length w)(* i 3))))(setf s(+(* i -3)a))(when(and(>= s 0)(< s(length w)))(setf o(format nil"~v@{~a~:*~}"s" "))(if(and(>=(- s 3)0)(not(equal i(-(length z)1))))(setf o(subseq o(- s 2))))(setf l(concatenate'string o(string(char w s))l)))(when(>= s(length w))(setf l(concatenate'string"   "l))))(if(<=(length l)b)(setf l(concatenate'string(format nil"~v@{~a~:*~}"(- b(length l)-1)" ")l)))(print(string-right-trim" "l))(if(>= b c)(return))(setf a(1+ a)))))

用法:

* (f "ppcg" "is" "pretty" "ok")

"p" 
" p" 
"  c" 
"i  g" 
" s" 
"" 
"p" 
" r" 
"  e" 
"o  t" 
" k  t" 
"     y" 
""
NIL

这将遍历提供的列表中的每个单词,并将适当的字符添加到当前行。我低于标准的用法提供了适当的填充format

注意:我是Common Lisp的新手,但我足够了解这可以带来很多改进。


2
> :(“ ppcg ... ok” !?
破坏的柠檬

2

C#,336个字节:

打高尔夫球:

string D(string[]s){int x=0,y=0,r=0,q=2*(s.Max().Length+s.Length)+1;var a=new char[q, q];for(int i=0;i<s.Length;i++){y=r;for(int j=0;j<s[i].Length;j++){a[y,x]=s[i][j];x+=1;y+=1;}x=0;r+=3;}var o="";for(x=0;x<q;x++){var t="";for(y=0;y<q;y++)t+=a[x,y];o+=t==string.Join("",Enumerable.Repeat('\0',q))?"":(t.TrimEnd('\0')+"\r\n");}return o;}

取消高尔夫:

public string D(string[] s)
{
  int x = 0, y = 0, r = 0, q = 2 * (s.Max().Length + s.Length) + 1;
  var a = new char[q, q];
  for (int i = 0; i < s.Length; i++)
  {
    y = r;
    for (int j = 0; j < s[i].Length; j++)
    {
      a[y, x] = s[i][j];
      x += 1;
      y += 1;
    }
    x = 0;
    r +=3;
  }
  var o = "";
  for (x = 0; x < q; x++)
  {
    var t = "";
    for (y = 0; y < q; y++)
      t += a[x, y];
    o += t == string.Join("", Enumerable.Repeat('\0', q)) ? "" : (t.TrimEnd('\0') + "\r\n");
  }
  return o;
}

测试:

  var codeGolf = new DrawDiagonalLinesOfText();
  Console.WriteLine(codeGolf.E(new string[] { "programming", "puzzles", "and", "code", "golf" }));
  Console.WriteLine(codeGolf.E(new string[] { "a", "bcd", "efgh", "i", "j" }));
  Console.WriteLine(codeGolf.E(new string[] { "verylongword", "short" }));

p
 r
  o
p  g
 u  r
  z  a
a  z  m
 n  l  m
  d  e  i
c     s  n
 o        g
  d
g  e
 o
  l
   f


a
b
 c
  d
e
 f
  g
i  h
j


v
 e
  r
s  y
 h  l
  o  o
   r  n
    t  g
        w
         o
          r
           d

这似乎是在行尾输出尾随空白,这是挑战规范所不允许的。同样,不允许使用空格字符串分隔输入数组中的单词也是不允许的输入格式。
门把手

@Doorknob糟糕,抱歉...已修复,仅花费了我2个字节:)
Pete Arden

1
编译为a Func<string[], string>并进行297字节的各种其他更改,s=>{int i=0,x=0,y=0,r=0,l=s.Length,q=2*(s.Max().Length+l)+1,j;var a=new char[q,q];for(;i<l;i++){y=r;for(j=0;j<s[i].Length;)a[y++,x++]=s[i][j++];x=0;r+=3;}var o="";for(;x<q;x++){var t="";for(y=0;y<q;)t+=a[x,y++];o+=t==string.Join("",Enumerable.Repeat('\0',q))?"":(t.TrimEnd('\0')+"\n");}return o;};但是您需要为using System.Linq;
TheLethalCoder

@TheLethalCoder谢谢,但我真的不想接受您的整个解决方案:)
Pete Arden

这不是我的你我只是golfed一些东西拿出即移动thwe ij顶部为int申报和移动一些++,使他们都在最后使用的变量使用
TheLethalCoder

2

Python 2,146字节

s=input()
k=max(map(len,s))
a=[k*[' ']for x in range(k+len(s)*3+3)]
for x in range(len(s)):
 for y in range(len(s[x])):a[x*3+y][y]=s[x][y]
print a

注意:最后两行的缩进是<space><tab>,这节省了一个字节,因为我不需要双缩进。

输入将作为字符串数组输入,例如:["hello", "world"]['hello', 'world']。输出是一个字符数组。

可能有更好的方法来执行此操作...

编辑感谢Doorknob指出缺少的方括号。我将其放在*k...第三行中。


第三行代码中存在语法错误;有两个方括号,但只有一个方括号。但是,我修复了该问题(通过添加一个额外的关闭括号或删除了额外的打开括号),程序在运行时给出错误。
门把手

现在,这似乎在行尾和输出末尾输出尾随空格,这是质询规范所不允许的。
门把手


@LeakyNun谢谢。您只是在浏览并回答我所有的答案吗?:P
HyperNeutrino

1

Mathematica,146个字节

P=PadRight;T=Transpose;R=Riffle;Select[Rest@T@P@MapIndexed[""~Table~#2~Join~#1&,T@P@R[Characters/@#~R~{},{},3]]//.{0->"",{x__,""}->{x}},#!={""}&]&

我对这个字节数感到失望,但是哦。

定义一个匿名函数,该函数接受一个单词列表(例如{"this","that","these"})并返回二维字符数组。要以网格形式查看,请//Grid在末尾添加一个。

将字符串转换为数组,添加额外的行,转置数组,添加必要的移位,然后再次转置。

结果示例(格式为网格): 结果示例


1

果冻,24 字节

z⁶j€⁾  µJ’⁶ẋ;"z⁶œr€⁶Yœr⁷

在线尝试!

怎么样?

z⁶j€⁾  µJ’⁶ẋ;"z⁶œr€⁶Yœr⁷ - Main link: a list of strings
z                        - transpose with filler...
 ⁶                       -     space character
  j€                     - join €ach with
    ⁾                    -     two spaces
       µ                 - monadic chain separation, call the result x
        J                - range(length(x)) [1,2,...,x]
         ’               - decrement (vectorises) [0,1,...x-1]
           ẋ             - repeat (vectorises)
          ⁶              - a space ['', ' ',...,'x spaces']
             "           - zip with
            ;            - concatenation (prefixes with the space strings)
              z          - transpose with filler...
               ⁶         -     space character
                œr€⁶     - trim spaces from the right of €ach
                    Y    - join with line feeds
                     œr⁷ - trim line feeds from the right
                         - implicit print

1

Python 2,182字节

def f(s):
 M=max(map(len,s));p=' '*M;L=[p]+s+M*[p];r='';k=0
 while k/M<len(s)*3+M:
  i=k%M;w=k/M-i+1;r+=(L[(w/3+1)*(w%3==1)]+p)[i];k+=1
  if i==M-1:r=r.rstrip()+'\n'
 return r.strip()

有点长,但在积极的一面,它返回的字符串在每行上都没有尾随空格,也没有尾随空格或在结尾处返回;其他条目不遵守的约束。

单词列表被传递到函数中;一些“空白”被添加到该列表中,然后该算法将行,列对映射到扩展列表中的wordNumber,characterNumber。(这与其他解决方案中常见的策略相反)。

如果我们允许除最后一行以外的所有行尾都有空白,我们可以做得更好(163字节):

def f(s):
 M=max(map(len,s));p=' '*M;L=[p]+s+M*[p];r='';k=0
 while k/M<len(s)*3+M:i=k%M;w=k/M-i+1;r+=(L[(w/3+1)*(w%3==1)]+p)[i]+'\n'*(i==M-1);k+=1
 return r.strip()

1

q / kdb +,130 109 94 90 86 84字节

解:

f:{-1(+)a rtrim(til(#)E){raze(x#" "),y,\:"  "}'E:(+)(a:{(max(#:)each x)$x})" "vs x;}

例子:

q)f "programming puzzles and code golf"
p          
 r         
  o        
p  g       
 u  r      
  z  a     
a  z  m    
 n  l  m   
  d  e  i  
c     s  n 
 o        g
  d        
g  e       
 o         
  l        
   f 
q)f "a bcd efgh i j"
a   


b   
 c  
  d 
e   
 f  
  g 
i  h


j  
q)f (),"x"
x
q)f "verylongword short"
v           
 e          
  r         
s  y        
 h  l       
  o  o      
   r  n     
    t  g    
        w   
         o  
          r 
           d

说明(无胶体):

基本要点是从输入字符串中创建一堆等长的字符串,翻转(旋转)它们,然后添加适当的空格以得到如下所示的内容:

"p  p  a  c  g   "
" r  u  n  o  o  "
"  o  z  d  d  l "
"   g  z     e  f"
"    r  l        "
"     a  e       "
"      m  s      "
"       m        "
"        i       "
"         n      "
"          g     "

再次翻转,并打印到标准输出。

这是该概念的逐行细分:

A:"programming puzzles and code golf"; // original input
B:" " vs A;                            // split on " "
C:max count each B;                    // find length of the longest string
D:C$B;                                 // pad each string to this length
E:flip D;                              // flip (rotate) string
F:{raze(x#" "),y,\:"  "};              // appends each char with "  " and prepends an increasing number of " "
G:(til count E)F'E;                    // execute function F with each pair of 0..n and item in list E
H:max count each rtrim G;              // find longest string (ignoring right whitespace)
I:H$G;                                 // pad each of the strings to this length
J:flip I;                              // flip to get result
-1 J;                                  // print to stdout, swallow return value

笔记:

如果我们真的想删除一些(11)个简单字节的几种方法:

  • 通过删除f:和保留为匿名函数可以节省2个字节
  • 可以通过丢弃保存3个字节-1;并返回一个字符串列表,而不是打印到stdout
  • 如果我们传入一个字符串列表而不是空格分隔的字符串,则可以节省6个字节

编辑:

  • -11个字节,用于rtrim查找要填充的最大长度,删除了存储C变量的需要
  • -15个字节,切换出一次创建并使用两次max count each的lambda函数a
  • -4字节,将raze移入lambda函数以保存raze each
  • -4个字节,简化了添加空格的核心lambda函数
  • -2字节,(+)用作速记flip

1

木炭16 9 字节

WS«P↘ιM³↓

我的第一个木炭答案。感谢@DLosc的建议而不是使用and (跳转)返回到行的开头(向下三个)。

在线尝试(详细)在线尝试(纯)

说明:

在仍有下一个输入字符串时循环:

While(InputString()){ ... }
WS« ...

打印此字符串,而无需在右下方移动光标:

Multiprint(:DownRight, i);
P↘ι

然后向下移动三个位置以进行下一次迭代:

Move(3, :Down);
M³↓

当挑战需要由数组组成的单个输入时,炭笔会失败,因为它将每个字符串作为单独的输入来拆分输入字符串。但是在Charcoal中,θ变量代表第一个输入,因此我只将测试输入分配给标题中的该变量,然后编写其余代码,因此您可以摆脱α变量并遍历的拆分项θ在线尝试!(由于前导空格而导致不竞争。)
查理(Charlie

至少,当我在这里使用该技巧时,没有人抱怨。:-)
查理

@CarlosAlejo当我在寻找现有木炭答案的灵感时,确实遇到了您的答案。:)
Kevin Cruijssen

IDK,我通常使用的方法只是字符串+空字符串(如果有的话是多行),然后输入为python数组
ASCII码,仅ASCII

@CarlosAlejo已经有一段时间了,但是我现在只用了多行,用空行来打断那一会儿(同时打了7个字节)。看到它被用在Neil的答案之一中,我现在看到仅ASCII的建议是同一件事(以某种方式错过了该注释)。
凯文·克鲁伊森

1

Japt -Rx17 16 13字节

将输入作为单词数组。如果允许每行尾随空白,则可以删除最后四个字符以与木炭解决方案配合使用。

yÈmú3)iYçÃmx1

尝试运行所有测试用例


说明

y                 :Transpose
 È                :Map each word at 0-based index Y
  m               :  Map each character
   ú3             :    Right pad with spaces to length 3
     )            :  End mapping
      i           :  Prepend
       Yç         :   Space repeated Y times
         Ã        :End mapping and transpose
          m       :Map
           x1     :  Trim right
                  :Implicitly join with newlines, trim and output

1

K4,58个字节

解:

+(|/{0+/|\|~^x}@'x)$x:(2-(!c)+3*#x)$"  "/:'$+(c:|/#:'x)$x:

例子:

q)k)+(|/{0+/|\|~^x}@'x)$x:(2-(!c)+3*#x)$"  "/:'$+(c:|/#:'x)$x:("programming";"puzzles";"and";"code";"golf")
"p          "
" r         "
"  o        "
"p  g       "
" u  r      "
"  z  a     "
"a  z  m    "
" n  l  m   "
"  d  e  i  "
"c     s  n "
" o        g"
"  d        "
"g  e       "
" o         "
"  l        "
"   f       "
q)k)+(|/{0+/|\|~^x}@'x)$x:(2-(!c)+3*#x)$"  "/:'$+(c:|/#:'x)$x:(,"a";"bcd";"efgh";,"i";,"j")
"a   "
"    "
"    "
"b   "
" c  "
"  d "
"e   "
" f  "
"  g "
"i  h"
"    "
"    "
"j   "
q)k)+(|/{0+/|\|~^x}@'x)$x:(2-(!c)+3*#x)$"  "/:'$+(c:|/#:'x)$x:("verylongword";"short")
"v           "
" e          "
"  r         "
"s  y        "
" h  l       "
"  o  o      "
"   r  n     "
"    t  g    "
"        w   "
"         o  "
"          r "
"           d"

说明:

右垫弦的长度相同,转置,与结合" ",左垫产生对角线,然后右垫串校正长度并向后移回。获取字符串列表并返回字符串列表。大概可以打高尔夫球,但仍然比我的q / kdb +解决方案短。

+(|/{0+/|\|~^x}@'x)$x:(2-(!c)+3*#x)$"  "/:'$+(c:|/#:'x)$x:
                                                        x:      / save as variable x
                                                       $        / pad
                                             (        )         / do this together
                                                  #:'x          / count (#:) each (') x
                                                |/              / max
                                              c:                / save as variable c
                                            +                   / flip / transpose
                                           $                    / string ($)
                                    "  "/:'                     / join each with "  "
                                   $                            / pad
                      (           )                             / do this together
                                #x                              / count (#) x
                              3*                                / multiply by 3
                             +                                  / add to
                         (  )                                   / do this together
                          !c                                    / range 0..c
                       2-                                       / subtract from 2
                    x:                                          / save as x:
                   $                                            / pad
 (                )                                             / do all this together
    {         }@'x                                              / apply (@) lambda {} to each x
            ^x                                                  / null (^) x (" " is considered null)
           ~                                                    / not
          |                                                     / reverse
        |\                                                      / max (|) scan (\), maxs
     0+/                                                        / sum (+) over (/) starting with 0
  |/                                                            / max (|) over (/), max
+                                                               / transpose

0

Perl 6,73个字节

{my@t;for .kv ->\i,\w{for w.comb.kv {@t[3*i+$^a][$^a]=$^b}};@t »||»" "}

在线尝试!

输入参数是单词列表。输出是字符数组。


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.