Đa số giả chia tổng số


23

Nhiệm vụ

Trong thử thách này, nhiệm vụ của bạn là viết chương trình bằng ngôn ngữ lập trình L lấy số nguyên dương n và đưa ra tổng các ước số thích hợp của n ( dãy A001065 trên OEIS). Nó sẽ trả về đầu ra chính xác cho bất kỳ 1 ≤ n 10 000 . Dưới đây là 10 đầu ra đầu tiên:

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

Hơn nữa, chương trình của bạn phải là một polyglot giả , có nghĩa là như sau. Nó là một chương trình có giá trị trong một ngôn ngữ lập trình L' , và cho mỗi đầu vào 1 ≤ n ≤ 10 (các trường hợp thử nghiệm ở trên), nó sẽ trả về tổng các ước thích hợp của n , nhưng có tồn tại một số 11 ≤ n ≤ 10 000 mà nó không trả về kết quả chính xác. Nó có thể trả về một cái gì đó không chính xác, lặp đi lặp lại mãi mãi, sự cố, vv Nó có thể đưa ra một kết quả sai cho tất cả n n 11 , đối với một số trong số chúng hoặc chỉ một.

Quy tắc và tính điểm

Bạn có thể viết một chương trình đầy đủ hoặc một chức năng và bạn có thể có các phương tiện nhập và xuất khác nhau bằng hai ngôn ngữ. Số byte thấp nhất sẽ thắng. Luật tiêu chuẩn được áp dụng. Trong thử thách này, các phiên bản chính hoặc cách triển khai ngôn ngữ khác nhau được coi là khác biệt.

Lưu ý rằng nếu bạn sử dụng các ngôn ngữ lập trình với mã hóa không phải ASCII (như nhiều ngôn ngữ trên trang web này), thì phải sử dụng cùng một chuỗi byte cho cả hai ngôn ngữ. Điều này có nghĩa là bạn phải chuyển đổi giữa các trang mã có khả năng khác nhau hoặc phải chịu hình phạt cho các ký tự Unicode nhiều byte.

Các trường hợp kiểm tra bổ sung

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

Câu trả lời:


10

JavaScript (ES6), V8 / SpiderMonkey vs Chakra , 66 63 byte

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

Bản giới thiệu

Đầu ra

Đầu ra của đoạn trích trên trên Chrome và Firefox (tất cả đều đúng):

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

Đầu ra trên Edge (tắt 1, bắt đầu từ n = 11):

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

Tại sao?

Không có thuật toán được áp đặt bởi các đặc điểm kỹ thuật cho .sort()phương pháp. Nó thậm chí không cần phải ổn định. Do đó, mỗi công cụ JavaScript sử dụng triển khai rất riêng của nó.

Tuy nhiên, [0,1].sort(x=>x) cho [0,1]với tất cả các động cơ.

Vậy sự khác biệt là gì?

Điều đang xảy ra ở đây là Chakra đang chuyển qua 1như là tham số đầu tiên của lần lặp đầu tiên (và duy nhất) cho chức năng gọi lại (yêu cầu so sánh 1với 0), trong khi V8 và SpiderMonkey đang vượt qua 0(yêu cầu so sánh 0với1 ).

Bạn có thể sử dụng đoạn mã sau để kiểm tra xem trình duyệt của bạn đang làm gì.


1
Đây là một giải pháp chấp nhận được. Tôi sẽ làm rõ nó trong bài chính.
Zgarb

8

Python 2 và Python 3, 58 byte

TIO cho Python 2

TIO cho Python 3

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

Nó hoạt động trong python 2, nhưng cứ n> 10 thì nó sẽ xuất 0 trong python 3.
Tất cả chỉ vì các cách tiếp cận khác nhau trong việc so sánh các chuỗi với byte:

  • trong Python 2 '' == b''
  • trong Python 3 '' != b''

7

JavaScript (Node.js)PHP , 73 70 byte

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

Trong cả hai ngôn ngữ, đây là một chức năng ẩn danh. JavaScript cho kết quả chính xác, nhưng PHP cho 0 cho tất cả n> = 11 .

Hãy thử nó đi!

Hãy dùng thử PHP!

Làm thế nào nó hoạt động

Cả hai ngôn ngữ đều làm điều tương tự lúc đầu: lặp từ 1 đến n-1, giữ tổng số chạy của tất cả các số i với n% i = 0 .

Điều gây ra sự khác biệt trong hành vi là phần cuối cùng:

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

