矛盾多义


19

好吧,每个人都喜欢Polyglots。您将获得两个整数,采用任何标准输入形式(无需硬编码)。您的任务是编写一个多语言,该语言可以找到一种语言的最小值和另一种语言的两个数字之间的最大值,并执行以下操作:

  • 找到最大值的代码也必须计算它们的总和。
  • 找到最小值的程序还必须计算其减法(max - min)的结果
  • 这是“棘手的部分”:如果两个数字相等,则两个程序都不得输出/返回任何内容( STDOUT和和STDERR或任何其他return方法)
  • 有关格式的更多详细信息,请参见“ 输出规格”部分

输入项

如上所述,在任何一种标准方法中,两种语言都将两个整数用作输入。

输出规格

  • 对于找到的程序max,格式应为:max_value, addition result
  • 对于找到的程序min,格式应为min_value, subtraction result (max - min)
  • 结果可以打印,与任何明确的分隔符(\n,或其他任何你想要的),从功能包含用分隔符或数字列表的两项预期值的字符串返回(如:[max_value,sum]

例子:

Input   || Max Language Output || Min Language Output

100, 40 || 100, 140            || 40, 60
63, 67  || 67, 130             || 63, 4
-45, -5 || -5, -50             || -45, 40
21, 21  ||                     ||
-1, 1   || 1, 0                || -1, 2 

得分:

这是,因此请尝试编写最短的代码以获得所需的结果,同时请注意,严格禁止使用标准漏洞。您必须使用两种不同的语言,而不是同一语言的其他版本(例如:Python 2- Python 3对无效)


@downvoter为什么会这样?
Xcoder先生17年

6
我建议将问题在沙盒中保留至少两天,以便他们在发布主要内容之前得到足够的关注。我没有投票。
暴民埃里克(Erik the Outgolfer)'17年

Goddammit,写了一个Py2 / Py3的答案,正当我要发布时看到了规则。30分钟我再也回不到哈哈。
sagiksp

Answers:


6

05AB1E / Jelly21 20字节

寻求帮助后-1个字节-感谢Emigna!(`push(uwrapped(pop()))

原始字节(右侧的转储显示了Windows计算机显示的内容):

60 ca 69 b9 5a 73 4f 29 71 93 18 fa 2c d3 f7 d3    `Êi¹ZsO)q..ú,Ó÷Ó
cd 04 18 2f                                         Í../

两者都接受来自STDIN的输入并输出到STDOUT作为列表表示[x, y]

最大语言为05AB1E:

`Êi¹ZsO)q“.ú,Ó÷ÓÍ../

.代码页(cp1252)中,并且在这里,无论您使用的是什么(0x18 = CAN和0x04 = EOT),代表不可打印字节。

试用05AB1E版本

最小语言是果冻:

İ__iỤZs0)qƓð«,ạẋạṠ¥ð/

尝试Jelly版本

怎么样?

05AB1E:

`Êi¹ZsO)q“.ú,Ó÷ÓÍ../ - parsed left to right, executed as parsed
                     - implicit input taken
  i                  - If:
