以ASCII编织


12

想象一下,一个矩形的|字符网格代表织机(经线)上的绷紧线,其他线(纬线)(我们将其表示为-)可以被编织。

这是7×4织机的不织布经线:

|||||||
|||||||
|||||||
|||||||

纬纱有多种编织方法,最简单的是平纹编织

在平织的第一行中,纬纱从第一个经线开始,然后在第二根线之下,然后在第三根线之上,然后在第四根线之下,依此类推。

第二纬线与第一纬线相同,但向右偏移一个经线,因此它从下面开始,然后翻过来,依此类推。

在我们的7×4织机上,平纹组织如下所示:

-|-|-|-
|-|-|-|
-|-|-|-
|-|-|-|

我们可以说,纬越过经描述平纹1时,然后在1点时,后续的每一行移位1串的右端。

可以通过使纬纱经过经纬v次,然后经过u次,随后的每一行向右移动s串来描述广义的编织。(所有值都是整数,s可以为0或负数,uv必须为非负数。)

v = 1u = 2s = 2的7×4织布机,一种斜纹编织

-||-||-
||-||-|
|-||-||
-||-||-

挑战

您的任务是编写最短的程序(以字节为单位),该程序在给定vus,织机的宽度和高度以及初始偏移的情况下产生条形和虚线的编织图案。

所述初始位移是串在纬纱中的第一行被向右移动(0在上面的例子)的数量。随后的每一行将移动s个以上的字符串。

您的程序应以易于使用的格式(标准输入,函数调用等)接受这6个数字,并将条形和矩形的编织网格输出到标准输出。您可以假设所有输入均有效。(所有值都是整数,宽度和高度必须为正,初始移位可以为任意值。)

例子

宽度= 5,高度= 4,初始位移= 0,v = 1,u = 3,s = -2:

-|||-
||-||
-|||-
||-||

宽度= 5,高度= 4,初始位移= 3,v = 1,u = 3,s = -2:

|||-|
|-|||
|||-|
|-|||

宽度= 5,高度= 4,初始位移= 1,v = 1,u = 1,s = 0:

|-|-|
|-|-|
|-|-|
|-|-|

宽度= 5,高度= 4,初始位移= 0,v = 1,u = 0,s = 0:

-----
-----
-----
-----

笔记

  • 图案总是从网格左上角的经纱上的纬线开始(除非最初已移动)。
  • 所有的纬纱都从左侧进来。他们不会这样盘旋。
  • u + v不一定是网格宽度的倍数。
  • uv可能都不都是0

Answers:


5

Ruby,72个字节

w,h,v,u,s,i=$*.map &:to_i;h.times{puts ((?-*v+?|*u)*w)[-i%(u+v),w];i+=s}

关于这个,没有太多要说的。我对-和建立一个重复|,重复w一次(请确保),然后我为每一行切出适当的部分。


当u + v == 1时,w次足够了吗?
edc65 2014年

@ edc65是的,因为%(u+v)。在这种情况下,我只会从index开始0,因此w字符串中还剩下字符。
Martin Ender 2014年

3

JavaScript(ES 6)128

F=(w,h,i,v,u,s)=>{for(x=('-'[R='repeat'](v)+'|'[R](u))[R](w*h),l=v+u,i=-i%l+l,s=-s%l+l;h--;i+=s)console.log(x.substr(i,w)+'\n')}

测试

F(11,8,2,5,3,-2)

||-----|||-
-----|||---
---|||-----
-|||-----||
||-----|||-
-----|||---
---|||-----
-|||-----||

2

Python,92个字节

w,h,i,v,u,s=eval(A)
x=('|'*u+'-'*v)*w
while h:print(x[-i:]+x[:-i])[-w:];x=x[-s:]+x[:-s];h-=1

嗯...现在很想学红宝石。

通过分配以下格式的字符串变量来输入:“宽度,高度,初始位移,v,u,s”。
在程序之前粘贴:

A="80,80,0,2,2,-9"

1
我相信应该while h。我要多排。
加尔文的爱好2014年

1
您应该使用任何输入格式系统-将输入值用逗号分隔,并进行评估。
isaacg 2014年

1

JavaScript(ES6),111个字节

使用功能Array.from的ES6方法略有不同。

