图和地面


32

图和地面
资料来源:维基百科

对于这个挑战,您应该编写两个程序,它们类似于上述图像的图形和背景,以便其中一个可以打印figure,而另一个可以打印ground。特别:

  1. 编写一个无需输入并打印字符串的程序figure。程序中唯一允许的空格字符是空格(代码点0x20)和换行符(回车,0x0D,换行符,0x0A或两者的组合)。
  2. 忽略换行符,空格字符(代码点0x20)和非空格字符的数量必须相同。例如,这将是有效的程序(使用假设的语言):

    ab c 
       d
    e f
    

    请注意,第一行上有一个尾随空格。

  3. 如果将第n个空格字符与第n个非空白字符交换,则应打印程序ground。对于上面的示例,程序将如下所示:

      a b
    cde 
     f 
    

    请注意在第二和第三行上有尾随空格。

无论是人物地面的解决方案应该是在打印到标准输出相同的语言充分的程序。在任何一种情况下,您都可以打印一个可选的尾随换行符。只要STDOUT是正确的,您就可以向STDERR输出任何您想要的东西。

您可以使用任何编程语言,但是请注意,默认情况下,这些漏洞是禁止的。

这是,因此以字节为单位的最短有效答案为准。

辅助脚本

您可以使用此CJam脚本图形地面程序之间进行转换。只需将两者之一粘贴到“ 输入”字段中并运行程序。它还将告诉您空格和非空格的数量是否不匹配。

排行榜

Answers:


20

果冻,20 字节

数字

“¦ĠȮ“©ụd» Ṃ         

九个尾随空格。在线尝试!

地面

         “ ¦ĠȮ“©ụd»Ṃ

没有尾随空格。在线尝试!

怎么运行的

首先,请注意空格不是原子,因此字符串文字之外的空格字符不会以任何方式影响程序。

字符串文字使用Jelly内置的基于字典的字符串压缩来生成所需的单词。压缩的字符串文字以开头,以结束»,并在内部用于创建字符串数组。

图形程序中,“¦ĠȮ“©ụd»产生字符串对(“ figure”,“ ground”),并且原子选择词典最小的量,即“ figure”

在地面程序中,改为“ ¦ĠȮ“©ụd»产生字符串对(“ logicalAbacs”,“ ground”)。现在,字典上的最小值是“ ground”,它是尽职选择的。

在这两种情况下,解释器都会自动将最后的返回值(即所选的最小值)打印到STDOUT。


14

Python 2,53个字节

·在两个答案中都用空格代替:

····················
print'······figureground'[6:12]#

印刷品figure

print'figureground'[
······6:12]#····················

印刷品ground


14

05AB1E15 14字节

数字

 'ŠÂ,'í¶      

在线尝试!

地面

'       ŠÂ,'í¶

在线尝试!

使用CP-1252编码。注意尾随空格。在Figure程序中,它是没有错误的普通程序。它解压缩以下单词:

'ŠÂ  ->  figure
'í¶  ->  ground

逗号会弹出并figure用换行符打印单词。由于已打印某些内容,因此不再打印堆栈顶部。

地面程序中,存在一些在这种情况下很方便的错误。以下部分:

'<space>

将空格字符压入堆栈顶部。的Š旋转堆叠,其具有元数3。堆栈上只有一个元素,没有任何输入,因此这会产生一个异常,清除堆栈。将Â堆栈的顶部分叉,但这与旋转操作符具有相同的故事。因此,基本上该,命令什么都不打印。

这意味着程序仍将输出堆栈的顶部'í¶。导致ground



9

Pyth,30个字节

数字

"figure" "ground              

14个尾随空格。

测试

地面

无尾随空格

        "       figure""ground

测试

怎么运行的

相当有帮助的是,空格禁止在Pyth中打印,而没有关闭的字符串文字"被隐式关闭。

因此,第一个程序由两个字符串"figure"和组成"ground "。第一个字符串是隐式打印的,第二个字符串的打印是禁止的,这意味着只打印了一个字符串figure

第二个程序由两个字符串" figure"和组成"ground"。禁止打印第一个,而第二个则隐式打印,这意味着仅ground打印。


6

MATL,37字节

第一个程序

