总而言之,这只是代码高尔夫中的另一个技巧


64

挑战的目的是为摇滚乐队Pink Floyd制作这张专辑的封面的ASCII版本。

砖路口由字母_和字母组成|。砖的宽度为7,高度为2,但不包括路口。因此,包括联结在内的基本单位是:

_________
|       |
|       |
_________

每行积木相对于上一行偏移一半积木宽度(4个字符):

________________________________________
  |       |       |       |       |     
  |       |       |       |       |     
________________________________________
      |       |       |       |       | 
      |       |       |       |       | 
________________________________________
  |       |       |       |       |     
  |       |       |       |       |     

墙的参数设置如下。所有参数均以char度量,包括连接点:

  1. 第一行的水平偏移量F。这是左边缘与最上一行的第一个垂直交点之间的距离。(还要记住行之间的半砖相对偏移)。其可能值01,..., 7
  2. 宽度W。这包括路口。其值为正整数。
  3. 高度H。这包括路口。其值为正整数。

墙的顶部始终与一行的顶部重合。底部可能参差不齐(如果总高度不是的倍数3)。例如,这里的输出64411

____________________________________________
      |       |       |       |       |     
      |       |       |       |       |     
____________________________________________
  |       |       |       |       |       |     
  |       |       |       |       |       |     
____________________________________________
      |       |       |       |       |     
      |       |       |       |       |     
____________________________________________
  |       |       |       |       |       |     

以及参数的直观说明:

          F=6
         ......   
     .   ____________________________________________
     .         |       |       |       |       |    
     .         |       |       |       |       |     
     .   ____________________________________________
     .     |       |       |       |       |       | 
H=11 .     |       |       |       |       |       |      
     .   ____________________________________________
     .         |       |       |       |       |     
     .         |       |       |       |       |     
     .   ____________________________________________
     .     |       |       |       |       |       |      

         ............................................
                             W=44

附加规则

您可以提供程序或功能。

输入格式像往常一样灵活。输出可以通过STDOUT或函数返回的参数进行。在这种情况下,它可能是带有换行符的字符串或字符串数​​组。

允许使用空格或换行符。

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

测试用例

输入按上面给出的顺序进行,即:第一行的水平偏移,总宽度,总高度。

6, 44, 11:
____________________________________________
      |       |       |       |       |     
      |       |       |       |       |     
____________________________________________
  |       |       |       |       |       | 
  |       |       |       |       |       | 
____________________________________________
      |       |       |       |       |     
      |       |       |       |       |     
____________________________________________
  |       |       |       |       |       |     


2, 20, 10:
____________________
  |       |       | 
  |       |       | 
____________________
      |       |     
      |       |     
____________________
  |       |       | 
  |       |       | 
____________________


1, 1, 1:
_


1, 2, 3:
__
 |
 |


3, 80, 21:
________________________________________________________________________________
   |       |       |       |       |       |       |       |       |       |    
   |       |       |       |       |       |       |       |       |       |    
________________________________________________________________________________
       |       |       |       |       |       |       |       |       |       |
       |       |       |       |       |       |       |       |       |       |
________________________________________________________________________________
   |       |       |       |       |       |       |       |       |       |    
   |       |       |       |       |       |       |       |       |       |    
________________________________________________________________________________
       |       |       |       |       |       |       |       |       |       |
       |       |       |       |       |       |       |       |       |       |
________________________________________________________________________________
   |       |       |       |       |       |       |       |       |       |    
   |       |       |       |       |       |       |       |       |       |    
________________________________________________________________________________
       |       |       |       |       |       |       |       |       |       |
       |       |       |       |       |       |       |       |       |       |
________________________________________________________________________________
   |       |       |       |       |       |       |       |       |       |    
   |       |       |       |       |       |       |       |       |       |    

34
您让我在hnq中获得了诱饵
Rohan Jhunjhunwala

2
@RohanJhunjhunwala听起来不错
疯了

4
感谢您匹配歌词中的音节数量...您不会相信会有多少人尝试衍生歌曲并弄错音节,这让我发疯!
克里斯·西里菲斯

1
@ChrisCirefice哈哈,谢谢!冠军头衔是这一挑战的重要组成部分
路易斯·门多

Answers:


17

Pyth,43 27字节

需要打很多球……比分太可耻了。

AQVE<*H?%N3X*8d+G*4/N3\|\_H

已经在线尝试了。

输入格式

6,44
11

输出格式

____________________________________________
      |       |       |       |       |     
      |       |       |       |       |     