f接受参数(w,h,i,v,u,s)并返回一个字符串。\n为了清楚起见,在代码中添加了换行符并以字符串形式替换了文字换行符;均未反映在字节数中。

f=(w,h,i,v,u,s)=>(A=Array).from(A(h),(_,j)=>A.from(A(w),
(_,k)=>(j*((x=v+u)-s)+x+k-i)%x<v?'-':'|').join``).join`\n`

用法

console.log(f(5,4,0,1,3,-2)) /*

-|||-
||-||
-|||-
||-||

*/

带说明的非高尔夫版本

我通过为Array创建别名来保存一些字节,该别名未反映在未发布的版本中。

// take input and create an array of length h (height):
f = (w,h,i,v,u,s) => Array.from( Array(h),

    // in each row position j, create an array of length w (width):
    (_,j) => Array.from( Array(w), 

        // in each cell, place - or | depending on the pattern (i,v,u,s)
        // and current position (j,k):
        (_,k) => ( j * ( ( x = v + u ) - s ) + x + k - i ) % x < v ? '-' : '|'

    // turn each row into a string:
    ).join``

// join rows with newlines:
).join`\n`

0

C,357字节

#include<stdio.h>
int w,h,t,v,u,s,i,j,l,f;int main(){scanf("%d %d %d %d %d %d",&w,&h,&t,&v,&u,&s);l=v+u;char g[l];g[l]='\0';f=0;while(u--){g[v+u]='|';}while(v--){g[v]='-';}for(i=0;i<h;i++){for(j=0;j<w;j++){printf("%c",g[abs(t+f+j)%l]);}printf("\n");f-=s;}}

“它看起来比它舒适。” “一定是。” -Gia和Eidon(没人会得到这个参考。提示:“ Weave Mat”)

因此,我已经对此进行了大约五个小时的研究,然后我放弃了。我不知道如何使此代码正常工作。它在第一行之后一直向后移动,然后完全出错(7 4 0 2 2 1)。

这是您可以更轻松阅读的简单版本。我要做的就是检索输入,制作模板数组,然后在循环中打印。

#include<stdio.h>
int w,h,t,v,u,s,i,j,l,f;
int main(){
    scanf("%d %d %d %d %d %d",&w,&h,&t,&v,&u,&s);
    l=v+u;char g[l];g[l]='\0';f=0;
    while(u--){g[v+u]='|';}while(v--){g[v]='-';}
    for(i=0;i<h;i++){
        for(j=0;j<w;j++){
            printf("%c",g[abs(t+f+j)%l]); // THIS is the line that needs help.
        }
        printf("\n");
        f-=s;
    }
}

您可以在此处轻松进行测试:http : //www.compileonline.com/compile_c_online.php,使用底部的STDIN输入框中的“ 7 4 0 1 1 1”。开始编辑数字,您会发现问题。

抱歉,我无法提出可行的解决方案;我为此讨厌自己。我花了太多时间不上传它来修复其他人。

我已经使用此printf一段时间,以将顶行(简单)与其余行(问题行)进一步分开: printf("%c",g[i?abs(t+f+j)%l:abs(t+j)%l]);


for(i=0;i++<h;)?第二个for循环有相同的技巧吗?但是,每个循环仅节省一个字符。
2014年

我确实尝试了几次,但这使数字减少了,我找不到使用它们的方法。
尼斯2014年

奇怪。还有其他方法吗?++i?不过,这只是黑暗中的一枪。
2014年

不; 在将数字甚至用于比较之前,它就会增加,并且最终会进行h-1次迭代。在for循环声明的第二部分中完全使用++的问题是,在您甚至在循环中使用它之前,i都会递增。处理off-number可能需要在数学中的某个位置加上-1,这使快捷方式不值得。除非没有-1,否则这是可行的。我仍然不知道。
尼斯2014年

当然!脸庞
2014年

0

Haskell,126个字节

f w h i v u s=putStr.unlines$take h$take w<$>(iterate(drop(mod s(u+v)))$drop(mod(-i)(u+v)).cycle$('-'<$[1..v])++('|'<$[1..u]))

1
一个平凡的高尔夫将是变化f w h i v u s(w?h)i v u s。固定功能
H.PWiz
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.