`                    -     push(unwrapped(pop()))
 Ê                   -     push(pop()!=pop())
                     - ...Then:
   ¹                 -     push(1st item from input history)
    Z                -     push(max(top of stack))
     s               -     push(reverse(pop(),pop()))
      O              -     push(sum(pop()))
       )             -     wrap(pop())
        q            -     quit - implicit print of top of stack
         “.ú,Ó÷ÓÍ../ - unexecuted and unparsed string

果冻:

`ȮiỤZs0)qƓð«,ạẋạṠ¥ð/ - parsed left to right, not executed until parsed
`ȮiỤZs0              - a dyadic chain which would error if executed (monad from dyad, index of, grade up, transpose, split into chunks of length 0)
       )q            - currently unassigned code points each currently creates a new link
         Ɠ           - read and evaluate a line of input
          ð       ð  - dyadic chain separations
                   / - reduce by:
           «         -     minimum(left, right)
             ạ       -     absolute difference(left, right)
            ,        -     pair(result)
                 ¥   -     last two links as a dyad:
               ạ     -         absolute difference(left, right)
                Ṡ    -         sign(result) (i.e. {0:0, +x:1, -x:-1} but -x never happens)
              ẋ      -     repeat list left right times
                     - implicit print

18

C和C ++(gcc),117107字节

-10个字节感谢@Steadybox!

#include<stdio.h>
int f(int a,int b){auto c=.5;a-b&&printf("%d %d",c?b<a?b:a:a>b?a:b,c?a-b>0?a-b:b-a:a+b);}

说明:在C中,auto c=.5使用自动存储类(默认值)声明一个整数变量,然后将其初始化为0,而在C ++ 11中,它声明一个double初始化为0.5。因此,变量的值在C ++中为true,在C中为false。

C-最大语言: 在线尝试!

C ++-最小语言: 在线尝试!


2
非常聪明的解决方案。我喜欢没有评论的事实。
Xcoder先生17年

5
要节省一些字节,可以声明一个变量auto c=.5,然后使用c代替sizeof'a'-1。在C中,auto c=.5使用自动存储类(默认值)声明一个整数变量,然后将其初始化为0,而在C ++ 11中,它声明一个double值,其初始化为0.5。因此,变量的值在C ++中将是真实的,而在C中将是虚假的。–
Steadybox

9

Python 3 / Jelly,42个字节

使用Jelly的代码页对文件进行编码。

原始字节:

6c 61 6d 62 64 61 20 78 2c 79 3a 5b 6d 61 78 28    lambda x,y:[max(
78 2c 79 29 2c 78 2b 79 5d 2a 28 78 21 3d 79 29    x,y),x+y]*(x!=y)
0a 23 7f fa 2c d3 f7 d3 cd 04                      .#.ú,Ó÷ÓÍ.

两者都定义了一个未命名的二进位函数。

Python(最大语言)看到:

lambda x,y:[max(x,y),x+y]*(x!=y)
#\x7fú,Ó÷ÓÍ\x04

作为Python测试

果冻(最小语言)看到:

lambda x,y:[max(x,y),x+y]*(x!=y)½#
«,ạẋạṠ¥

测试果冻

怎么样?

Jelly将0x0a解释为½平方根原子,而Python则将其解释为换行符。在Jelly中,0x7f被解释为链接(函数)之间的分隔,并在其代码页中由换行符或首尾表示。对于Jelly,最后一个链接是主要功能-在这里它没有调用上面的链接(解释器仍然需要正确解析)。在Python 0x23中,#指示在它之后和0x0a(换行符)之前的所有内容均为注释。

执行的Python代码:

lambda x,y:[max(x,y),x+y]*(x!=y)
lambda x,y:                      - A function taking two inputs, x and y
           [        ,   ]        - A list with two items
            max(x,y)             - take the maximum of x and y
                     x+y         - x plus y
                           x!=y  - x not equal to y?
                         *(    ) - multiply - True is treated as if it were 1, False as if it were 0

执行的Jelly代码:

«,ạẋạṠ¥ - A dyadic link (function of two variables): x, y
«       - minimum(x, y)
  ạ     - absolute difference(x, y)
 ,      - pair left with right (creating a list)
      ¥ - last two links as a dyad:
     ạ  -     absolute difference(x, y)
    Ṡ   -     sign(result) (i.e. {0:0, +x:1, -x:-1} but -x never happens)
   ẋ    - repeat the list to the left right times (either the same list or an empty list)
        - return the result

有趣的语言选择
Xcoder先生17年

几乎可以肯定,可以将Jelly代码与另一种高尔夫语言结合起来以减少字节数。
乔纳森·艾伦

嗯...您的代码段似乎有所不同。
Erik the Outgolfer

1
@EriktheOutgolfer这些代码块只是原始字节的表示(因此,\x7f\x04用于Python中不可打印的内容)。
乔纳森·艾伦,

1
@JonathanAllan不,我是说您的摘录确实与众不同。只需查看每个代码的Python代码即可。
暴民埃里克(Erik the Outgolfer)'17年

8

Ruby / Python 3,102个字节

Ruby返回max / sum,Python返回min / difference。输入是从STDIN读取的数组对象。

a=eval((0and gets or input()))
b=a.sort()
x,y=(b or a)
z=0 or 1
x==y or print([[y,x][z],[x+y,y-x][z]])

在线尝试:Ruby

在线尝试:Python

这里使用的主要怪癖是0在Ruby中使用Truth ,在Python中则是虚假。值得一提的另一件事是,Python的sort函数就地修改了列表并返回None,而Ruby的函数则未修改并返回排序后的数组,因此需要使用它b or a来获取最小值/最大值。

Python 3是必需的,因为如果您尝试在最后一行printor语句后调用,Python 2会抱怨。


真聪明!+1
Arjun

4

的Java / AWK219个 217 212 196字节

/*#\/* /
{$0=((x=$1)<y=$2)?x" "y-x:y" "x-y}x!=y
#*/interface B{static void main(String[]A){Integer x=Integer.parseInt(A[0]);int y=x.parseInt(A[1]);System.out.print(x==y?"":(x<y?y:x)+" "+(x+y));}}

在线尝试!

Java输出最大和总和,AWK输出最小和差。如果输入相同,则没有任何输出。

这是我的第一个多语言和第一个TIO :)


3

JavaScript(ES6)/ QBasic,172 171字节

'';f=x=>{m=Math.max(...x);s=Math.min(...x);if(x[0]!=x[1])alert([m,m-s])}/*
INPUT c
LET m=c
LET s=c
INPUT n
IF n>c THEN m=n
IF n<c THEN s=n
IF n<>c THEN PRINT m,m+s
END
'*/

基于的类似问题的解决方案

此解决方案也使用注释方法!

JavaScript是最小语言。它接受一个包含数字的数组作为输入。输出,alert()ing 隔开的两个数字(第一个数字是输入数组的最小值,第二个数字是输入数组的最大值和最小值之差)。alert()如果数字相等,则什么也不做。您可以像这样调用函数f([100,40])

QBasic是最大语言。反复要求输入两次。打印最大数量的输入数字,以及最大和最小输入数字的总和。PRINT如果数字相等,则什么也不做。


它是如何工作的?

在QBasic(结构化BASIC系列语言;不需要行号)中,'标记注释的开始,一直到行尾。而在JavaScript中,它标记字符串的开头。因此,整个第一行在QBasic中被标记为注释,但是在JavaScript中,该行被执行(并且该行包含JavaScript部分,该JavaScript部分计算最小数字以及最大和最小数字的差,/*最后是a)它会开始注释,以便从JavaScript解释器中隐藏其余的QBasic代码。)

从第二行到倒数第二行的代码包含QBasic代码,用于计算最大数量以及最大和最小数量的总和(该代码非常不言自明)。

最后一行包含'*/'导致QBasic解释器将以下代码解释为注释,而在JavaScript中,它是注释的一部分(在第一行的末尾开始),因此没有任何作用。以下代码(*/)使JavaScript结束在第一行中开始的注释,但由于QBasic认为它是注释的一部分,因此未在QBasic中执行。


测试用例

JavaScript(最小语言):

'';f=x=>{m=Math.max(...x);s=Math.min(...x);if(x[0]!=x[1])alert([m,m-s])}/*
INPUT c
LET m=c
LET s=c
INPUT n
IF n>c THEN m=n
IF n<c THEN s=n
IF n<>c THEN PRINT m,m+s
END
'*/

f([100,40]);

QBasic(最大语言):

这个网站。将以下代码复制粘贴到其文本编辑器中:

1 '';f=x=>{m=Math.max(...x);s=Math.min(...x);if(x[0]!=x[1])alert([m,m-s])}/*
2 INPUT c
3 LET m=c
4 LET s=c
5 INPUT n
6 IF n>c THEN m=n
7 IF n<c THEN s=n
8 IF n<>c THEN PRINT m,m+s
9 END
10 '*/

需要行号的原因是我提到的网站仅支持非结构化BASIC语言。而且该网站是我所能找到的唯一一个不错的在线BASIC解释器。但是,运行在文章顶部的代码(无行号的代码)在任何支持结构化BASIC的良好QBasic解释器中都可以正常工作,并且可以'作为注释启动器(尽管很少,但是大多数都可以)

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.