Bölenleri test etmek için program yarılarını değiştir


19

Dört tamsayı dizisi

Bu meydan okumada, aşağıdaki dizilerle verilen pozitif bir tamsayının dört farklı özelliğini test edeceksiniz. Bir pozitif tam sayı , N olduğu

  1. Mükemmel ( OEIS A000396 ), uygun bölenler toplamı halinde N eşittir N . Dizi 6, 28, 496, 8128, 33550336, 8589869056, 137438691328, 2305843008139952128 ile başlar ...
  2. refactorable ( OEIS A033950 ), bir bölenler sayısı ise N bir bölen bir N . Dizi 1, 2, 8, 9, 12, 18, 24, 36, 40, 56, 60, 72, 80, 84, 88, 96, 104, 108, 128 ... ile başlar.
  3. Pratik ( OEIS A005153 ), her tam sayı ise 1 ≤ K ≤ K bazı belirgin Bölen toplamıdır N . Dizi 1, 2, 4, 6, 8, 12, 16, 18, 20, 24, 28, 30, 32, 36, 40, 42, 48, 54, 56 ... ile başlar.
  4. yüksek bileşik ( OEIS A002128 ), her sayı ise 1 ≤ K <N kesin daha az bölenler sahip N . Dizi 1, 2, 4, 6, 12, 24, 36, 48, 60, 120, 180, 240, 360, 720, 840, 1260, 1680, 2520, 5040 ile başlar ...

Dört program

Senin görevin dört program yazmak (yani tam programlar, fonksiyon tanımları veya standart yöntemlerden herhangi biriyle I / O gerçekleştiren anonim fonksiyonlar ). Her program, bu dizilerden birinin üyelik sorununu çözecektir. Başka bir deyişle, her program girdi olarak pozitif bir N ≥ 1 tamsayısı alır ve N dizide ise doğruluk değeri ve değilse yanlış bir değer verir. N'nin programlama dilinizin standart tamsayı türünün sınırları içinde olduğunu varsayabilirsiniz .

Programlar aşağıdaki şekilde ilişkilendirilmelidir. Öyle dört dize var ABCDki

  1. AC mükemmel sayıları tanıyan programdır.
  2. AD düzeltilebilir sayıları tanıyan programdır.
  3. BC pratik sayıları tanıyan programdır.
  4. BD yüksek oranda kompozit sayıları tanıyan programdır.

puanlama

Skorunuz dizelerin toplam uzunluğudur (bayt cinsinden), ABCDdiğer bir deyişle dört programın toplam bayt sayısının ikiye bölünmesiyle elde edilir. Her programlama dilinde en düşük puan kazanır. Standart kuralları geçerlidir.

Dört dizeyse Örneğin a{, b{n, +n}ve =n}?, daha sonra dört programlardır a{+n}, a{=n}?, b{n+n}ve b{n=n}?ve skoru 2 + 3 + 3 + 4 = 12'dir.


Yanıtlar:


6

+ 6 + 36 = JavaScript (ES6), 46 + 55 282 274 ... 158 143 bayt

A:

n=>(r=0,D=x=>x&&D(x-1,n%x||(r++?q-=x:q=n)))(n)

B:

n=>(q=(g=D=x=>x&&!(n%x||(g|=m>2*(m=x),0))+D(x-1))(m=n))

C:

?!g:!q

D:

?(P=k=>--k?D(n=k)<q&P(k):1)(n):n%r<1

Sonuç vermek truthy / ilgili girişler için falsy değerleri (4 anonim fonksiyonları AC, ADve BCvermek true/ false, BDverir 1/ 0).

Test snippet'i


1
Ben gerçek kodu tüm 4 bölüme yaymak gibi ve benden farklı olarak "koşullu" ile karışık gibi (Ben A ve B parçaları ve C ve D parçaları üzerinde "koşullu" kodu var)
Erik Outgolfer

2

Jöle , 8 + 17 + 2 1 + 2 = 29 28 bayt

A:

Æṣ⁼$Ædḍ$

B:

ÆDŒPS€QṢwRµṖÆdṀ<Ʋ

C:

ƭ

D:

0?

Pratik sayılar için (BC), 0sahtedir ve diğer sonuçlar doğrudur.

AC ve BC tam programlardır, çünkü işlev olarak tekrar kullanılamazlar.


BC ve BD düzgün çalışmıyor gibi görünüyor.
Jonathan Allan

ÆDŒPS€ḟ@RṆµṖÆd<ÆdẠµiki baytlık bir maliyetle B olarak çalışır (ve BC'nin 0 ve 1'i sadece diğerleri gibi döndürmesini sağlar).
Jonathan Allan

Oh hayır @JonathanAllan, ben şaşkın görünüyor ŒPile ŒṖ. Ne utanç! Bunu düzeltirseniz çalışır mı? (yani yeni düzenlememi deneyin) Zaten test etmek çok kolay değil, bu yüzden henüz bir TIO bağlantısı eklemedim.
Outgolfer Erik

0

Haskell , 69 + 133 + 3 + 3 = puan 208

A:

d n=filter((<1).mod n)[1..n]
f n=[sum(d n)-n==n,length(d n)`elem`d n]

B:

import Data.List
d n=filter((<1).mod n)[1..n]
f n=[all(\n->any(==n)$sum$subsequences$d n)[1..n],all((<length(d n)).length.d)[1..n-1]]

C:

!!0

D:

!!1

Çevrimiçi deneyin!

Evet, oldukça ucuz ama daha havalı bir çözüm için yeterince akıllı değilim. : P


1
Haskell hakkında çok şey bilmiyorum ama bu size yardımcı olabilirsubsequences
Asone Tuhid

[x|x<-[1..n],mod n x<1]daha kısadır filter((<1).mod n)[1..n].
Laikoni
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.