伪除数和多态


23

任务

在这个挑战中,您的任务是用编程语言L编写一个程序,该程序采用正整数n,并输出n的适当除数之(OEIS上的序列A001065)。它应该返回任何正确的输出1≤N≤10 000。以下是前10个输出:

0, 1, 1, 3, 1, 6, 1, 7, 4, 8

此外,您的程序必须是假的polyglot,这意味着以下内容。它是另一种编程语言的有效程序L”,并且对于每个输入1≤N≤10(测试用例以上),则返回的适当的除数的总和Ñ,但存在一些11≤Ñ000≤10为其它不会返回正确的结果。它可能会返回不正确的内容,永远循环,崩溃等。对于所有n≥11(对于其中的某些n个或仅一个),它都可能给出错误的结果。

规则和计分

您可以编写完整的程序或函数,并且可以使用两种语言使用不同的输入和输出方式。最低字节数获胜。适用标准规则。在这一挑战中,一种语言的不同主要版本或实现被认为是不同的。

请注意,如果您使用具有非ASCII编码的编程语言(如本站点上的许多语言),则两种语言都必须使用相同的字节序列。这意味着您必须在可能不同的代码页之间进行转换,或者必须对多字节Unicode字符进行惩罚。

其他测试用例

20 -> 22
36 -> 55
180 -> 366
997 -> 1
2875 -> 869
10000 -> 14211

Answers:


10

JavaScript(ES6),V8 / SpiderMonkey vs Chakra66 63字节

n=>[...Array(n)].map((_,d)=>s+=n%d?0:d,[0,n>10].sort(x=>s=x))|s

演示版

输出量

在Chrome和Firefox上,上述代码段的输出(均正确):

[0,1,1,3,1,6,1,7,4,8,1,16,1,10,9,15,1,21,1,22]

边沿输出(从n = 11开始减1):

[0,1,1,3,1,6,1,7,4,8,2,17,2,11,10,16,2,22,2,23]

为什么?

.sort()方法的规范未规定算法。甚至不需要稳定。因此,每个JavaScript引擎都使用自己的实现。

然而,[0,1].sort(x=>x)[0,1]所有的引擎。

那有什么区别呢?

这里发生的事情是,脉轮传递1作为第一个(也是唯一一个)迭代回调函数(要求的比较的第一个参数10),而V8和SpiderMonkey的逝去0(要求的比较01)。

您可以使用以下代码段检查您的浏览器正在做什么。


1
这是可以接受的解决方案。我将在主要帖子中进行澄清。
Zgarb

8

Python 2和Python 3,58个字节

适用于Python 2的TIO

适用于Python 3的TIO

lambda n:sum(i*(n<11or''==b'')for i in range(1,n)if n%i<1)

它可以在python 2中工作,但是对于每n> 10的情况,它将在python 3中输出0。这
都是由于比较字符串和字节的方法不同:

  • 在Python 2中 '' == b''
  • 在Python 3中 '' != b''

7

JavaScript(Node.js)PHP73 70字节

function($n){for($d=$i=0;++$i<$n;)$d+=$i*!($n%$i);return"$n">10?0:$d;}

在两种语言中,这都是一个匿名函数。JavaScript给出正确的结果,但是PHP 对于所有n> = 11给出0

试试JS!

试试PHP!

怎么运行的

两种语言起初都做同样的事情:从1迭代到n-1,保持所有数字i的连续和,其中n%i = 0

导致行为差异的原因是最后一部分:

return"$n">10?0:$d;

在JavaScript中,"$n"只是字符串文字。>与的比较10将其隐式转换为数字,但由于它看起来不像数字,因此变为NaN。当以任何方式与数字进行比较时,NaN都会给出假。结果,$d总是返回。

但是,在PHP中,"$n"是包含值的字符串$n。当PHP将其强制转换为数字时,它仅成为的值$n。如果大于10,则0返回而不是$d


7

05AB1E / 果冻  9  8字节

字节码(十六进制):

d1 a8 4f 71 0d ad 53 fa

对于任何过多的数字,使用Jelly的代码页都会返回错误的结果(例如,输入12将返回而不是):1216

ẎƭOqÆḌS«

在线尝试!

使用05AB1E的代码页返回正确的结果:

ѨOqмλSú

在线尝试!

怎么样?

05AB1E最多解析71q)并指示退出,然后停止解析:

ѨOq - Takes input from stdin
Ñ    - get divisors
 ¨   - remove right-most (the input value itself - yielding proper divisors)
  O  - sum
   q - quit (causing an implicit print of the top of the stack)
...мλSú is never parsed

由于字节的影响(没有指定的含义),Jelly将整个程序预先解析为三个链接,ƭq充当分隔符。程序的入口是它的最终链接:

Ẏ - Link 1 (never used), tighten list
...ƭ delimits links 1 & 2)

O - Link 2 (never used), cast from characters to their ordinals
...q delimits link 2 and the main link

ÆḌS« - Main link: number, n
ÆḌ   - proper divisors
  S  - sum
   « - minimum of that and n
     - as a full-program: implicit print


是的,固定,谢谢;我只是在写解释。
乔纳森·艾伦

ÆḌSD保存一个字节。
丹尼斯

@丹尼斯或更好ÆḌSṚ
暴民埃里克(Erik the Outgolfer)'17年

@Dennis-谢谢,在吃饭时想到了另一种方式:)
乔纳森·艾伦

6

蟒3 / Python 2中64 60 58字节

感谢@officialaimm关闭2个字节

lambda n:sum(d*(round((n>10)*.5)==n%d)for d in range(1,n))

在Python 3中,这给出了正确的结果。在Python 2中,输入超过时输出错误10。该代码利用了banker的四舍五入,该四舍五入是由Python 3完成的,而不是由Python 2完成的。

在线尝试!Python 3(正确), Python 2(错误n > 10)。


您将不需要[ ]
Officialaimm

6

Python 3 / Python 2 2,47个字节

lambda n:sum(d*(n%d<1)for d in range(10/n>0,n))

一个未命名的函数,在Python 2中是伪造的。

在线试用Python 3 Python 2

在Python 2中 /是带有整数参数的整数除法,而在Python 3中是除法。

如果n超过10 10/n,则在Python 2中为0,但在Python 3中为一小正数(在不超过10在至少 10,000以内,)。

作为这样10/n>0的计算结果为True用于Python 3和range(10/n>0,n)相当于range(1,n)而在Python 2次10/n>0的计算结果为False,当n超过10,于是range(10/n>0,n)变得等同于range(0,n)导致n%d尝试执行模算术零,养ZeroDivisionError


5

果冻 / 05AB1E,12个字节

果冻看到的是:

11⁻iẎƭO}qÆḌS

在线尝试!

说明:

q在Jelly中不受支持,因此Jelly仅“看到”之后的内容q

ÆḌS
ÆḌ  Proper divisors
  S Sum

05AB1E看到的是:

11‹iѨO}qмλS

在线尝试!

说明:

11‹iѨO}qмλS Implicit input multiple times
11           Push 11
  ‹          Less than 11?
   i   }     If equals 1, then
    Ñ         Divisors
     ¨        Remove last
      O       Sum
       q     Implicit print and quit
        м    Negative filter
         λ   Undefined, ignored error
          S  Split into chars

当然,“退出”之后的所有内容实际上都不会发生。


我希望ÆḌS它本身是有效的...非凡的回答!
Xcoder先生17年

@ Mr.Xcoder我不确定мλS在05AB1E中如何工作。
Erik the Outgolfer '17

强调我的愿望:P
Xcoder先生,17年
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.