Sahte bölen toplamı


23

Görev

Bu meydan okuma olarak, görev bir programlama dili bir program yazmaktır L pozitif bir tamsayı alır n ve uygun bölenler toplamını verir n ( sekans A001065 OEIS üzerine). Herhangi bir 1 ≤ 10 000 için doğru çıkışı döndürmelidir . İşte ilk 10 çıktı:

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

Ayrıca, programınız sahte poliglot olmalı , bu da aşağıdaki anlamına gelir. Başka programlama dili geçerli bir programdır L' , ve her bir giriş için 1 ≤ n ≤ 10 (test durumları üzerinde), bu uygun bölenler toplamını verir n , ancak bazı vardır 11 ≤ n ≤ 10 000 olan doğru sonucu döndürmez. Yanlış bir şey döndürebilir, sonsuza dek döngü yapabilir, çökebilir vb. Bazıları için veya sadece bir tanesi için tüm n-11 için yanlış sonuç verebilir .

Kurallar ve puanlama

Tam bir program veya fonksiyon yazabilir ve iki dilde farklı giriş ve çıkış araçlarına sahip olabilirsiniz. En düşük bayt sayısı kazanır. Standart kuralları geçerlidir. Bu mücadelede, bir dilin farklı ana sürümleri veya uygulamaları farklı olarak kabul edilir.

ASCII olmayan kodlamaları olan programlama dilleri kullanıyorsanız (bu sitede olduğu gibi) aynı bayt dizisinin her iki dil için de kullanılması gerektiğini unutmayın. Bu, potansiyel olarak farklı kod sayfaları arasında dönüşüm yapmanız veya çok baytlık Unicode karakterler için ceza almanız gerektiği anlamına gelir.

Ek test durumları

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

Yanıtlar:


10

JavaScript (ES6), V8 / SpiderMonkey vs Çakra , 66 63 bayt

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

gösteri

Çıktı

Yukarıdaki kod parçasının Chrome ve Firefox'ta çıktısı (tümü doğru):

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

Kenardan Çıkış (n = 11 ile başlayan 1 ile kapalı):

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

Niye ya?

.sort()Metodun spesifikasyonu için herhangi bir algoritma yoktur . Kararlı olması bile gerekmiyor. Bu nedenle, her JavaScript motoru kendi uygulamasını kullanır.

Ancak [0,1].sort(x=>x)verir [0,1]tüm motorlarla.

Öyleyse fark nedir?

Burada meydana gelen şey, Çakra'nın 1ilk (ve sadece) yinelemenin ilk parametresi olarak geri çağırma işlevine geçmesi ( bununla bir karşılaştırma 1yapmayı istemesi 0), V8 ve SpiderMonkey geçerken 0(ile bir karşılaştırma 0yapmayı istemek 1).

Tarayıcınızın ne yaptığını kontrol etmek için aşağıdaki pasajı kullanabilirsiniz.


1
Bu kabul edilebilir bir çözümdür. Ana yazıdaki durumu açıklığa kavuşturacağım.
Zgarb

8

Python 2 ve Python 3, 58 bayt

Python 2 için TIO

Python 3 için TIO

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

Python 2'de çalışır, ancak her n> 10 için python 3'te 0 çıktısını alır.
Bunların tümü, dizeleri baytlarla karşılaştırırken farklı yaklaşımlar bulunduğundan:

  • Python 2'de '' == b''
  • Python 3'te '' != b''

7

JavaScript (Node.js) ve PHP , 73 70 bayt

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

Her iki dilde de bu isimsiz bir işlevdir. JavaScript doğru sonucu verir, ancak PHP n> = 11 için 0 verir .

Deneyin JS!

Deneyin PHP!

Nasıl çalışır

Her iki dil de ilk önce aynı şeyi yapar: 1'den n'ye 1'e kadar yinelenir, bunun için n% i = 0 olan tüm i sayılarının toplamını tutar .

Davranıştaki farklılığa neden olan son kısımdır:

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

JavaScript'te, "$n"yalnızca bir dizgi değişmezdir. Karşılaştırma >, 10onu bir sayıya dolaylı olarak vurur, ancak sayı gibi görünmediğinden NaN olur. NaN, herhangi bir şekilde bir sayıyla karşılaştırıldığında yanlış verir. Sonuç olarak, $dher zaman iade edilir.