____________________________________________
  |       |       |       |       |       | 
  |       |       |       |       |       | 
____________________________________________
      |       |       |       |       |     
      |       |       |       |       |     
____________________________________________
  |       |       |       |       |       | 

说明

AQVE<*H?%N3X*8d+G*4/N3\|\_H   First two inputs as list in Q,
                              third input as E.

AQ                            Assign G to the first item in Q
                              and H to the second item in Q.
  VE                          For N from 0 to E-1:
                   /N3            N floor-div 3.
                                    if N gives a remainder of 3 or 4 or 5
                                    when divided by 6, this will be odd;
                                    otherwise, this will be even.
                 *4               Multiply by 4.
                                    if the above is odd, this will leave
                                    a remainder of 4 when divided by 8;
                                    otherwise, the remainder would be 0.
               +G                 Add G (as an offset).
           X*8d       \|          In the string "        " (*8d),
                                  replace (X) the character with the
                                  index above with "|" (modular indexing,
                                  hence the manipulation above).
       ?%N3             \_        If N%3 is non-zero, use the above;
                                  otherwise, use "_".
     *H                           The above repeated H times.
    <                     H       Take the first H characters of above.
                                  Implicitly print with newline.

看起来像你赢了
wordforthewise

30

C,86 85 83 82字节

感谢Lynn,节省了3个字节。
感谢查理,节省了1个字节。

i;f(o,w,h){++w;for(i=0;++i<w*h;)putchar(i%w?i/w%3?i%w+i/w/3*4+~o&7?32:124:95:10);}

1
for(i=0;++i<w*h;)或是否ifor(;++i<w*h;)
设为

取代i;通过i=1;和保存一个多字节的循环。
xryl669

for(i=1;i<w*h;++i)-> for(i=0;++i<w*h;)保存1
Yay295 '16

@ xryl669无效,函数必须可重用。
orlp

@ Yay295我把它归功于查理,因为他在7个小时前发布了它。
orlp

26

C,92个字节

b(f,w,h,y,x){for(y=0;y<h;y++,puts(""))for(x=0;x<w;x++)putchar(y%3?(x+y/3*4-f)%8?32:124:95);}

调用为b(F, W, H)


3
C中只有92个字节?这是令人难以置信的。
Leaky Nun


13

Perl,63个字节

