Zamień połówki programu, aby przetestować dzielniki


19

Cztery sekwencje całkowite

W tym wyzwaniu przetestujesz cztery różne właściwości dodatniej liczby całkowitej, podane w poniższych sekwencjach. Dodatnia liczba całkowita N to

  1. idealny ( OEIS A000396 ), jeżeli suma właściwych dzielników N równa N . Sekwencja zaczyna się od 6, 28, 496, 8128, 33550336, 8589869056, 137438691328, 2305843008139952128 ...
  2. refactorable ( OEIS A033950 ), jeżeli liczba dzielników N jest dzielnikiem N . Sekwencja zaczyna się od 1, 2, 8, 9, 12, 18, 24, 36, 40, 56, 60, 72, 80, 84, 88, 96, 104, 108, 128 ...
  3. praktyczne ( OEIS A005153 ), jeżeli każda liczba całkowita 1 ≤ K ≤ N jest sumą kilku różnych dzielników N . Sekwencja zaczyna się od 1, 2, 4, 6, 8, 12, 16, 18, 20, 24, 28, 30, 32, 36, 40, 42, 48, 54, 56 ...
  4. bardzo kompozytowy ( OEIS A002128 ), jeżeli każda liczba 1 ≤ K <N jest mniej dokładnie niż dzielników N . Sekwencja zaczyna się od 1, 2, 4, 6, 12, 24, 36, 48, 60, 120, 180, 240, 360, 720, 840, 1260, 1680, 2520, 5040 ...

Cztery programy

Twoim zadaniem jest napisanie czterech programów (co oznacza pełne programy, definicje funkcji lub anonimowe funkcje, które wykonują operacje we / wy dowolną ze standardowych metod ). Każdy program rozwiązuje problem członkostwa jednej z tych sekwencji. Innymi słowy, każdy program przyjmuje na wejściu dodatnią liczbę całkowitą N ≥ 1 i wyświetla prawdziwą wartość, jeśli N jest w sekwencji, i wartość fałsz, jeśli nie. Możesz założyć, że N mieści się w granicach standardowego typu liczb całkowitych twojego języka programowania.

Programy muszą być powiązane w następujący sposób. Istnieją cztery ABCDtakie ciągi znaków

  1. AC to program, który rozpoznaje idealne liczby.
  2. AD to program, który rozpoznaje numery refaktoryzowane.
  3. BC to program, który rozpoznaje liczby praktyczne.
  4. BD to program, który rozpoznaje wysoce złożone liczby.

Punktacja

Twój wynik to całkowita długość (w bajtach) ciągów ABCD, lub innymi słowy, całkowita liczba bajtów czterech programów podzielona przez dwa. Najniższy wynik w każdym języku programowania jest zwycięzcą. Obowiązują standardowe zasady .

Na przykład, jeśli cztery łańcuchy są a{, b{n, +n}i =n}?, następnie cztery programy a{+n}, a{=n}?, b{n+n}a b{n=n}?, a wynik 2 + 3 + 3 + 4 = 12.


Odpowiedzi:


6

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

ZA:

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

DO:

?!g:!q

RE:

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

Rezultatem jest 4 anonimowe funkcje, które dają truthy / wartości falsy dla swoich wejściach ( AC, ADi BCdać true/ false, BDdaje 1/ 0).

Testowy fragment kodu


1
Podoba mi się, jak rozłożyłeś rzeczywisty kod na wszystkie 4 części i zmiksowałeś go z „warunkami” w przeciwieństwie do mnie (mam kod na częściach A i B oraz „warunki” na częściach C i D.)
Erik Outgolfer

2

Galaretka , 8 + 17 + 2 1 + 2 = 29 28 bajtów

ZA:

Æṣ⁼$Ædḍ$

B:

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

DO:

ƭ

RE:

0?

Dla liczb praktycznych (BC) 0jest fałszem, a każdy inny wynik jest prawdziwy.

AC i BC są pełnymi programami, ponieważ nie można ich ponownie wykorzystywać jako funkcji.


BC i BD nie działają poprawnie.
Jonathan Allan,

ÆDŒPS€ḟ@RṆµṖÆd<ÆdẠµdziała jako B za koszt dwóch bajtów (i sprawia, że ​​BC zwraca 0 i 1 tylko tak jak inne).
Jonathan Allan,

@JonathanAllan Oh nie, wydaje się, że mylić ŒPz ŒṖ. Jaka szkoda! Czy to działa, jeśli to naprawisz? (tj. wypróbuj moją nową edycję) To nie jest tak, że bardzo łatwo jest przetestować, dlatego nie dodałem jeszcze linku TIO.
Erik the Outgolfer

0

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

ZA:

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

DO:

!!0

RE:

!!1

Wypróbuj online!

Tak, jest dość tani, ale nie jestem wystarczająco inteligentny, by znaleźć fajniejsze rozwiązanie. : P


1
Nie wiem wiele o Haskell, ale może ci to pomócsubsequences
Asone Tuhid

[x|x<-[1..n],mod n x<1]jest krótszy niż filter((<1).mod n)[1..n].
Laikoni
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.