IHIH金字塔


34

我发现字母“ H”和“ I”非常相似很着迷。“ H”是由两个垂直笔划包围的水平笔划;“ I”是一个垂直笔画,周围有两个水平笔画(取决于您的字体)。我敢打赌,这可能是嵌套的...你知道让我想起什么吗?分形!!!

让我们定义“ IHIH”金字塔如下:第一个迭代是字母“ I”的ASCII表示形式:

---
 |
---

下一次迭代的任一侧都有一个垂直笔触。

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

如果将中间的“ I”视为单个水平笔划,则第二个迭代基本上就是“ H”。第三次迭代在顶部和底部添加了水平笔划

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

同样,如果将中间的“ H”视为单个垂直笔划,则此迭代基本上就是“ I”。这种模式继续,在每次迭代中在“ H”和“ I”之间交替。供参考,这里是前6个迭代:

1:
---
 |
---

2:
|   |
|---|
| | |
|---|
|   |

3:
-------
 |   |
 |---|
 | | |
 |---|
 |   |
-------

4:
|       |
|-------|
| |   | |
| |---| |
| | | | |
| |---| |
| |   | |
|-------|
|       |

5:
-----------
 |       |
 |-------|
 | |   | |
 | |---| |
 | | | | |
 | |---| |
 | |   | |
 |-------|
 |       |
-----------

6:
|           |
|-----------|
| |       | |
| |-------| |
| | |   | | |
| | |---| | |
| | | | | | |
| | |---| | |
| | |   | | |
| |-------| |
| |       | |
|-----------|
|           |

挑战:

编写一个程序或函数,输出IHIH金字塔的第N个迭代以及一个可选的尾随换行符。您的输入将是您想要的任何合理格式的单个正整数。您不必处理无效的输入,例如非整数,小于1的数字等。您的程序至少必须为最多20个输入产生正确的输出。由于这是,因此不允许出现标准漏洞以字节为单位的最短答案将获胜!


如果我每行返回一个箭头的字符串箭头可以接受吗?
Rohan Jhunjhunwala

尚未完全符合挑战标准,但偶然发生了一些很酷的事情... 在线尝试!
魔术章鱼缸

Answers:


7

腐霉菌50 40 31 25字节

j @ su,J + * \-K + 2lheN + jR * 2; eN * \-KjR“ ||” + * dK + J * dKQ]] ||
LXR“ |-”)CbjyW%Q2uy + K * \-+ 2lhG + jR * 2; GKQ] \ | 
juCGQuC + K * @“-|” H + 3yH + jR * 2; GKQ \ |
j @ CBujR * @“-|” H2CjR * 2; GQ \ |

测试套件。

说明

这是一种递归算法。

在每次迭代中,我们执行三个动作:

  1. 在每行前面加上一个空格
  2. 转置数组
  3. "-""|"根据迭代次数在每行前面添加和追加。

迭代之后,奇数输出将被转置。因此,我们对它们进行转置。

j@CBujR*@"-|"H2CjR*2;GQ\|   input: Q
j@CBujR*@"-|"H2CjR*2;GQ\|Q  implicit filling of arguments


    u                 Q\|   for Q times, starting with "|", G as current output,
                            H as number of iterations:

                jR*2;G          prepend and append a space to each line
                                (using each line as separator, join [" "," "])
               C                transpose
     jR*      2                 prepend and append the following to each line:
        @"-|"H                      the H-th element of the string "-|" (modular indexing)

 @CB                     Q  select the Q-th element from [output,
                            transposed output] (modular indexing)
j                           join by newlines

我喜欢这种交流想法。
泰特斯

12

Python中,165 145 133 123字节

递归解决方案:

def i(e):
 d="|";a=e*2;x=d+" "*(a-1)+d
 if e<1:return d
 if e%2:d,x=[" ","-"*(a+1)]
 return[x]+[d+z+d for z in i(e-1)]+[x]

print ("\n".join(i(int(sys.argv[1])))),其中参数是IHIH金字塔的迭代号。

感谢@DJMcMayhem节省了20个字节。这些建议背后的想法进一步节省了12个字节。感谢@Maltysen提供的建议,该建议减少了更多字节。

