打高尔夫球


24

弦如何扭曲

扭曲算法非常简单。每列均按其索引向下移动(col 0下移0,col 1下移1,...)。列移位换行到顶部。它是这样的:

aaaa
bbbb
cccc

成为:

a
ba
cba
----
 cba
  cb
   c

线下的所有内容都环绕到顶部。真实的例子:

Original:
\\\\\\\\\\\\
............
............
............

Twisted:
\...\...\...
.\...\...\..
..\...\...\.
...\...\...\

输入项

输入可以是字符串数组,也可以是多行字符串。所有行的长度相同。

输出量

扭曲的字符串,多行输出到标准输出(或最接近的替代项)。

例子:

>表示输入,尾随空格很重要)

>Hello, world!
>I am another 
>string to be 
>twisted!     

Hwrmoe oo br!
Ieii ,dttr e 
s lsna !ohl  
ttaltgnw  ed 


>\\\\\\\\\\\\
>............
>............
>............

\...\...\...
.\...\...\..
..\...\...\.
...\...\...\


>abcdefg
>.......

a.c.e.g
.b.d.f.


>abcdefghij
>..........
>..........

a..d..g..j
.b..e..h..
..c..f..i.


>\\\\.....././
>...../.......
>........././.
>..../.^\\....

\.........../
.\....^..../.
..\../.\../..
...\/...\/...

>cdeab
>deabc
>eabcd
>abcde

cbbbb
ddccc
eeedd
aaaae


>aeimquy37
>bfjnrvz48
>cgkosw159
>dhlptx260

ahknqx147
beloru258
cfipsvy69
dgjmtwz30


>abcdefghi
>jklmnopqr
>stuvwxyz1
>234567890

a3ume7yqi
jb4vnf8zr
skc5wog91
2tld6xph0

12
最好不要为此内置Mathematica。
Mama Fun Roll

1
我们可以假设输入仅包含ASCII吗?还是仅可打印的ASCII +换行符或其他内容?
Martin Ender

是的,只有ASCII和换行符(除非您将输入作为数组)。
J阿特金

Answers:


3

Brachylog,5个字节

iᵇ↻₎ᵐ

在线尝试!

以列数组形​​式获取输入(这似乎在问题的规范之内)。

iᵇ-对于数组中的每个元素,将其与它的索引(从0开始)配对
-将谓词映射到结果的每个元素:
↻₎-循环(列)以指定为最后一个元素(索引)的数量循环

轻松扩展到接受单个多行字符串的版本:

13字节

ṇẹ\iᵇ↻₎ᵐ\cᵐ~ṇ

在线尝试!


这是惊人的信息压缩。
J Atkin

7

珀斯,11岁

jC.>R~hZC.z

在这里尝试

jC.>R~hZC.z    ##  implicit: .z = list of input split by lines
        C.z    ##  transpose .z to get columns
  .>R~hZ       ##  shift each column by it's index
               ##  equivalent to .e.>bk
jC             ##  transpose back and join by newlines

7

APL(Dyalog),7个字节

⊖⊖⊖⍨⍬⍋⍉

需要 ⎕io←0

在线尝试!

⍬⍋⍉获得从0到
反转的列数的范围
⊖⊖⍨⍬⍋⍉垂直反转(垂直)反转(垂直)的输入(通过0,1..
反转),然后返回。


6

视网膜111 101 92 87个字节

字节数假定为ISO 8859-1编码。

(?<=((.))*)(?=(?<1>.*¶)*.*(?<=(?=(?<-2>.)*(.))(?<-1>.+¶)*.*(.(?<=^(?<-1>¶?.+)*))*)).
$3

哇,用一个正则表达式替换就解决了。:)(机会是,使用多个解决方案会更短一些,但是有趣之处在哪里……)

在线尝试!

说明

这需要平衡组的一些基本知识。简而言之,.NET的正则表达式使您可以使用一个组捕获多次,并将所有捕获推入堆栈。也可以从中弹出该堆栈,这使我们可以将其用于计数正则表达式中的内容。

(?<=((.))*)

这会将一个捕获同时推入两组12比赛前每个字符(在当前行中)。即,它计算比赛的水平位置。

其余的在先行:

(?=(?<1>.*¶)*.* [...] )

我们每行匹配,并且将其推到组1,使得组1是现在的水平和垂直位置(其中后者被计数的总和从底部)。这实际上从左下角开始以递增的值标记网格的对角线。这.*则只是发动机的光标移动到字符串的结尾。

现在,我们切换到一个向后看,在.NET中从右到左匹配:

(?<= [...] (.(?<=^(?<-1>¶?.+)*))*)

这将重复弹出H从组中精确捕获的内容1H输入的高度)。这样做的目的是使组取模H。之后,组1包含从当前列开始选择新字符的行(从底部开始计数)。