'figure'         
%x'ground'         

每行有9个尾随空格。

在线尝试!

第二程序

    'figure'%
      x'ground'

这里没有交流空间。

在线尝试!

说明

没什么特别的...

  • 语句之间的空格和换行符被MATL忽略。
  • % 是注释符号,它将忽略该行的其余部分。
  • x 删除堆栈的顶部。
  • 堆栈在程序末尾隐式打印。

6

Java,180字节

.用空格代替。

打印“图”:

class
A{public
static
void
main(String[]a){System.out.println(
//"ground"
//
.....
........
......
....
...................................
..
........
..........
....
"figure");}}

打印“地面”:

.....
........
......
....
...................................
..........
..
class
A{public
static
void
main(String[]a){System.out.println(
//
"ground"
//"figure"
);}}
............


4

Mathematica,50 34字节

使用REPL环境。(添加Print[]具有相等数量空格的包装程序将使字节数增加14。)这两个程序是

01figure+0 1ground                

(带有16个尾随空格)和

          0       1figure+01ground

这里的关键是Mathematica将没有空格的数字连词视为单个数字,但将中间空格解释为邻居相乘,数字和任意变量名的串联也是如此。因此,第一个表达式的计算1*figure+0*1*ground结果为figure;第二个表达式的计算0*1*figure+1*ground结果为ground


4

PHP,44 42字节

图:(16个尾随空格,图与;之间的5个空格)

echo''?ground:figure     ;                 

地面:(20个前导空格)

                     echo' '?ground:figure;

确实很简单,因为''虚假和真实而' '起作用。使用方式如下:

php -r "echo''?ground:figure     ;                "
php -r "                    echo' '?ground:figure;"

编辑:马丁·恩德(Martin Ender)节省了2个明显的字节


3

Haskell,96 94 88 82 77字节

第一个程序,打印"figure"

main              =          putStr$idid"ground"
idid    _          ="figure"

第二个程序,打印"ground"

    main=putStr$id id"ground"                   
    idid _="figure"         

调用两个不同命名的常量函数之一


3

Haskell,88 65字节

main=putStr
...........--
.."figure"..........
--"ground"........

...........
main=putStr..
--........"figure"--
.........."ground"

.表示空格。只是一些行注释(-> --)杂耍。


3

Python 2,52字节

........................
print"figure"
an
d
"ground"

.s表示空格。最后三行被拆分为错误而没有SyntaxError这将阻止代码首先运行。

基本版本仅用于and打印第二个字符串。


替代(较长)尝试:

.......
print(#"ground")#
"figure")...................


print"figure"""and"ground"
.............
.............

3

JavaScript(ES6),56个字节

alert('figure'
                //&&'ground'
           )
              
alert('figure'//            
&&'ground') 

该图没有尾随空格。


我为每个程序计算56个字节,除非不包括换行符。我怀疑它会变得更短。
ETHproductions 2016年

