编写一个平方程序,输出已被“展开”的次数


22

对于一个大于1的奇数整数N,考虑一个正方形的文本块,N个字符,宽N个字符。

例如,让N = 5,文本为:

MLKJI
NWVUH
OXYTG
PQRSF
ABCDE

请注意,这是从左下角逆时针旋转的字母(Z以外)。有点像卷起的地毯。

螺旋字母

将文本“展开”顺时针旋转四分之一圈,因此FGHI与以下ABCDE结果处于同一水平:

     PONM
     QXWL
     RYVK
     STUJ
ABCDEFGHI

展开操作可以再进行7次,直到文本变为一行:

         SRQP
         TYXO
         UVWN
ABCDEFGHIJKLM

             UTS
             VYR
             WXQ
ABCDEFGHIJKLMNOP

                WVU
                XYT
ABCDEFGHIJKLMNOPQRS

                   XW
                   YV
ABCDEFGHIJKLMNOPQRSTU

                     YX
ABCDEFGHIJKLMNOPQRSTUVW

                       Y
ABCDEFGHIJKLMNOPQRSTUVWX

ABCDEFGHIJKLMNOPQRSTUVWXY

挑战

面临的挑战是编写一个N×N文本块的程序,该程序在重新排列为展开模式并运行时输出其“展开”四分之一圈的次数。

这里确实有两个比赛:(希望不会太凌乱)

  1. 用最小的N进行此操作(下降到N = 3的限制)
  2. 用最大N来执行此操作(无限制)

不会有一个可接受的答案,但是这些类别中的每个类别的获胜者都会收到我的至少50笔赏金。如果是平局,则最早的答案将获胜。

如果您的代码块是

MyP
rog
ram

按原样运行它应输出0。

跑步

   rM
   oy
ramgP

应该输出1。

跑步

     or
ramgPyM

应该输出2。

跑步

       o
ramgPyMr

应该输出3。

最后,运行ramgPyMro应该输出4。

细节

  • 输出应自行打印到标准输出(或最接近的替代输出)。没有输入。
  • 您只能在代码中使用可打印的ASCII(十六进制代码20至7E,包括空格)。
  • 在展开布置中,空间填充了空白空间。(除非您向左展开。)
  • 只有从完全正方形到完全平坦的布置才需要有效输出。没有其他安排。
  • 您可能没有阅读自己的资源。
  • 您可以使用注释。
  • N = 1被排除在外,因为该程序0可以在许多语言中运行。
  • 如果需要,您可以向左展开而不是向右展开。所以例如

    MyP
    rog
    ram
    

    变成

    Pg
    yo
    Mrram
    

    等等。以这种方式滚动时,不会添加额外的空格。线刚结束

(相关:编写一个矩形程序,输出该程序旋转的次数


在阅读“挑战”段落之前,我期待编写一个输出展开状态的程序的挑战
John Dvorak

1
为什么N必须是奇数?
约翰·德沃夏克

1
@JanDvorak我想N不必是奇数,但是它使螺旋线更加标准化。它保持这种方式,但是如果您发现N = 2,则可以发表评论。
卡尔文的爱好2014年

8
只是一个想法:向右展开“地毯”会创建许多以空格开头的行,从而消除了Python之类的语言。如果您允许向左展开,则不需要其他空格,并且(理论上)Python是可行的。
法尔科2014年

5
您有一本具有无限伟大挑战思想的魔术书吗?您还如何继续面对如此有趣的挑战?
贾斯汀

Answers:


27

Golfscript,N <-[5,7 ..]

.   .
 . . 
 ..  
.  .#
],9\-

完全展开:

],9\-#  .   .  .  . . ...

说明:

  • . (多次)-复制输入
  • ] -将堆栈收集到单个阵列中
  • , -取其长度
  • 9\- -从9中减去
  • # -行注释

空格是一个NOP,但任何其他NOP也会同样有效。

完全汇总后,它将使用输入的九个副本(忽略了内容)作为堆栈。9-9 = 0; 它尚未展开。

每次展开都会在注释后隐藏一个点(重复项),从而使堆栈缩小一次,从而增加输出。

完全展开后,它仅使用输入(忽略内容)作为堆栈。9-1 = 8; 已展开8次。

对于N> 4的情况,相同的方法适用:更改9为2 * N + 1的适当值,然后使用相同的螺旋图案扩展点的图案(重复),以确保在每次展开期间精确地展开一个点。


好吧,除非有人发现N = 3,否则这将是这两个类别的最终答案。
卡尔文的爱好2014年

3
@ Calvin'sHobbies我应该成为一个总的家伙,并发布一个向左展开的解决方案吗?:-)
约翰·德沃夏克

为什么不。否则,另一个答案似乎不太可能:P
卡尔文的爱好2014年

1
为什么不选择一个可以双向展开的东西呢?:)
Beta Decay

@BetaDecay嗯... :-)
约翰·德沃夏克

13

GolfScript,N = 4

这是原厂规格。

.. . 
...# 
.#.~
],8-

以下是展开内容:

    ...
    #..
    ..
],8-~#.

       .#.
       ...
],8-~#. ..

          ..
          .#
],8-~#. ....

            ..
],8-~#. ....#.

              .
],8-~#. ....#..

],8-~#. ....#...

在这里尝试


您如何看待这种安排?
骄傲的haskeller 2014年

3
@proudhaskeller如果您不知道,那就更好了……
Optimizer

8
您是否在寻找解决方案?
骄傲的haskeller 2014年

特殊挑战:您可以从.s和#s中选出一个吗?
约翰·德沃夏克

我喜欢拖尾~。也许我可以在N = 3时偷走它?
约翰·德沃夏克

9

APL,N = 3

201
340
5|0

展开:

   32
   40
5|001

     43
5|00102

       4
5|001023

5|0010234

在线尝试。

它计算该数字的余数除以5。仅打印最后一行的结果。

APL,N = 2

⍬∞
≡0

展开:

  ⍬
≡0∞

≡0∞⍬

在线尝试。

返回数组的深度(不要与尺寸或长度混淆):

  • 0不是数组。因此深度为0。
  • 0∞是具有两项0(无限)的数组。深度为1。
  • 0∞⍬有另一个item ,它是深度为1的空数组。所以0∞⍬深度为2。

这两个程序也可以在在线解释器中使用。我不确定后面的语法是否正确。

⍬0
≡∞


⍬¯
≡0

对于任何N> = 4的APL

对于N = 4:

∞  ∞
 ∞∞
∞ ∞
⍴1↓∞

完全展开:

⍴1↓∞  ∞  ∞ ∞ ∞∞∞

对于N = 5:

∞   ∞
 ∞ ∞
 ∞∞
∞  ∞
⍴1↓ ∞

完全展开:

⍴1↓ ∞   ∞   ∞  ∞  ∞ ∞ ∞∞∞

1↓删除数组中的一个项目。如果参数是标量,它也会返回空数组。获取数组长度。


有什么解释吗?
骄傲的haskeller 2014年

@proudhaskeller编辑。
jimmy23013

理想情况下,您可以对任何N使用相同的深度逻辑。多亏了APL
Optimizer

@Optimizer并不是那么容易。最后一行之前的内容在语法上仍然必须正确。因此,我无法使用大多数功能或其他标点符号,()[]因为它们会出现在不需要的地方。
jimmy23013

我的意思是:`⍬\n⍬⍬0\n≡∞`(不完全是,但您有这个主意)
Optimizer
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.