偽除数和ポリグロット


23

タスク

この課題では、あなたのタスクは、プログラミング言語でプログラムを書くことであるL正の整数を受け取り、N、との適切約数の合計出力NシーケンスA001065 OEIS上を)。これは、任意の正しい出力返すべき1≤N≤10 000。最初の10個の出力は次のとおりです。

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

さらに、プログラムは偽のポリグロットでなければなりません。これは次のことを意味します。これは、他のプログラミング言語で有効なプログラムであるL」、及び各入力に対して1≤N≤10(テストケース上)、それの適切約数の和を返しnは、いくつか存在する11≤N≤10 000れます正しい結果を返しません。誤ったものを返したり、永久にループしたり、クラッシュしたりする場合があります。n≥11のすべて、またはそれらの一部または1つに対して誤った結果を与える可能性があります。

ルールとスコアリング

完全なプログラムまたは関数を作成でき、2つの言語で異なる入出力手段を使用できます。最も低いバイトカウントが優先されます。標準の規則が適用されます。この課題では、言語のさまざまなメジャーバージョンまたは実装が個別と見なされます。

非ASCIIエンコードを使用したプログラミング言語を使用する場合(多くの場合このサイトで使用しているように)、両方の言語に同じバイトシーケンスを使用する必要があることに注意してください。つまり、潜在的に異なるコードページ間で変換するか、マルチバイトUnicode文字のペナルティを受ける必要があります。

追加のテストケース

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

回答:


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]します。

それで、違いは何ですか?

ここで起こっているのは、Chakraが1最初の(そして唯一の)反復の最初のパラメーターとしてコールバック関数に渡される(との比較を要求1する0)一方で、V8とSpiderMonkeyが渡される0(との比較を要求0する1)ことです。

次のスニペットを使用して、ブラウザの動作を確認できます。


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まで反復し、n%i = 0であるすべての数値iの累積合計を保持します

動作の違いを引き起こすのは、最後の部分です。

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

JavaScriptでは、"$n"単なる文字列リテラルです。との比較>10は暗黙的に数値にキャストされますが、数値のように見えないため、NaNになります。NaNは、何らかの方法で数値と比較するとfalseになります。結果として、$d常に返されます。

ただし、PHPでは"$n"、の値を含む文字列です$n。PHPがこれを数値にキャストすると、単にの値になります$n。より大きい場合100ではなくが返され$dます。


7

05AB1E / ゼリー 9  8バイト

バイトコード(16進数):

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

ゼリーアップフロント3つのリンクなどにより与えられた意味のないバイトの効果にプログラム全体を解析し、ƭそして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

05AB1E /ゼリーですか?
エリック・ザ・アウトゴルファー

ええ、修正、ありがとう。私はただ説明を書いていました。
ジョナサンアラン

ÆḌSDバイトを保存します。
デニス

@デニス以上ÆḌSṚ
エリック・ザ・アウトゴルファー

@デニス-ありがとう、食事中に別の方法を考えた:)
ジョナサンアラン

6

Pythonの3 / パイソン264の 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ます。このコードは銀行家の丸めを悪用します。これは、Python 2ではなくPython 3によって実行されます。

オンラインでお試しください! Python 3(正しい)、Python 2(が間違っていますn > 10)。


必要ありません[ ]
officialaimm

6

Python 3 / Python 2バイト

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に評価を0パイソン2に、しかしのPython 3における小さな正の数(これは確かに必要な最大の真アップされた少なくとも)。

など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

オンラインでお試しください!

説明:

qJellyではサポートされていないため、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

@ Mr.Xcoder 05AB1Eでどのように機能мλSするかわかりません。
エリックアウトゴルファー

私が望むことを強調:P
Mr. Xcoder
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.