#!perl -nl
$y+=print+map$y%3?$_++-$`&7?$":'|':_,($y%6&4)x$&for/ \d+/..$'

将shebang计为2,输入取自标准输入,空格分隔。

样品用量

$ echo 2 20 10 | perl bricks.pl
____________________
  |       |       |
  |       |       |
____________________
      |       |
      |       |
____________________
  |       |       |
  |       |       |
____________________

11

Haskell,83个字节

q s="_":[s,s]
(f!w)h=take h$cycle$take w.drop(7-f).cycle<$>q"       |"++q"   |    "

这定义了一个三进制插入函数!,该函数返回字符串列表。用法示例:

*Main> putStrLn $ unlines $ (3!14) 7
______________
   |       |  
   |       |  
______________
       |      
       |      
______________

这个怎么运作:

            q"       |"++q"   |    "  -- build a list of 6 strings
                                      --   1:     "_"
                                      --   2:     "       |"
                                      --   3:     "       |"
                                      --   4:     "_"
                                      --   5:     "   |    "
                                      --   6:     "   |    "
         <$>                          -- for each of the strings
     take w.drop(7-f).cycle           -- repeat infinitely, drop the first 7-f chars
                                      --    and take the next w chars
  cycle                               -- infinitely repeat the resulting list
take h                                -- and take the first h elements

1
这样的答案使我想学习这种语言。
GuitarPicker

3
阅读问题描述时,我想到了Haskell。“无限重复”是一个非常好的功能。
DLosc

10

JavaScript(ES6),96 95字节

g=
(f,w,h)=>[...Array(h)].map((_,i)=>(i%3?`       |`:`_`).repeat(w+7).substr(f^7^i%6&4,w)).join`
`
;
<div onchange=o.textContent=g(f.value,w.value,+h.value)><input id=f type=number min=0 max=7 placeholder=Offset><input id=w type=number min=0 placeholder=Width><input id=h type=number min=0 placeholder=Height></div><pre id=o>

说明:创建一个字符串,该字符串包含重复的7个空格加|pattern或仅重复的_s,但字符串的长度至少足以提取w每行所需的字符。前三行从位置开始,f^7然后接下来的三行从位置开始f^3,因此我可以通过在每个第三行的6位块的最后两行中使用相反的位2 来切换f三行的bit 2来实现此目的字节。


7

MATL,42 36 33字节

:-Q'_ | |'[DClCl]Y"8et4YShwi:3$)!

输入格式为:nColsoffsetnRows

在线尝试

此处的方法是设置一个“模板”,然后使用行索引([1 2 ... nRows])和列索引(由第一个输入([1 2 ... nCols] - shift)移位)索引到其中。由于有了MATL的模块化索引,它会自动产生平铺的输出。作为一个旁注,为了节省空间,从技术上讲,我使用模板的转置版本,然后最后使用转置(!)。

模板是这样的:

________
       |
       |
________
  |     
  |     

1
很好地使用行程编码来生成模式
Luis Mendo

6

Python 2,93 88字节

第二个缩进级别是tab,由于Leaky Nun和一些自己的修改,节省了一些字节,现在也可以纠正偏移量:

def f(F,W,H):
 for h in range(H):print["_"*W,((("|"+7*" ")*W)[8-F+h%6/3*4:])[:W]][h%3>0]

先前的代码:

def f(F,W,H,x="|"+7*" "):
 for h in range(H):
    print ["_"*W,(x[F+4*(h%6>3):]+x*W)[:W]][h%3>0]

与未命名lambda相同的长度:

lambda F,W,H,x="|"+7*" ":"\n".join(["_"*W,(x[F+4*(h%6>3):]+x*W)[:W]][h%3>0]for h in range(H))

F,W,H=input()
Leaky Nun

之后删除空白print
Leaky Nun

使用h/3%2*4h%6/3*4代替4*(h%6>3)
Leaky Nun

您不需要第二个缩进级别。只要把该print声明在同一行for声明
漏尼姑

"| "("|"+7*" ")我计数正确要短
Leaky Nun

6

QBasic中,121个 109字节

(在QB64上测试)

感谢@DLosc IF在数学上等效我的陈述。那值12个字节。

通用方法:

通过每个细胞一次一个循环,并且确定它是否应该是一个_|取决于其位置。 MOD语句和布尔逻辑用于确定砖块边界以及将砖块错开多少。

码:

INPUT F,W,H
FOR y=0TO H-1:FOR x=0TO W-1
?CHR$((y MOD 3>0)*(((x-(y MOD 6>3)*4)MOD 8=F)*92+63)+95);
NEXT:?:NEXT

使用注意事项:

QBasic期望输入是用逗号分隔的数字。


1
使用数学代替IF/ THEN会加上更多的括号,但会节省12个字节:?CHR$((y MOD 3>0)*(((x-(y MOD 6>3)*4)MOD 8=F)*92+63)+95);
DLosc

感谢您的评论。在我的脑海中,我曾考虑过探索数学,但是没有。我在最近的提交中做了类似的事情来给图像着色,但是我使用的实现没有MOD运算符。
GuitarPicker

5

Java中,149147146,143个字节

打高尔夫球:

String f(int o,int w,int h){String s="";for(int y=0,x;y<h;++y){for(x=0;x<w;++x){s+=y%3>0?(x-o+(y-1)/3%2*4)%8==0?'|':' ':'_';}s+='\n';}return s;}

取消高尔夫:

public class AllInAllItsJustUhAnotherTrickInCodeGolf {

  public static void main(String[] args) {
    int offset = 6;
    int width = 44;
    int height = 11;
    System.out.println(new AllInAllItsJustUhAnotherTrickInCodeGolf()
        .f(offset, width, height));
  }

  // Begin golf
  String f(int o, int w, int h) {
    String s = "";
    for (int y = 0, x; y < h; ++y) {
      for (x = 0; x < w; ++x) {
        s += y % 3 > 0 ? (x - o + (y - 1) / 3 % 2 * 4) % 8 == 0 ? '|' : ' ' : '_';
      }
      s += '\n';
    }
    return s;
  }
  // End golf

}

1
也许您可以通过与之比较来切换三元顺序,以> 0节省两个字符。当然,您可以将声明合并为int y=0,x
Frozn

就像Frozn所说的那样,您可以在第一个for循环int 之前删除x并使用int y=0,x,以节省2个字节。另外,当前您可以更改y%3==0y%3<1。(这是不可能的...%8==0,以...&8<1不过,因为你的操作会返回一个负数。)
凯文Cruijssen

做完了。您是正确的,第二个模数可以返回负数,它在调试时是我最初编写此函数时所做的。

1
不知道如何我们错过了这一点,但你可以在你的参数中的空格为-2个字节。或者,使用int...o的参数和改变wo[1]ho[2]oo[0]是-3字节,而不是。
凯文·克鲁伊森

4

红宝石, 72 66个字节

->f,w,h{h.times{|i|puts i%3<1??_*w:((?|+' '*7)*w)[8-f+i%6/4*4,w]}}

感谢@Value Ink 6个字节!

简单的字符串乘法和切片。

在Ruby 2.3.0中工作(Ideone的2.1版引发语法错误)。


2
使用i%6/4*4替代(i%6>3?4:0)和使用?_替代'_'?|而不是'|'
价值墨水

谢谢。我忘记了?单个char技巧,“数学”部分的确令人印象深刻!
Leibrug '16

1
我认为((' '*7+?|)*w)[f^7^i%6&4,w]可以为您节省两个字节。
尼尔

谢谢@尼尔。我将编辑代码...一旦我了解您的建议是如何工作的:)
Leibrug

4

朱莉娅:150个 128 116 108 107字节

# in codegolf.jl
r=repmat;b=r([' '],6,8);b[[1,4],:]='_';b[[2,3,23,24]]='|';b=r(b,h,w)[1:h,o+=1:o+w];b[:,end]=10;print(b'...)

使用参数运行: julia -e 'o=2;h=18;w=40;include("codegolf.jl")'

如果您觉得从bash调用是作弊的,并且想要在解释器中使用函数,则该函数的版本为117字节:)

f(o,h,w)=(r=repmat;b=r([' '],6,8);b[[1,4],:]='_';b[[2,3,23,24]]='|';b=r(b,h,w)[1:h,o+=1:o+w];b[:,end]=10;print(b'...))

演示

(感谢@ glen-o提供额外的字节节省技巧!)


欢迎来到PPCG!很高兴在这里也见到你!
路易斯·门多

注意,应该显式地接受输入,即,对于这三个变量,您需要某种输入语句。或者,您可以使用将它们用作参数并输出或显示结果的函数。完成后,您可能想使用“在线试用”发布在线演示
路易斯·门多


啊。是的,我做到了!:p
Tasos Papastylianou

1
您可以使用repmat代替一个字符(repmat([32],6,8)),然后重命名repmat以剃除另一个字符(g=repmat;b=g([32],6,8)及以后的字符)来保存一些字符b=g(b,h,w)[1:h,o+1:o+w+1]。然后替换reinterpretmap。根据我的计算,您将在这些更改之间节省9个字节。
Glen O

3

JavaScript中,172个 168 165 157 147 142 137字节

(O,W,H)=>{t='_'.repeat(W),x='|       '.repeat(W),f=t+`
`;for(i=0;++i<H;)f+=(!(i%3)?t:(i%6)>3?x.substr(O,W):x.substr(8-O,W))+`
`;return f}

N = (O,W,H)=>{t='_'.repeat(W),x='|       '.repeat(W),f=t+`
`;for(i=0;++i<H;)f+=(!(i%3)?t:(i%6)>3?x.substr(O,W):x.substr(8-O,W))+`
`;return f}

let test_data = [[6,44,11],
                 [2,20,10],
                 [1,1,1],
                 [1,2,3],
                 [3,80,21]];

for (test of test_data)
    console.log(N(...test));


为什么不使用s.repeat(w)代替Array(w).fill(s).join``
尼尔

@Neil:好主意,但是我想到了更好的东西。
Yay295 '16

然后意识到您的解决方案比我想象的要好。谢谢!
Yay295 '16

3

Dyalog APL,29个字节

↑⎕⍴⎕⍴¨a,4⌽¨a←'_',2⍴⊂⌽⎕⌽¯8↑'|'

测试: 6 44 112 20 101 1 11 2 33 80 21

被评估的输入;作为表达从右执行到左,它提示FWH以该顺序

¯8↑'|'' |'

⎕⌽ 旋转,它从前面切碎F字符,并将它们放在字符串的末尾

另一种意思是反向

'_',2⍴⊂ 创建一个三元组“ _”,然后是字符串的两个单独副本

a,4⌽¨a← 附加到目前为止所有内容的4旋转,我们最终得到6元组

⎕⍴¨ 将每个元素调整为宽度

⎕⍴ 重塑到高度

将向量的向量混合成矩阵


2

实际上44个 43 40字节

这实际上是Neil的JS答案中算法的端口。欢迎打高尔夫球。在线尝试!

╗╝r⌠;6(%4&╜7^^╛'|7" "*+*t╛@H╛'_*3(%YI⌡Mi

开球:

          Takes implicit input in the order h, w, f.
╗╝        Save f to register 0. Save w to register 1.
r⌠...⌡M   Map over range [0..h-1]. Call this variable i.
  ;         Duplicate i
  6(%       i%6...
  4&        ...&4
  ╜7^^      ...^i^7. Call it c.
  ╛         Push w.
  '|7" "*+  The string "       |"
  *t╛@H     (("       |" * w)[c:])[:w]
  ╛'_*      Push "_" * w
  3(%       Push 3, move duplicate i to TOS, mod.
  YI        If not i%3, take "_"*w, else (("       |" * w)[c:])[:w]
            Function ends here.
i         Flatten the resulting list and print the bricks implicitly.


1

八度80 76字节

% in file codegolf.m
c(6,8)=0;c([1,4],:)=63;c([2,3,23,24])=92;char(repmat(c+32,h,w)(1:h,o+1:o+w))

从终端运行: octave --eval "o=2;h=18;w=44; codegolf"

(或者,如果您认为终端调用在作弊:p,那么匿名函数实现将占用86个字节:)

c(6,8)=0;c([1,4],:)=63;c([2,3,23,24])=92;f=@(o,h,w)char(repmat(c+32,h,w)(1:h,o+1:o+w))

调用f(2,18,44)八度音阶解释器。


1

击+桑达,411个 395 381 370字节:

F=`printf '_%.s' $(eval echo {1..$2})`;V="       |";(($[($2-$1)/8]>0))&&L=`printf "$V%.s" $(eval echo {1..$[($2-$1)/8]})`||L=;Z=`printf "%$1.s|%s\n" e "$L"`;I=$[($2-(${#Z}-4))/8];(($I>0))&&W=`printf "$V%.s" $(eval echo {1..$I})`||W=;J=${Z:4}$W;for i in `eval echo {1..$[$3/3+1]}`;{ (($[$i%2]<1))&&O+="$F\n$J\n$J\n"||O+="$F\n$Z\n$Z\n";};echo "`echo -e "$O"|sed -n 1,$3p`"

好吧,这是我用Bash或任何与此相关的shell脚本语言的第一个答案。这也是到目前为止最长的答案。接受格式为的一系列空格分隔的命令行参数Offset Width Height。这可能比当前的时间短很多,因此,对此打高尔夫球的任何技巧和/或技巧都应多加赞赏。


1

的Delphi / Object Pascal中,305302,292个字节

读取3个参数的完整控制台程序。

uses SySutils,Math;var i,q,o,w,h:byte;begin o:=StrToInt(paramstr(1));w:=StrToInt(paramstr(2));h:=StrToInt(paramstr(3));for q:=0to h-1do begin for i:=1to w do if q mod 3=0then Write('_')else if IfThen(Odd(q div 3),((i+o)mod 8),((i-o)mod 8))=1then Write('|')else Write(' ');Writeln('');end end.

不打高尔夫球

uses
  SySutils,
  Math;
var
  i,q,o,w,h:byte;
begin
  o:=StrToInt(paramstr(1));
  w:=StrToInt(paramstr(2));
  h:=StrToInt(paramstr(3));

  for q := 0 to h-1 do
  begin
    for i := 1 to w do
      if q mod 3 = 0  then
        Write('_')
      else
        if IfThen(Odd(q div 3),((i+o)mod 8),((i-o)mod 8)) = 1 then
          Write('|')
        else Write(' ');
    Writeln('');
  end
end.

可悲的是,Delphi没有三元运算符,它是一种冗长的语言。

测试用例

D:\Test\CodeGolfWall\Win32\Debug>Project1.exe 2 20 10
____________________
  |       |       |
  |       |       |
____________________
      |       |
      |       |
____________________
  |       |       |
  |       |       |
____________________

D:\Test\CodeGolfWall\Win32\Debug>Project1.exe 6 44 11
____________________________________________
      |       |       |       |       |
      |       |       |       |       |
____________________________________________
  |       |       |       |       |       |
  |       |       |       |       |       |
____________________________________________
      |       |       |       |       |
      |       |       |       |       |
____________________________________________
  |       |       |       |       |       |

编辑:通过使用字节作为所有变量的类型,可以剃除3个字节。

编辑2:并且控制台应用程序不需要程序声明,-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.