Ancak, PHP'de "$n"değerini içeren bir dizedir $n. PHP bunu sayıya çevirdiğinde, basitçe değeri olur $n. Büyük ise 10, o zaman 0yerine döndürülür $d.


7

05AB1E / Jelly ,  9  8 bayt

Bayt kodu (onaltılık):

d1 a8 4f 71 0d ad 53 fa

Jelly'in kod sayfasını kullanmak , herhangi bir aşırı sayı için yanlış sonuç döndürür (örneğin, yerine 12 dönüş girişi ):1216

ẎƭOqÆḌS«

Çevrimiçi deneyin!

05AB1E'nin kod sayfasını kullanmak doğru sonuçlar verir:

ѨOqмλSú

Çevrimiçi deneyin!

Nasıl?

05AB1E, ayrılmayı bildiren ve sonra ayrıştırmayı durduran 71( q) işaretini içeren ve bunlara dahil olanları ayrıştırır:

Ѩ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

Jöle up-front üç bağlantılar olarak sebebiyle atanmış bir anlamı olmayan bayt etkisine bütün programı ayrıştırır ƭve qsınırlayıcı olarak hareket. Bir programın giriş noktası son bağlantı:

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

Bu 05AB1E / Jelly mi?
Outgolfer Erik,

Evet, sabit, teşekkürler; Ben sadece açıklama yazıyordum.
Jonathan Allan,

ÆḌSDbir bayt kaydeder.
Dennis,

@Dennis Veya daha iyi ÆḌSṚ.
Outgolfer Erik,

@Dennis - teşekkürler, yemek yerken farklı bir yol düşündüm :)
Jonathan Allan

6

Python 3 / Python 2 , 64 60 58 bayt

@Officialaimm 2 byte kapalı teşekkürler

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

Python 3'te bu doğru sonuçları verir. Python 2'de çıkışlar aşan girişler için yanlış 10. Kod, Python 3 tarafından yapılan ancak Python 2 tarafından yapılan bankacılığın yuvarlamasını kullanır.

Çevrimiçi deneyin! Python 3 (doğru), Python 2 (yanlış için n > 10).


İhtiyacın olmayacak [ ].
officialaimm

6

Python 3 / Python 2 , 47 bayt

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

Adsız bir işlev, Python 2'de sahte.

Python 3 veya Python 2 için çevrimiçi deneyin

Python 2'de /, tamsayı argümanlarına sahip bir tamsayı bölümü, Python 3'te ise bölünmedir.

Tüm naşan 10 10/n olarak değerlendirilen 0 Python 2'de, ancak Python 3 küçük pozitif bir sayı için (bu, gerekli en doğru yukarı kesinlikle 10,000 , en az).

Gibi Python 3 için 10/n>0değerlendirir Trueve range(10/n>0,n)eşittir range(1,n)Python 2 ise 10 aştığı zaman 10/n>0değerlendirir; bunun üzerine eşdeğer hale gelir, böylece modulo sıfır aritmetik gerçekleştirmeye çalışarak a yükselir .Falsenrange(10/n>0,n)range(0,n)n%dZeroDivisionError


5

Jöle / 05AB1E , 12 bayt

Jelly ne görür:

11⁻iẎƭO}qÆḌS

Çevrimiçi deneyin!

Açıklama:

qJelly'de desteklenmiyor, bu yüzden Jelly sadece ondan sonra olanları görüyor q.

ÆḌS
ÆḌ  Proper divisors
  S Sum

05AB1E'nin gördüğü şey:

11‹iѨO}qмλS

Çevrimiçi deneyin!

Açıklama:

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

Tabii ki "istifa" sonrası her şey aslında olmaz.


Keşke ÆḌSkendi başına geçerli olsaydı ... Olağanüstü cevap!
Bay Xcoder

@ Mr.Xcoder 05AB1E'de nasıl мλSçalışacağını bilmiyorum.
Outgolfer Erik

Keşke üzerinde diliyorum : P
Bay Xcoder
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.