该函数将定界符设置d"|",将中间空格设置为" "(对于奇数迭代),在简并情况下处理返回,然后将定界符重置为" "并将中间空格重置"-"为偶数迭代。该函数为IHIH的每一行返回一个字符串列表,并将对该函数的递归调用结果嵌入到列表中的正确位置。


2
很好的答案,欢迎光临本站!您不需要连接线,可以使用字符串列表。一些提示:将第2和3 if e<1:return'|'行更改为(在它们之间没有换行符),然后删除“ else”并删除多余的缩进。
DJMcMayhem

1
您可以在之后取出空间return。另外,您可以将不带ifs 的行与分号合并,并保存缩进
Maltysen '16

1
我已经编辑了您的答案。如果您不喜欢我的修改,请随时恢复。
Leaky Nun

10

切达干酪186个 177 165 154 148 131字节

(n,b?,c?,q?,g=s->(n-=1)<0?s:g((q=(c=s.lines[0].len)%4>2?b='|'+" "*c+"|":b='-'*(c+2))+"\n"+s.sub(/^|$/gm,q?'|':' ')+"\n"+b))->g("|")

使用递归。打完高尔夫球将添加说明。

在线尝试!

说明

这也有点复杂,因此请不要跟踪我正在使用的所有变量,但我将尝试使其保持简单:

(
 n,    // Input
 b?,   // Stores row to add to top/bottom
 c?,   // Width of string 
 q?,   // false if I-ifying. true if not
 g=
   s->          // Main logic, s is generated string
    (n-=1)<0 ? s :   // Decrease input each iteration. Stop when 0
    g(               // Recurse with....
      (
        q= (         // Set `q` true if h-ifying. false if I-ifying
         c=s.lines[0].len    // Set `c` to width of string
        ) % 4>2 ?
        b='|'+" "*c+"|" :    // Set `b` to top/bottom row adding
        b='-'*(c+2)          // `*` is repeat, c is from before
      ) + "\n" + 
        s.sub(/^|$/gm,       // Add the following to beginning/end of each line
          q?'|':' '          // if H-ifying, add `|`s if I-ifying add spaces
        ) + "\n" + b         // Add bottom row, generated from before
    )
) -> g("|")     // Middle item is `|`

这给高尔夫运动带来了痛苦,但是它比原来的短了55个字节。


8

Python 2,93个字节

Leaky Nun保存了7个字节。

r=range(input()+1)
r=r[:0:-1]+r
for y in r:print''.join('| -'[[x%2,y%2+1][x&-2<y]]for x in r)

闭门表格:o:o
Leaky Nun

嗯,当然:起初我需要,int(x/2.)因为我正在服用,range(-n,n+1)但现在我可以使用它们了。谢谢!
林恩

我在标头中指定了Python 2,因为简单地说“ Python”通常意味着代码可以在Python 2或Python 3下工作,在这里不是这种情况。
Mego

7

Matricks80 62字节

迭代解决方案(在Matricks中进行递归很难...)

与运行 python matricks.py ihih.txt [[]] <input> --asciiprint

k124; FiQ%2:v; b [m124:Q * 2 + 3:1;]; a {z:Q * 2 + 1;} ;: b; v [m45:1:Q * 2 + 3;] ; u {zQ * 2 + 1:;} ;;:1:n ;;
k124; FiQ%2:v; b [m124:Q * 2 + 3:2;]; B1;:b; v [m45:2:Q * 2 + 3;]; V1 ;; :: 1:n ;;

说明:

k124;                 # Set the matrix to '|'
F...:1:n;;            # Repeat input times, (Q is iteration variable)
  iQ%2:...:...;       # if statement, check if Q is odd or even
                      # Q is even,
    b;                # Make space to the left
    v[m45:2:Q*2+3;];  # Set the top 2 rows to '-'s
    V1;               # Rotate the matrix up 1 unit, moving the topmost row to the bottom
                      # Q is odd,
    v;                # Make space above
    b[m124:Q*2+3:2;]; # Set the 2 left columns to '|'s
    B1;               # Rotate the matrix left 1 unit, moving the leftmost row to the right

1
哇,迭代!我印象深刻
科纳·奥布莱恩

