가짜 제수 합 폴리 글 로트


23

작업

이 도전 해당 태스크는 프로그래밍 언어로 프로그램을 작성하는 L 은 양의 정수를 취 N , 그리고 적절한 약수의 합 출력 N ( 시퀀스 A001065 OEIS 온). 1 ≤ n ≤ 10 000에 대해 올바른 출력을 반환해야합니다 . 처음 10 개의 출력은 다음과 같습니다.

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

또한 프로그램은 가짜 polyglot 이어야하며 이는 다음을 의미합니다. 다른 프로그래밍 언어 L ' 의 유효한 프로그램이며 각 입력 1 ≤ n ≤ 10 (위의 테스트 사례)에 대해 적절한 제수 n 의 합을 반환 하지만 약 11 ≤ n ≤ 10 000 이 있습니다. 올바른 결과를 반환하지 않습니다. 그것은 잘못된 것을 반환하고, 영원히 루프하고, 충돌하는 등의 일을 할 수 있습니다. 모든 n ≥ 11 , 일부 또는 하나에 대해 잘못된 결과를 줄 수 있습니다 .

규칙과 득점

전체 프로그램 또는 함수를 작성할 수 있으며 두 언어로 다른 입력 및 출력 수단을 가질 수 있습니다. 가장 낮은 바이트 수가 이깁니다. 표준 규칙이 적용됩니다. 이 과제에서, 언어의 다른 주요 버전이나 구현은 별개의 것으로 간주됩니다.

ASCII가 아닌 인코딩으로이 언어를 사용하는 프로그래밍 언어를 사용하는 경우 (이 사이트에서 많은 것처럼), 두 언어 모두 동일한 바이트 시퀀스를 사용해야합니다. 즉, 잠재적으로 다른 코드 페이지간에 변환하거나 멀티 바이트 유니 코드 문자에 대한 처벌을 받아야합니다.

추가 테스트 사례

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

답변:


10

자바 스크립트 (ES6), V8 / SpiderMonkey vs Chakra , 66 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]

Edge 출력 (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(비교를 요청하는 콜백 함수에 최초로 유일한 반복의 첫 번째 매개 변수로 10V8과의 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)

파이썬 2에서는 작동하지만 n> 10마다 파이썬 3에서는 0을 출력
합니다. 문자열과 바이트를 비교하는 다른 접근법 때문에 모두 :

  • 파이썬 2에서 '' == b''
  • 파이썬 3에서 '' != b''

7

JavaScript (Node.js)PHP , 73 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까지의 모든 숫자의 누적 합계 유지 내가 있는 내가 0 = N %를 .

행동의 차이를 일으키는 원인은 마지막 부분입니다.

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

JavaScript에서 "$n"문자열 리터럴입니다. 와의 비교 >10암시 적으로 숫자 로 캐스트하지만 숫자처럼 보이지 않으므로 NaN이됩니다. NaN은 어떤 식 으로든 숫자와 비교할 때 거짓을 제공합니다. 결과적으로$d 항상 반환됩니다.

그러나 PHP에서는 "$n"값이 포함 된 문자열입니다 $n. PHP가 이것을 숫자로 캐스트하면 단순히 값이 $n됩니다. 그것보다 더 있다면 10, 다음 0대신 반환됩니다 $d.


7

05AB1E / 젤리 ,  9  8 바이트

바이트 코드 (16 진수) :

d1 a8 4f 71 0d ad 53 fa

사용 젤리의 코드 페이지 것은 어떤에 대한 잘못된 결과를 반환 과도한 번호 (예 : 입력 (12 명) 을 반환 12하는 대신을 16) :

ẎƭOqÆḌS«

온라인으로 사용해보십시오!

05AB1E의 코드 페이지를 사용하면 올바른 결과가 반환됩니다.

ѨOqмλSú

온라인으로 사용해보십시오!

방법?

05AB1E는 종료를 지시 한 다음 구문 분석을 중지 하는 71( q)까지 구문 분석합니다.

Ѩ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

젤리 선행 세 개의 링크로 인해 할당 된 의미없는 바이트의 영향으로 전체 프로그램을 분석, ƭ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 / Jelly입니까?
아웃 골퍼 에릭 14

네, 고마워요. 방금 설명을 작성하고있었습니다.
Jonathan Allan

ÆḌSD바이트를 저장합니다.
Dennis

@Dennis 또는 더 나은 ÆḌSṚ.
Outgolfer Erik 14

@Dennis-고마워요, 먹는 동안 다른 방법을 생각했습니다 :)
Jonathan Allan

6

파이썬 3 / 파이썬 2 , 64 60 58 바이트

2 바이트 오프에 대한 @officialaimm 덕분에

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

Python 3에서는 올바른 결과를 제공합니다. 파이썬 2에서는 출력이 초과하는 입력에 대해 출력이 잘못되었습니다10 . 이 코드는 뱅커의 반올림을 이용하는데, 이는 Python 3이 아니라 Python 2가 수행합니다.

온라인으로 사용해보십시오! Python 3 (올바름), Python 2 (올바르지 않음 n > 10).


필요하지 않습니다 [ ].
officialaimm

6

파이썬 3 / 파이썬 2 , 47 바이트

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

명명되지 않은 함수, 파이썬 2에서 가짜.

Python 3을 온라인으로 사용해 보거나 Python 2에서

파이썬 2에서 / 정수 인수로 정수 나누기를하는 반면, 파이썬 3에서는 나누기입니다.

경우 n초과 10 개 10/n 평가 0 파이썬 2하지만 파이썬 3에 작은 양수가 (이것은 요구되는 최대 사실까지 확실히 10,000 적어도는).

이와 같이 10/n>0평가 True파이썬 3과 range(10/n>0,n)동등 range(1,n)하면서 파이썬 (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

물론 "quit"이후의 모든 것은 실제로 발생하지 않습니다.


나는 ÆḌS그 자체로도 유효 했으면 좋겠다 ... 특별한 답변!
Mr. Xcoder

@ Mr.Xcoder 05AB1E мλS에서 어떻게 작동 하는지 잘 모르겠습니다 .
아웃 골퍼 에릭

내가 원하는 바를 강조 한다 : P
씨 Xcoder
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.