限制性多语种


20

多重语言是同时在多种编程语言中有效的程序。大多数这样的多语言文字以一种语言的某些构造被解释为另一种语言的注释的方式(例如,#define在C 语言中被解释为几种脚本语言的注释)。

我很好奇,是否有可能制作一个不包含注释的非平凡的多语种,但是当您删除任何非空白字符时也会立即更改,因此,我向您提出这样一个程序。

具体规则如下:

  1. (输出)。您的程序必须使用每种语言在控制台上产生一些输出。也就是说,您的程序不允许不打印任何内容而直接退出。
  2. (方差)。作为对标准多语言定义的放松,程序的输出可能会因语言而异。
  3. (错误)。您的程序不得在任何一种语言下产生任何错误(广义定义)。对于大多数语言,这被定义为从编译器和/或解释器返回非零退出代码。
  4. (限制)。从代码中删除任何单个非空白字符都将导致您的程序在每种语言下更改其行为。程序可以通过对该语言无效或更改生成的输出来“更改”。
  5. 这是一个代码挑战。优胜者是在大多数编程语言中都有效的程序。为了缩短程序长度,将打破联系。

限制规则不适用于删除多个字符。也就是说,如果同时删除多个字符不会对您的一种语言造成任何影响,那就很好。

请注意,该限制规则表明您不能将空格用作您的一种语言,因为删除任何非空格字符不会改变空格程序的行为。

这是一个满足以下所有限制的程序的简单示例,适用于Python 2和Python 3:

print("Hello World!")

删除中的任何字符print将导致两种语言都抛出NameError;删除任何括号或引号将引发SyntaxError,删除任何字符串字符将更改两种语言的输出。(请注意,print("hello", "world")根据上述规则,这是一个更微妙但仍然有效的程序)。

这个示例有点la脚,因为Python 2和Python 3非常相似,因此我不会接受任何其他仅使用同一语言的不同版本的解决方案(尤其是Python 2和Python 3)。


@IngoBürk:该规则阻止您编写涉及空白的功能多语言,除非您的一种语言也仅限于空白。
nneonneo 2014年

1
FWIW您的示例,print("Hello World!")也是有效的Ruby代码
Cristian Lupascu 2014年

有点烦恼的是,[多语言]的简单答案(像我的一样)往往会具有这么多的语言。
贾斯汀2014年

5
为避免多种语言变体或语法相似的语言,更有趣的是要求仅当程序产生不同的输出时,两种语言才算为不同。
吉尔(Gilles)'“ SO-别再邪恶了”

Answers:


13

Bash + GolfScript + CJam

"echo" []
{ cat<&3;} \
3<""<("echo" 'p'~)

输出量

重击:

[]
p~

GolfScript:

"echo"
echo{ cat<&3;}0

CJam:

echo{ cat<&3;}-1echop

\x7fCJam的输出末尾有一个。


...等等,这是如何在所有三种语言中工作的,而不是多余的?
nneonneo 2014年

@nneonneo它只是用其他语言打印所有未使用的代码。
jimmy23013 2014年

8

重击+ Befunge

"echo" $,$,"ol":,,,@

在befunge中打印“ hello”。


1
我可以证明,每个字符(空格除外)在Befunge中都有所作用。对于Bash我还是不能这样做。这令人印象深刻。
贾斯汀

7

bc,GolfScript,Homespring,呵呵,八度,Scilab(0字节)

保证遵守规则4。不是赢家,但在抢七局中会表现出色。

输出量

公元前

Copyright 1991-1994, 1997, 1998, 2000, 2004, 2006 Free Software Foundation, Inc.
This is free software with ABSOLUTELY NO WARRANTY.
For details type `warranty'.

高尔夫脚本


弹簧

In Homespring, the null program is not a quine.

hu

?

八度

GNU Octave, version 3.6.4
Copyright (C) 2013 John W. Eaton and others.
This is free software; see the source code for copying conditions.
There is ABSOLUTELY NO WARRANTY; not even for MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE.  For details, type `warranty'.

Octave was configured for "x86_64-redhat-linux-gnu".

Additional information about Octave is available at http://www.octave.org.

Please contribute if you find this software useful.
For more information, visit http://www.octave.org/get-involved.html

Read http://www.octave.org/bugs.html to learn how to submit bug reports.

For information about changes from previous versions, type `news'.

科学实验室

Startup execution:
  loading initial environment

-->

2
我知道有一个esolang通过执行这种操作来专门防止0长度的quines(哦,等等,那是Homespring)。我相信吧?输出一些东西。
贾斯汀

谢谢!可悲的是,我不能说服吧?可以在Linux上运行...
Dennis 2014年

1
我需要的是一个单声道的额外软件包。What?\n?顺便说一下,您的程序会打印。
丹尼斯

1
也可以在GNU Make中使用(如果这是一种编程语言):make: *** No targets. Stop.
jimmy23013

1
@ user23013:对。在这种情况下,这不是有效的条目,因为make的退出代码为
Dennis

6

GolfScript + PHP + CJam + Mathematica + bc + Pyth + /// + TI-Basic + R +八度音+ Matlab + Scilab + 数值Topline + 星期二 + 吧?

10

在Golscript,PHP,CJam,Mathematica,bc,Pyth,//和TI-Basic中,它输出10

在R中,它输出 [1] 10

在八度中,它输出 ans = 10

在Matlab和Scilab中,它输出ans = 10

在数字标题行中,输出0

如果我正确理解Fueue,它将输出换行符,然后充当cat程序。

是吗,它输出

What?
?

1
也适用于CJam
八月

5
我认为交互式口译员不应该算在内。
nneonneo 2014年

2
这在许多语言中都可以正常运行,但不能在许多语言中提供输出...
贾斯汀2014年

1
这在HTMLbcMatlabScilab中也有效。如果更改7210,则应0在“ 数字外框”中打印。
丹尼斯

根据元讨论,HTML不是一种编程语言,因为它没有简单的算术或循环方法。
IngoBürk2014年

3

似乎这个答案并不完全正确。
我部分修复了该问题,并打算在几天内改进另一部分。

C ++和Javascript

这个想法是:

void eval(bool="main=function(){alert('Hi from Javascript!')};puts=function(){};int=0");
int
main()
{
puts("Hi from C++!");
}

C ++:http : //codepad.org/SK2wbIDL
Javascript:只需将代码复制到浏览器控制台

以及一组使其满足的修补程序

(限制)。从代码中删除任何单个非空白字符都将导致程序在每种语言下更改其行为。程序可以通过对该语言无效或更改生成的输出来“更改”。

从Java语言方面:

更改intmainputs将与读取未声明的变量的崩溃。但是bool并且Hi from C++!可以安全地进行更改。让我们修复它:

puts=function(){}
puts=function(s){s=='Hi from C++!'?bool:nope}

如果字符串相等,则检查是否存在bool,否则将以unclared崩溃nope

现在,有2个尾随的分号可以删除。首先是固定的-只需在int以下位置删除换行符即可:

void eval(bool="main=function(){alert('Hi from Javascript!')};puts=function(){};int=0");int

第二个是在之前},因此我需要一些约束条件,在两种语言中都有效,并且在C ++中不需要结尾的分号或在js中不要使用分号。精细:

while(0);

根据while需要,在js中省略分号是不可能的。

因此,目前的程序是:

void eval(bool="main=function(){alert('Hi from Javascript!')};puts=function(s){s=='Hi from C++!'?bool:nope};int=0");int
main()
{
puts("Hi from C++!");while(0);
}

从C ++方面:

有两个问题:eval可以有任何名称,并且所有js代码都可以更改。

我将在几天后尝试修复它们。


2

CJam + Golfscript

好的,这有点无聊,但这是一个开始。

1,

用两种语言打印“ 0”。除去1原因将导致错误,,而是除去打印件“ 1”。

1)或也可以这样做1(。有很多选择。

(是的,我知道这不是代码高尔夫)


2

C和C ++

#include <stdio.h>
int main() { puts("Hello!"); return 0; }

C和C ++是不同的语言是相互兼容的差不多-相反,你可能会听到C ++究竟是不是C.看的超集,在http://en.wikipedia.org/wiki/Compatibility_of_C_and_C%2B%2B一些差异。上面的示例不是惯用的C ++,但它确实可以工作,并且在C和C ++中均产生相同的输出。


您可以删除0C的
Dennis


@Gilles:如果主函数执行不指定任何值的返回,则返回主机环境的终止状态不确定。C89草案-2.1.2.2托管环境)不会使程序无效,也不会更改其输出,因此,出于本问题的考虑,0可以将其删除。
丹尼斯

@Dennis我认为根据该问题的规则,未指定的退出代码将使该程序无效。如果不是,则使该程序返回非零退出代码的C89实现,例如gcc -ansi在x86上(或许多其他体系结构:发生的情况是,putsend 的返回值最终位于运行时读取值的寄存器中)从main函数返回)。
吉尔斯(Gillles)“所以-别再作恶了”

@吉尔斯:我对规则3的解释是,编译器必须返回0,而不是程序。
丹尼斯

2

JavaScipt,Lua,R和Python 3-24个字节

可能适用于其他语言,我将对其进行测试。

alert=print;alert(1)

JavaScript已在Firefox的控制台和此处此处此处的其他语言上进行了测试


1

Perl + Ruby + Python

我认为在PHP中,如果使用,则需要使用分号-R

print "Hello World!"

这也适用于Python。
八月

1
也适用于Lua。
Trebuchette

1

Bash + sh + zsh + ksh,4个字节:

echo

确实很简单,并且满足每条规则:

  1. 以每种语言输出换行符。
  2. 当前,语言之间的输出没有任何变化。
  3. 不会以任何一种语言产生错误...
  4. ... 除非删除或更改了任何字符。

0

Bash + sh + zsh + ksh + Windows Batch,4个字节:

echo

确实很简单,并且满足每条规则:

输出的换行符在每种语言中都没有变化(但是Windows Batch,它ECHO is on以您使用的语言输出)不会出错,除非删除或更改了任何字母。


1
您的答案似乎几乎与此答案相同:codegolf.stackexchange.com/a/100654/65326
Uriel
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.