@ ConorO'Brien Matricks是为动态矩阵调整大小而构建的,因此效果不佳,但还是要感谢!
2016年

5

JavaScript(ES6),92个 90字节

f=
(n,[h,c,v]=n&1?`-- `:` ||`)=>n?(c+=h.repeat(n+n-1)+c)+`
${f(n-1).replace(/^|$/gm,v)}
`+c:v
;
<input type=number min=0 oninput=o.textContent=f(+this.value)><pre id=o>

递归解决方案的工作方式是进行上一次迭代,将v字符添加到侧面,然后将c字符添加到角和h沿顶部和底部的字符。字符集简单地交替了每个迭代。编辑:通过返回v时,保存2个字节n=0


4

Dyalog APL52 43 字节

{v=⊃⍵:h⍪⍨hs,⍵,sv,⍨v,s⍪⍵⍪s}⍣⎕⍪⊃v h s'|- '

v h s←'|- '受让人的三个字符三个名字(v ertical,ħ orizo​​ntal,š步伐)

第一个,即 |

制成1×1桌子

{... }⍣⎕获得输入并多次应用支撑函数

v=⊃⍵: 如果参数的左上角字符是竖线,则:

  h⍪⍨ 水平线以下

  h⍪ 水平上方

  s, 左边的空格

  ⍵,s 右边带有空格的参数

其他:

  v,⍨ 垂直于

  v, 垂直于左侧

  s⍪ 上方的空格

  ⍵⍪s 下面带有空格的参数

在线尝试APL!



3

C,110字节

#define R(A,B,C)for(A=n,B=1;A<=n;putchar(C),A-=B|=-!A)
f(n,y,x,w,v){R(y,w,10)R(x,v,"| -"[x/2*2<y?y%2+1:x%2]);}

调用为f(n)。对于111个字节,我可以这样做:

f(n,y,x,w,v){for(y=n,w=1;y<=n;y-=w|=-!y,puts(""))for(x=n,v=1;x<=n;x-=v|=-!x)putchar("| -"[x/2*2<y?y%2+1:x%2]);}

即,仅#define保存一个字节。


3

Dyalog APL,34个字节

{⍉⍣⍵{b,b,⍨⍉s,⍵,⊃s b←' -|'~⊃⍵}⍣⍵⍪'|'}

{... }⍣⍵⍪'|'以大括号时间应用功能,从1x1字符矩阵开始|。每个应用程序的结果是下一个应用程序的参数。

s b←' -|'~⊃⍵s是空格,b是不在参数左上角的' -|'~'-'条形(删除水平条形并留下空格和垂直条形)

s,⍵,⊃s b在左右增加空间(从向量sb中选择s)

b,b,⍨⍉ 转置并将b添加到左侧和右侧

对于奇数,这会使结果转置,因此需要最终转置。

⍉⍣⍵转置时间(一次就足够,但是用这种方式编码的时间更短)

TryAPL在线


欢迎来到PPCG!
斯蒂芬

谢谢!现在尝试加入聚会,解决这些问题很有趣:)
Gil Gil


2

Cheddar,85个字节

(n,r=(-n|>n).map(v->abs v))->r.map(y->r.map(x->"| -"[(x&-2)<y?y%2+1:x%2]).fuse).vfuse

我的第一个Cheddar回答。在线尝试!

如果我尝试编写r=(-n|>n).map(v->abs v).map,然后r(y->r(x->…))解释器崩溃。;-;


您可以v->abs v(abs)(例如r.map((abs)))将返回具有ABS功能的行为的功能。例如(+)(1,2)-> 3(^)(2,6)->64。同样让我大吃一惊的是,我的出场率几乎提高了50%
Downgoat

不,我尝试过:(大概是Runtime Error: `abs` has no behavior for types `Number` and `Number` 因为同时map接收了元素和它的索引。)
Lynn

啊://我今天要修复这个错误> _>
Downgoat '16

2

APL(Dyalog Classic),34个字节

'- |'[2+∘.(≤-(1+=)×2|⌈)⍨(⌽,0,⊢)⍳⎕]

在线尝试!