@ETHproductions哎呀,这就是您手动计数字节时会发生的事情:-(
Neil

2

轨道,56字节

数字

$'main'
 -[figure]o                
-          [ground]o

第二行上有16个尾随空格。程序因错误而终止。

在线尝试!

地面

       
$'main'-[图] o
 -[地面] o         

第一行有7个空格,最后一行有9个尾随空格。该程序也会终止并出现错误。

在线尝试!

说明

Rail查找以(正则表达式)开头的行\$.*'main'以找到入口点。然后,火车(指示指针)从$东南移动。该程序可以完全忽略火车无法到达的内容。这包括与入口点在同一行上的所有内容。由于-东南方$立即将火车转向东方,因此两个程序都简化为:

 -[figure]o
 -[ground]o

[...]表示字符串文字并o打印。通常,您需要使用a #来终止导轨,但是如果省略它,则程序仍然会终止(但会向STDERR抱怨火车撞车了)。


2

> <>,39个字节

使用·表示空间。

数字

v·
"·dnuo
e·
r·
u·
g··
i··
f···
"·
>·o·

在线尝试!

地面

·v
·"····
·d
·n
·u
·oe
·ru
·gif
·"
·>·o

在线尝试!

这两个程序都以错误终止。

说明

通过垂直写代码,我能够重用gr这两种解决方案之间,以及报价和>o的输出循环。

在这两种情况下,唯一执行的位是下方的列v,该列将所需单词的字母以相反的顺序压入堆栈。然后>将指令指针重定向到右侧,在其中循环遍历o,打印字符,直到堆栈为空。


我刚开始使用自己的> <>版本,然后遇到了您的版本。我真的很喜欢您的垂直工作的想法(我的想法很“正常”)。
蓝绿色鹈鹕

@Tealpelican我直到解决裂变的答案时才想到这个。在此之前,我最好的> <>解决方案是42个字节:(!__|"druong">o<"figure"哪里_有空格,剩下的空格就放在行尾)。
马丁·恩德

我当前的最短版本是; ##“ de nr uu og ri GF”> o!~~!<##有趣的是42个字节!我以前的版本具有错误检查功能,但只能减少到53个字节。
蓝绿色鹈鹕

2

裂变,37字节

使用·表示空间。

数字

D·
"···
f··
i··
g·
u·
r·
e·ound
"·
;·

在线尝试!

地面

·D
·"fi
·gu
·re
·o
·u
·n
·d····
·"
·;

在线尝试!

说明

的工作原理与我的> <>答案基本相同(尽管我实际上首先找到了这个答案)。唯一的区别是",它会立即在Fission 中打印字符,这就是为什么单词没有上下颠倒写的原因,以及为什么我们只需要在结尾处终止程序;


1

网状,46字节

                      "ground""figure"" "?$$o;

在线尝试!打印ground

"ground""figure"""?$$o                 ;      

在线尝试!打印figure

地面

相关代码:

"ground""figure"" "?$$o;
................          push these two strings
                " "?$     pop " " off (since " " is truthy, `?` executes `$`)
                     $    pop TOS ("figure")
                      o;  output and terminate

数字

相关代码:

"ground""figure"""?$$o;
................         push these two strings
                ""?$     doesn't activate
                    $    pop ""
                     o;  output and terminate

1

Brian&Chuck55 53字节

数字

erugif?dnuorg             
}<.<.<.<.<.<.             

每行有13个尾随空格。

在线尝试!

地面

             erugif?dnuorg
             }<.<.<.<.<.<.

在线尝试!

说明

嗯,自从我上次使用Brian&Chuck以来已经有一段时间了。简短提醒一下,Brian和Chuck是两个Brainfuck实例,它们使用彼此的源代码作为磁带。只有Chuck可以使用print命令.,可以?在两个实例之间有条件地切换},就像[>]Brainfuck一样。未知命令将被忽略。

由于忽略了程序开头的空格,因此两个程序几乎相同。唯一的区别是,在切换命令之后?,指令指针执行下一条命令之前先移动。因此,始终会跳过Chuck磁带上的第一个命令。因此,唯一真正的区别是地面程序执行,}而图形程序则不执行。所以这是代码的工作方式:

?   Switch control to Chuck.
}   GROUND PROGRAM ONLY: Move the tape head on Brian to the end of the tape.
<.  Move the tape head left and print the character there.
... Do the same another five times to print the remainder of the string.

0

WinDbg,74个字节

地面

                      ea2000000"      groundfigure";;;da       2000006  L6

数字

ea2000000"groundfigure          ";;;da                  2000006       L6  

图有2个尾随空格。我觉得至少2或4个字节应该可以打高尔夫球...

它通过将字符串写入内存并从中显示6个字符来工作。字符串中的字符被重新排列,因此显示的字符在程序之间改变:

* Ground:
ea 2000000 "      groundfigure";     * Write string "      groundfigure" starting at 2000000
;                                    * No-op
;                                    * No-op
da 2000006 L6                        * Print 6 ascii chars, from 2000006, ie- ground

* Figure:
ea 2000000 "groundfigure          "; * Write string "groundfigure          " to memory
;                                    * No-op
;                                    * No-op
da 2000006 L6                        * Print 6 ascii chars, ie- figure

输出:

0:000>                       ea2000000"      groundfigure";;;da       2000006  L6
02000006  "ground"
0:000> ea2000000"groundfigure          ";;;da                  2000006       L6  
02000006  "figure"
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.