(?=(?<-2>.)*(.))(?<-1>.+¶)*.*

再次往后看,再次从右边开始。(?<-1>.+¶)*.+现在使用group 1查找要从中选择新字符的行,然后使用group使用前行查找正确的列2

所需字符被分组3并通过替换写回。


嗯,阅读Retina的资料很清楚:) $+看起来很有用……尤其是如果您只想进行一次替换:^)
FryAmTheEggman '16

@FryAmTheEggman $+实际上是无用的...它在MSDN上的描述听起来比它有用得多,因为它暗示(a)|(b)-> $+$+将所有as和bs 加倍,但它删除所有as,因为它仅指语法上的最后一组。这意味着如果您太懒(就像我以前一样),这只是避免计算所有组的一种方法。对于打高尔夫球,只有在有9个以上的组时才保存字节,一开始可能很少见。
Martin Ender

不幸的是...也许视网膜可以具有一个新的替换组类型,该类型将返回最后一个非空匹配组?无论如何,谢谢您的解释!:)
FryAmTheEggman'2

@FryAmTheEggman它将(这是我Regex.Replace为Retina 重写时想到的事情之一,但是我还没有实现它)。
Martin Ender

4

CJam,13个字节

qN/zee::m>zN*

在这里测试。

说明

q    e# Read all input.
N/   e# Split into lines.
z    e# Transpose to get an array of columns.
ee   e# Enumerate, pairing each column with its index.
::m> e# Map: fold: rotate (cyclically shifting each column by its index).
z    e# Transpose again.
N*   e# Join with linefeeds.

2
您几乎可以发音该源代码。
mınxomaτ

4

TeaScript,10个字节

xHl@C(r╢tD

得益于TeaScript 3极其简洁的语法,这确实很短:D

如果Sigma循环不是越野车,则将短1字节

在线尝试

说明

      // Implicit, x = input
xH    // Transpose input
l@    // Loop
 C(r╢   // Cycle column by index
        // `╢` exits loop
t    // Transpose
D    // Join on \n

3

Python 3,164字节

从长远来看,这不是最好的答案,而是Python的第一个答案...

s=list(zip(*open(0).readlines()))[:-1]
r=[[s[i][(j-i)%len(s[i])] for j in range(len(s[i]))] for i in range(len(s))]
print('\n'.join([''.join(l) for l in zip(*r)]))

1
您可以通过)]''.join(l)for l in....
减去

3

MATLAB,92 36字节

s=bsxfun(@circshift,s,0:size(s,2)-1)

假设输入字符串s已经是2D char数组/矩阵的形式,例如

s = ['abcdefg';'.......'];
s = ['\\\\.....././';'...../.......';'........././.';'..../.^\\....'];

说明:遍历矩阵的各列。对于每一列,通过等于列索引的字符数对元素进行循环移位(由于MATLAB索引,-1)。


2

Brachylog,96位元组

$\:0{h_.|[M:I]hh:I{bh0,?h.|[C:I]h$)D,I-1=:Dr:2&.}C,I+1=J,Mb:J:1&:[C]rc.}$\{hA,[A]:"~s
"w,?b:3&;}

这期望将字符代码字符串列表作为输入而没有输出,例如 brachylog_main([`aaaa`,`bbbb`,`cccc`],_).

这是一个荒谬的冗长答案,而且可能有一种更短的解​​决方法。

说明

§ Main Predicate

$\:0{}$\{}                            § Create a list containing the transposed input and 0
                                      § Call sub-predicate 1 with this list as input
                                      § Transpose its output and pass it as input to
                                      § sub-predicate 3


§ Sub-predicate 1

h_.                                   § If the matrix is empty, output is empty list
   |                                  § Else
    [M:I]hh:I{}C,                     § Input is [M,I], call sub-predicate 2 with the first
                                      § line of M and I as input. Its output is C.
                 I+1=J,Mb:J:1&        § Call sub-predicate 1 with M minus the first line
                                      § and I+1 as input
                              :[C]rc. § Its output is appended after C, which is then
                                      § unified with the output of sub-predicate 1.


§ Sub-predicate 2

bh0,?h.                               § If the second element of the input list is 0,
                                      § output is the first element of the input
       |                              § Else
        [C:I]                         § Input is [C,I]
             h$)D,                    § Perform a circular permutation of C from left to
                                      § right (e.g. [a,b,c] => [c,a,b]) and unify it with D
                  I-1=:Dr:2&.         § Call sub-predicate 2 with D and I-1 as input, unify
                                      § its output with sub-predicate 2's output


§ Sub-predicate 3

hA,[A]:"~s\n"w,                       § Write the first line of the input as a char codes
                                      § string followed by a new line

               ?b:3&;                 § Call sub-predicate 3 with input minus the first
                                      § line. If it fails (empty input), terminate