(使用⎕io←1

⍳⎕1 2 ... N

(⌽,0,⊢) 是将它变成 -N ... -1 0 1 ... N

∘.( )⍨ 对每对坐标执行括号 ⍺ ⍵

火车(≤-(1+=)×2|⌈)或其dfn等价物{(⍺≤⍵)-(1+⍺=⍵)×2|⍺⌈⍵}产生一个矩阵,如:

 ¯1 ¯1 ¯1 ¯1 ¯1 ¯1 ¯1 ¯1 ¯1 ¯1 ¯1
  0  1  0  0  0  0  0  0  0  1  0
  0  1 ¯1 ¯1 ¯1 ¯1 ¯1 ¯1 ¯1  1  0
  0  1  0  1  0  0  0  1  0  1  0
  0  1  0  1 ¯1 ¯1 ¯1  1  0  1  0
  0  1  0  1  0  1  0  1  0  1  0
  0  1  0  1 ¯1 ¯1 ¯1  1  0  1  0
  0  1  0  1  0  0  0  1  0  1  0
  0  1 ¯1 ¯1 ¯1 ¯1 ¯1 ¯1 ¯1  1  0
  0  1  0  0  0  0  0  0  0  1  0
 ¯1 ¯1 ¯1 ¯1 ¯1 ¯1 ¯1 ¯1 ¯1 ¯1 ¯1

'- |'[2+ ]使这些有效索引进入⎕IO=1并选择相应的字符


1

Ruby,81 78 77字节

这是基于Lynn的Python答案。欢迎打高尔夫球。

编辑: 3字节感谢林恩。乔丹更正和打高尔夫球1字节。

->n{r=(-n..n).map &:abs;r.map{|y|puts r.map{|x|"| -"[x&-2<y ?y%2+1:x%2]}*""}}

开球:

def f(n)
  r = -n..n            # Range from -n to n (inclusive)
  r = r.map{|i|i.abs}  # Turns every element of r positive
  r.each do |y|
    s = ""             # a line of the fractal
    r.each do |x|      # build up the fractal based on x and y
      if x/2*2 < y
        s += " -"[y%2]
      else
        s += "| "[x%2]
      end
    end
    puts s             # print the line
  end
end

可以.map(&:abs)
林恩

@琳恩发现。还有其他建议吗?
Sherlock16年

首先*是什么也没做。您可以使用*""代替.join。另外,在p每行周围都用引号引起来(它会调用inspect其参数),这可能会使您失去资格。
约旦

另外,您可以删除&:absmap &:abs)周围的括号。您也许可以使用s Array#product代替嵌套的maps,但是这样做会使换行变得棘手。
约旦

@Jordan您的前四个提示有效,但是r.product(r).map(但是有效)更长,并且似乎不太容易换行。
Sherlock16年

1

MATLAB 168 163字节

这可能不是最聪明的方法:分n步在所有面上扩展字符串:

function s=g(n);s='|';for m=1:n;if mod(m,2);a=45;b=a;c=0;else a='|';b=0;c=a;end;s=[a repmat(b,1,2*m-1);repmat(c,2*m-1,1) s];s(:,end+1)=s(:,1);s(end+1,:)=s(1,:);end

用法:另存为g.m(是否必须将其添加到字节数中?)并调用例如g(15)

取消高尔夫:

function s=g(n)

% // Initialize s
s = '|';

for m=1:n
   % // Decide if odd or even number and which symbol to add where
   if mod(m,2)
      a=45;b=a;c=0; % // char(45) is '-' and char(0) is ' ' (thx to Luis Mendo)
   else
      a='|';b=0;c=a;
   end
      % // Add symbols at top and left to s
      s = [a repmat(b,1,2*m-1);repmat(c,2*m-1,1) s];
      % // Add symbols at right and bottom to s
      s(:,end+1) = s(:,1);
      s(end+1,:) = s(1,:);
end

您可以替换' '通过0(Matlab的将CHAR 0作为空间)和'-' 通过45。文件名不必包含在字节数中
Luis Mendo

1

事实上48 45 44字节

这是尝试将我的Ruby答案移植到实际上。这太长了,打高尔夫球的建议很受赞赏。在线尝试!

u;±ux♂A╗╜`╝╜";2@%2╛%u╛(2±&<I'-' '|++E"£MΣ.`M