Trong JavaScript, "$n"chỉ là một chuỗi ký tự. Việc so sánh >với 10nó biến nó thành một con số ngầm, nhưng vì nó không giống một con số, nó trở thành NaN. NaN cho sai khi so sánh với một số theo bất kỳ cách nào. Kết quả là, $dluôn luôn được trả lại.

Tuy nhiên, trong PHP, "$n"là một chuỗi chứa giá trị của $n. Khi PHP chuyển nó thành một số, nó đơn giản trở thành giá trị của $n. Nếu nó lớn hơn 10, thì 0được trả lại thay vì $d.


7

05AB1E / Jelly ,  9  8 byte

Mã byte (thập lục phân):

d1 a8 4f 71 0d ad 53 fa

Sử dụng trang mã của Jelly trả về kết quả không chính xác cho bất kỳ số lượng quá mức nào (ví dụ: đầu vào 12 trả về 12thay vì 16):

ẎƭOqÆḌS«

Hãy thử trực tuyến!

Sử dụng trang mã của 05AB1E trả về kết quả chính xác:

ѨOqмλSú

Hãy thử trực tuyến!

Làm sao?

05AB1E phân tích cú pháp lên đến và bao gồm 71( q) hướng dẫn thoát và sau đó dừng phân tích cú pháp:

Ѩ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 phân tích toàn bộ chương trình trước ba liên kết do ảnh hưởng của các byte mà không có nghĩa được gán ƭqđóng vai trò là các dấu phân cách. Điểm vào của chương trình là liên kết cuối cùng:

Ẏ - 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

Đó là 05AB1E / Jelly?
Erik the Outgolfer

Vâng, đã sửa, cảm ơn; Tôi chỉ đang viết lên lời giải thích.
Jonathan Allan

ÆḌSDtiết kiệm một byte.
Dennis

@Dennis Hoặc tốt hơn ÆḌSṚ.
Erik the Outgolfer

@Dennis - cảm ơn, nghĩ về một cách khác trong khi ăn :)
Jonathan Allan

6

Python 3 / Python 2 , 64 60 58 byte

Cảm ơn @officialaimm đã tắt 2 byte

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

Trong Python 3, điều này cho kết quả chính xác. Trong Python 2, ouput là sai đối với đầu vào vượt quá 10. Mã khai thác làm tròn ngân hàng, được thực hiện bởi Python 3 nhưng không phải bởi Python 2.

Hãy thử trực tuyến! Python 3 (đúng), Python 2 (sai cho n > 10).


Bạn sẽ không cần [ ].
chính thức tuyên bố

6

Python 3 / Python 2 , 47 byte

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

Một hàm không tên, giả mạo trong Python 2.

Dùng thử trực tuyến cho Python 3 hoặc Python 2

Trong Python 2 /là phép chia số nguyên với các đối số nguyên, trong khi ở Python 3, nó là phép chia.

Khi nvượt quá 10 10/n đánh giá thành 0 trong Python 2, nhưng với một số dương nhỏ trong Python 3 (điều này chắc chắn đúng với tối đa 10.000 yêu cầu tối thiểu).

Như vậy 10/n>0đánh giá lại để Truecho Python 3 và range(10/n>0,n)tương đương với range(1,n)thời gian bằng Python 2 10/n>0đánh giá lại để Falsekhi nvượt quá 10 và rồi range(10/n>0,n)trở nên tương đương với range(0,n)gây n%dcố gắng để thực hiện modulo số không số học, nuôi một ZeroDivisionError.


5

Jelly / 05AB1E , 12 byte

Những gì Jelly thấy:

11⁻iẎƭO}qÆḌS

Hãy thử trực tuyến!

Giải trình:

qkhông được hỗ trợ trong Jelly, vì vậy Jelly chỉ "nhìn thấy" những gì sau đó q.

ÆḌS
ÆḌ  Proper divisors
  S Sum

Những gì 05AB1E thấy:

11‹iѨO}qмλS

Hãy thử trực tuyến!

Giải trình:

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

Tất nhiên mọi thứ sau khi "bỏ" không thực sự xảy ra.


Tôi ước gì ÆḌSnó có giá trị riêng ... Câu trả lời phi thường!
Ông Xcoder

@ Mr.Xcoder Tôi không chắc cách thức мλShoạt động trong 05AB1E.
Erik the Outgolfer

Nhấn mạnh vào tôi muốn : P
Ông Xcoder
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.