2

JavaScript,92 89字节

感谢@Neil关闭3个字节。

s=>(z=s.split`
`).map((m,i)=>m.replace(/./g,(n,j)=>z[((l=z.length)*j+i-j)%l][j])).join`
`


您可以使用replace以下命令节省3个字节m.replace(/./g,(n,j)=>z[((l=z.length)*j+i-j)%l][j])
尼尔

1
确实,[...m].map(一直到第一个都包括在内.join
尼尔

2

Python 2,115字节

lambda s:'\n'.join("".join(s)for s in zip(*[k[-i%len(k):]+k[:-i%len(k)]for i,k in enumerate(zip(*s.split('\n')))]))

多亏了zip设法将这一点降至一行的奇迹。看到它在这里行动。


2

MATL,18 21字节

Zy2):"G@Z)@qYS]N$h

输入形式为

['Hello, world!'; 'I am another '; 'string to be '; 'twisted!']

在线尝试!

运作方式

Zy       % implicitly take input: 2D char array. Get its size
2)       % second element from size vector: number of columns, say n
:        % create vector [1,2,...,n]
"        % for each element k in that vector
  G      %   push input
  @      %   push k
  Z)     %   k-th column from input
  @qYS   %   circularly shift k-1 positions
]        % end for loop
N$h      % concatenate all stack contents horizontally
         % implicitly display

1

F#,105个字节

我第一次刺中它(只\n需要一个字符):

let m x y=(x%y+y)%y
let f(a:string[])=Array.mapi(fun i x->String.mapi(fun j _->a.[m(i-j)a.Length].[j])x)a

用法:

f [| @"\\\\\\\\\\\\"
     "............"
     "............"
     "............" |]

我认为我以前在PPCG上没有看过F#。
J Atkin

1

JavaScript(ES6),73个字节

t=>t.replace(/./g,(_,i)=>t[(i+s*l-i%l*l)%s],l=t.search`
`+1,s=t.length+1)

说明

t=>
  t.replace(/./g,(_,i)=> // replace each character at index i
    t[                   // get the character at index:
      (i                 // start at i
        +s*l             // add s*l to ensure the result is always positive for %s
        -i%l*l           // move the index upwards the num of chars from start of the line
      )%s                // shift the index into the the range of s
    ],
    l=t.search`
`+1,                     // l = line length
    s=t.length+1         // s = input grid length (+1 for the missing newline at the end)
  )

测试


1

Japt,29个字节

Uy £XsV=(Y*Xl -Y %Xl)+X¯V}R y

在线测试!

怎么运行的

Uy        // Transpose rows and columns in the input string.
£     }R  // Map each item X and index Y in the result, split at newlines, to:
Y*Xl -Y   //  Take Y times X.length and subtract Y.
%Xl)      //  Modulate the result by X.length.
XsV=      //  Set V to the result of this, and slice off the first V chars of X.
+X¯V      //  Concatenate this with the first V chars of X.
y         // Transpose the result again.
          // Implicit: output last expression

1

Haskell,81个字节

let t=transpose in t.snd.mapAccumR(\c l -> 1+c,take(length l)(drop c$cycle l))0.t

重新实现CJam示例,尽管反向,映射和枚举是mapAccumR的一部分,但snd删除了累加器,因为我们不再需要它,反向只是正确折叠的副作用。


1

Haskell,65个字节

g l@("":_)=l;g l|t<-tail<$>l=zipWith(:)(head<$>l)$g$last t:init t

用法示例:g ["1111","2222","3333"]-> ["1321","2132","3213"]


1

MATL,9个字节

"@X@qYS&h

在线尝试!

核心与Luis Mendo的现有MATL答案非常相似,但通过使用那时可能不支持该语言的功能来缩短:1. "现在自动自动遍历矩阵的列,因此,无需构造列索引并将它们建立索引的昂贵业务(这是个大问题); 2。&h作为简化的说法N$h; 3。如果]未指定,则隐式循环结束。

或者,对于相同的字节数:

tsn:ql&YS

在MATL Online上尝试

      &YS   % circularly shift the matrix
     l      % across rows (i.e. shift each column) by the amounts
            %  given by this array:
tsn         % duplicate input, get the sum of each column, get the 
            %  number of elements in that (which is the number of columns)
   :q       % construct range 1 to ncols, then decrement to start at 0
            % (implicit output)

0

C(clang),114个字节

在MinGW的GCC中工作。strlen在第一个for循环的init表达式中使用TIO的GCC感到困惑。

f(L,n)char**L;{for(int l=strlen(*L),i=0,j,c;i<n;i++)for(j=c=0;j<=l;j++,c=c?c-1:n-1)putchar(l^j?L[(c+i)%n][j]:10);}

在线尝试!

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.