这是一个46字节的版本,它将嵌套函数分开,以便我们可以"| -"用更少的字节进行定义。在线尝试!

u;±ux♂A╗╜`;2@%2╛%u╛(2±&<I"| -"E`#"╝╜%r£MΣ."%£M

开球:

第一种算法

u         Increment implicit input.
;±u       Duplicate, negate, increment. Stack: [-n n+1]
x♂A       Range [-n, n+1). Abs(x) over the range.
╗         Save list to register 0. Let's call it res.
╜         Push res so we can iterate over it.
  `         Start function (with y from map() at the end)
  ╝         Save y to register 1.
  ╜         Push res so we can iterate over it.
    "         Start function as string (with x from map() at the end)
    ;         Duplicate x.
    2@%       x mod 2.
    2╛%u      y mod 2 + 1.
    ╛(2±&<I   If x&-2 < y, then y%2+1, else x%2.
    '-' '|++  Push "| -" (We're inside a string right now,
                          so we need to push each char individually)
    E         Grab index of "| -"
    "£        End string and turn into function.
  M         Map over res.
  Σ.        sum() (into a string) and print.
  `         End function.
M         Map over res.

第二算法

u;±ux♂A╗╜                  Create res as before.
`;2@%2╛%u╛(2±&<I"| -"E`#   The inner function from the first algorithm put into a list.
                             The only change to the function is the definition of "| -".
"╝╜  £MΣ."                 Most of the outer function from the first algorithm as a string.
   %r      %               %-formats the list into the outer function.
            £M             Turns the string into a function, maps over res.

u;±ux♂A╗╜`;2@%2╛%u╛(2±&<I"| -"E`#"╝╜%r£Mεj."%£M比目前的长度(2字节)长,但是您可能会发现一些使我看不到的长度更短的方法的灵感。
Mego

1

画布19 18 17 14 字节

|╶[ e↷l|*e}╶[↷

在这里尝试!

如果允许我将所有其他输出旋转90°,则可以删除最后4个字符。

说明(某些字符已更改为看起来〜等距):

|               push "|" - the canvas
 ╶[       }     repeat input times
    e             encase the canvas in spaces horizontally
     ↷            rotate the canvas 90°
      l|*         push "-" repeated the canvas height times vertically
         e        and encase the canvas if two of those horizontally
           ╶[   repeat input times
             ↷    rotate the canvas 90°

如果他们也放松了限制,我会丢失6个字节:P。
魔术章鱼缸

@MagicOctopusUrn wellp,请为我准备-5个字节:p(您的答案也可以从转置循环中受益吗?)
dzaima,

我的实现一个转置循环:D。
魔术章鱼缸

1

05AB1E29 28字节

„|-S¹>∍ƶćsvy‚˜.Bζ}¹Fζ}»R.∞.∊

在线尝试!

-1感谢Dzaima ...

这是一个迭代的解决方案。


本质上,这是通过创建以下模式来实现的:

['|','--','|||',...]

然后,成对地将每个元素转置在一起并添加填充。

通过在每次迭代之后进行转置,我们最终创建了模式的一个角。

然后,我们可以使用05AB1E的反射命令。


„|-S                         # Push ['|','-']
    ¹>∍                      # Extended to input length.
       ƶ                     # Each element multiplied by its index.
        ćs                   # Extract head of list, swap remainder to top.
          v      }           # For each element in the '|-' list...
           y‚˜               # Wrap current 2D array with new entry, flatten.
              .Bζ            # Pad and transpose, leaving it transposed for the next addition.
                 }           # End loop.
                  ¹Fζ}       # Transpose N times.
                      »R     # Bring it all together into a newline string, reverse.
                        .∞.∊ # Mirror horizontally, then vertically with overlap.

0

数学,158个 164字节

f[n_]:=Print/@StringJoin/@Map[{{{"|","|", },{ , , }},{{"|", ,"-"},{ ,"-","-"}}}[[##]]&@@#&,Table[{1+i~Mod~2, 1+j~Mod~2, 2+Sign[Abs[i]-Abs[j]]}, {i,-n,n}, {j,-n,n}],{2}]

在坐标(i,j)上数学计算正确的符号,其中两个坐标都从-n到n。人工格式:

f[n_]:=Print/@
 StringJoin/@
  Map[
   {{{"|","|", },{ , , }},{{"|", ,"-"},{ ,"-","-"}}[[##]]&@@#&,
   Table[{1+i~Mod~2,1+j~Mod~2,2+Sign[Abs[i]-Abs[j]]},{i,-n,n},{j,-n,n}],
   {2}]

@Adám感谢您提供指向该线程的指针!
格雷格·马丁

0

PHP,166字节

我的第一种方法打了100多个字节,这仍然是最长的答案。

function i($n){for($m=['|'];$k++<$n;){array_unshift($m,$m[]=str_repeat(' -'[$f=$k&1],2*$k-1));foreach($m as$i=>&$r)$r=($c='||- '[2*$f+($i&&$i<2*$k)]).$r.$c;}return$m;}

分解

function h($n)
{
    for($m=['|'];$k++<$n;)
    {
        array_unshift($m,$m[]=str_repeat(' -'[$f=$k&1],2*$k-1));
        foreach($m as$i=>&$r)
            $r=($c='||- '[2*$f+($i&&$i<2*$k)]).$r.$c;
    }
    return$m;
}

不打高尔夫球

function ihih($n)
{
    $m=['|'];                   // iteration 0
    for($k=1;$k<=$n;$k++)       // loop $k from 1 to $n
    {
        $f=$k&1;                        // flag for odd iterations
        // add lines:
        $r=str_repeat(' -'[$f],2*$k-1); // new line: ' ' for even, '-' for odd iterations
        $m[]=$r;                                // append
        array_unshift($m,$r);                   // prepend
        // add columns:
        foreach($m as$i=>&$r)           // for each line
        {
            $c='| '[$f];                        // '|' for even, ' ' for odd iterations
            if($f && (!$i || $i==2*$k)) $c='-'; // '-' in corners for odd iterations
            $r=$c.$r.$c;                        // prepend and append character
        }
    }
    return $m;
}

0

Perl 5,150个字节

sub h{my$i=pop;my$c=$i%2?$":'|';return(map{"$c$_$c"}h($i-1)),$i%2?'-'x($i*2+1):$c.$"x($i*2-1).$c if$i;()}say for reverse(@q=h<>),$q[0]=~s/---/ | /r,@q

在线尝试!


0

Haskell,110字节

f 0=["|"]
f n|odd n=g ' '!n$'-'|1>0=g '|'$id!n$' '
g c=map$(c:).(++[c])
(g!n)c|p<-g.f$n-1=(:p)<>pure$c<$head p

在线尝试!

解释/取消

helper函数g需要一个字符和一个字符串列表,然后在该字符之前和附加到每个字符串:

g c = map (\s-> [c] ++ s ++ [c])

接下来,操作员(!)将使用函数(g),数字(n)和字符(c)。然后n-1,它计算的输出,对其应用功能g,并c在开头和结尾处添加由s 组成的相同宽度的字符串:

(g ! n) c | prev <- g $ f (n-1), ln <- [c | _ <- head p]
          = [ln] ++ prev ++ [ln]

有了这些,我们准备递归地生成输出,首先我们需要介绍一下基本情况:

f 0 = ["|"]

然后递归:

-- for odd n: the previous output needs a space at the end and beginning and then a string of '-' characters at the top and bottom
f n | odd n     = (g ' ' ! n) '-'
-- for even n: the previous output needs a line of spaces at the top and bottom and then each line needs to be enclosed with '|' characters
    | otherwise = g '|' $ (id ! n ) ' '


0

Stax,22 个字节

âeò↕\┐▄┤╚╬8φ8Δ☺Pä≤δ₧߃

运行并调试

拆开包装,松开包装并进行评论,看起来像这样。

'|          string literal "|"
{           begin block to repeat
  . |G      push " |", then jump to trailing `}` below 
  '-z2lG    push ["-",[]], then jump to trailing `}` below again
}N          repeat block according to number specified in input
m           output each row in grid

}           goto target - `G` from above jumps to here
  i@        modularly index into pair using iteration index
  ~         push to input stack
  {;|Sm     surround each row with the extracted element
  M         transpose grid

运行这个

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.