Weź dodatnią liczbę całkowitą X
. Ta liczba jest częścią sekwencji, która nas interesuje, jeśli suma wszystkich cyfr X
jest dzielnikiem X
, a jeśli iloczyn wszystkich cyfr X
jest dzielnikiem X
.
Na przykład 135
jest taką liczbą, ponieważ 1 + 3 + 5 = 9
która dzieli, 135 = 9 * 15
a 1 * 3 * 5 = 15
która również dzieli 135
.
Jest to sekwencja A038186 w OEIS.
Twoje zadanie: biorąc pod uwagę liczbę całkowitą N
, wypisz N
th dodatnią liczbę całkowitą o takich właściwościach.
Wejścia i wyjścia
Liczby mogą być
0
indeksowane lub1
indeksowane; proszę wskazać, którego z nich używa Twoja odpowiedź.Dane wejściowe mogą być pobierane
STDIN
jako argument funkcji lub coś podobnego.Wyjście może być wydrukowane
STDOUT
, zwrócone z funkcji lub coś podobnego.
Przypadki testowe
Przypadki testowe poniżej są 1
indeksowane.
Input Output
1 1
5 5
10 12
20 312
42 6912
50 11313
Punktacja
To jest golf golfowy , więc wygrywa najkrótsza odpowiedź w bajtach.
źródło
0
.Odpowiedzi:
05AB1E ,
1312 bajtówDzięki Emignie za uratowanie bajtu!
Wyjaśnienie:
Wykorzystuje kodowanie CP-1252 . Wypróbuj online!
źródło
µNNSONSP‚ÖP½
działa również, prawda?Pyke, 14 bajtów (niekonkurencyjny) (1-indeksowany)
Wypróbuj tutaj!
Mój Boże, wiele nowych funkcji.
Z których są niekonkurencyjne
I
którym byłoby to sprawdzić tylko wtedy, gdy pierwszy element na stosie było truthydigits
- zwraca listę cyfr w numerze@
używane, aby uzyskać n-ty element nieskończonej listyZ których zastosowano po raz pierwszy:
Usuń ostatnie 2 bajty, aby uzyskać wszystkie te liczby.
źródło
C #, 118 bajtów
Pełny program z funkcją niepolowania i przypadków testowych:
źródło
for(int x=0,c=0;;)
oszczędza 1 bajt.Galaretka , 13 bajtów
Na podstawie 1.
TryItOnline!
W jaki sposób?
źródło
Perl 6 , 44 bajty (indeksowane 0)
Wyjaśnienie:
Nieskończone listy ftw!
źródło
*
oznaczałoby więcej bajtów.//0
wgrep
bloku.//0
używałem, ponieważ zwykle jest to akceptowane w codegolf do drukowania na stderr.//0
Właściwie 20 bajtów
Naiwna implementacja definicji sekwencji. Zapraszamy do gry w golfa! Wypróbuj online!
Ungolfing
źródło
Meduza , 45 bajtów
Wypróbuj online!
Wyjaśnienie
To zdecydowanie najbardziej rozbudowany (i zarazem najdłuższy) program, jaki do tej pory napisałem w Jellyfish. Nie mam pojęcia, czy będę w stanie to naprawić w zrozumiały sposób, ale chyba będę musiał spróbować.
Meduza zapewnia dość ogólny operator iteracji
\
, który bardzo pomaga w „znalezieniu N-tego czegoś ”. Jedną z jego semantyek jest „iteracja funkcji na wartości, dopóki osobna funkcja testowa nie da czegoś prawdziwego” (w rzeczywistości funkcja testowa odbiera zarówno bieżący, jak i ostatni element, ale sprawimy, że spojrzy tylko na bieżący element) . Możemy to wykorzystać do zaimplementowania funkcji „następny ważny numer”. Kolejnym przeciążeniem\
jest „iteracja funkcji na wartości początkowej N razy”. Możemy użyć naszej poprzedniej funkcji i iterować ją0
N razy, gdzie N jest wejściem. Wszystko to jest skonfigurowane dość zwięźle z tą częścią kodu:(Powody, dla
0
których faktyczne dane wejściowe do wynikowej funkcji są tam, są nieco skomplikowane i nie będę tu wchodził.)Problem polega na tym, że nie będziemy ręcznie przekazywać bieżącej wartości do funkcji testowej.
\
Operator zrobi to za nas. Mamy teraz skonstruowaną pojedynczą funkcję jednoargumentową (poprzez kompozycje, haczyki, widelce i curry), która pobiera liczbę i mówi nam, czy jest to poprawna liczba (tj. Ta, która jest podzielona przez sumę cyfr i iloczyn cyfrowy). Jest to dość nietrywialne, gdy nie można odnieść się do argumentu. Zawsze. To jest to piękno:(
To jednoskładnikowa, hak , co oznacza, że wywołuje funkcję (poniżejf
) na wejściu (wartość bieżącax
), a następnie przechodzi oboje do funkcji testowej w prawo (g
), to jest to obliczag(f(x), x)
.W naszym przypadku
f(x)
jest to kolejna funkcja złożona, która uzyskuje parę z iloczynem cyfr i sumą cyfrx
. Oznacza to,g
że będzie funkcją, która ma wszystkie trzy wartości, aby sprawdzić, czyx
jest poprawna.Zaczniemy od przyjrzenia się, jak
f
oblicza sumę cyfr i iloczyn cyfrowy. To jestf
:&
to także kompozycja (ale na odwrót).~
jest curry, więc10~b
daje funkcję, która oblicza cyfry dziesiętne liczby, a ponieważ przekazujemy to&
od prawej, to pierwsza rzecz, która stanie się z danymi wejściowymix
. Pozostała część wykorzystuje tę listę cyfr do obliczenia ich sumy i produktu.Aby obliczyć sumę, możemy nad nią dodać wartość dodaną, to znaczy
/+
. Podobnie, aby obliczyć iloczyn, składamy na nim mnożenie/*
. Aby połączyć oba te wyniki w parę, używamy pary haczyków(
i)
. Struktura tego jest następująca:(Gdzie
f
ig
są odpowiednio iloczynem i sumą.) Spróbujmy dowiedzieć się, dlaczego daje nam to paręf(x)
ig(x)
. Zauważ, że prawy haczyk)
ma tylko jeden argument. W tym przypadku sugerowany jest drugi argument,;
który owija swoje argumenty w parę. Ponadto haki mogą być również używane jako funkcje binarne (co będzie miało miejsce w tym przypadku), w którym to przypadku po prostu stosują funkcję wewnętrzną tylko do jednego argumentu. Tak naprawdę)
na jednej funkcjig
daje funkcję, która się oblicza[x, g(y)]
. Używając tego w lewym haczyku, wraz zf
, otrzymujemy[f(x), g(y)]
. To z kolei jest używane w kontekście jednoargumentowym, co oznacza, że tak naprawdę jest wywoływane za pomocą,x == y
więc kończymy[f(x), g(x)]
na wymaganym. UffPozostaje tylko jedna rzecz, która była naszą wcześniejszą funkcją testową
g
. Przypomnijmy, że będzie on wywoływany, ponieważg([p, s], x)
gdziex
wciąż jest aktualna wartość wejściowa,p
jest to iloczyn cyfrowy is
suma cyfr. To jestg
:Aby przetestować podzielność, oczywiście użyjemy modulo, które znajduje się
|
w meduzach. Niecodziennie bierze swój prawostronny modulo lewostronny, co oznacza, że argumentyg
są już we właściwej kolejności (funkcje arytmetyczne takie jak ten automatycznie przewijają listy, więc to obliczy dwa osobne moduły za darmo) . Nasza liczba jest podzielna przez iloczyn produktu i sumy, jeśli wynikiem jest para zer. Aby sprawdzić, czy tak jest, traktujemy tę parę jako listę cyfr składających się z 2 cyfr (d
). Wynik tego wynosi zero, tylko gdy oba elementy pary są równe zero, więc możemy zanegować wynik this (N
), aby uzyskać prawdziwą wartość, czy obie wartości dzielą dane wejściowe. Należy zauważyć, że|
,d
iN
są po prostu złożone razem z parą&
s.Niestety, to nie jest pełna historia. Co jeśli iloczyn cyfrowy to zero? Dzielenie i modulo przez zero zwracają zero w meduzach. Chociaż może się to wydawać nieco dziwną konwencją, w rzeczywistości okazuje się być nieco przydatne (ponieważ nie musimy sprawdzać zera przed wykonaniem modulo). Oznacza to jednak również, że możemy uzyskać fałszywie dodatni wynik, jeśli suma cyfr dzieli dane wejściowe, ale iloczyn cyfrowy wynosi zero (np. Dane wejściowe
10
).Możemy to naprawić, mnożąc nasz wynik podzielności przez iloczyn cyfrowy (więc jeśli iloczyn cyfrowy to zero, to zmieni naszą prawdziwą wartość również na zero). Okazuje się, że łatwiej jest pomnożyć wynik podzielności przez parę produktu i sumę, a następnie wyodrębnić wynik z produktu.
Aby pomnożyć wynik przez parę, musimy nieco wrócić do wcześniejszej wartości (pary). Odbywa się to za pomocą fork (
]
). Widelce są trochę jak haczyki na sterydach. Jeśli dasz im dwie funkcjef
ig
, reprezentują one funkcję binarną, która się obliczaf(a, g(a, b))
. W naszym przypadkua
jest to para produkt / suma,b
jest bieżącą wartością wejściową,g
jest naszym testem podzielności if
jest pomnożeniem. Wszystko to oblicza[p, s] * ([p, s] % x == [0, 0])
.Teraz pozostaje tylko wyodrębnić pierwszą wartość tego, która jest końcową wartością funkcji testowej użytej w iteratorze. Jest to tak proste, jak skomponowanie (
&
) rozwidlenia za pomocą funkcji head<
, która zwraca pierwszą wartość listy.źródło
R,
132115 bajtówNowa wersja dzięki ładnym komentarzom @Billywob!
Nie golfowany:
Ponieważ R zachowują się dziwnie zNA
s, musiałem dodać całąifelse(is.na(...))
część!Albo użyj
na.omit(...)
źródło
n=scan();b=i=0;while(i<n){b=b+1;d=strtoi(el(strsplit(c(b,""),"")));if(!b%%sum(d)&ifelse(is.na((p=!b%%prod(d))),F,p))i=i+1};b
zapisuje kilka bajtów przez:el(...)
zamiast[[1]]
, używającc(b,"")
zamiastpaste(b)
, negując wyrażenia logiczne,!
zamiast==0
i pomijając nawiasy klamrowe wif
instrukcji. Domyślam się, że powinien istnieć łatwiejszy sposób poradzenia sobie z tymNA
problemem, ale nie mogłem wymyślić czegoś sprytnego.0
do wyrażenia ocenianego wif
instrukcji. Zwraca jednak ostrzeżenie, gdy produkt nie jest równy0
.n=scan();b=i=0;while(i<n){b=b+1;d=strtoi(el(strsplit(c(b,""),"")));if(na.omit(c(!b%%sum(d)&!b%%prod(d),0)))i=i+1};b
el(...)
!Brachylog , 22 bajty
Wypróbuj online!
Wyjaśnienie
źródło
JavaScript (ES6), 78
Mniej golfa
źródło
Pyth, 18 bajtów
Wypróbuj online: demonstracja
Wyjaśnienie:
źródło
JavaScript (ES6), 72 bajty
Próbny
Przy wyższych wartościach jest on raczej powolny, więc ograniczam go tutaj do 20.
Pokaż fragment kodu
źródło
Haskell,
94857271 bajtów1-indeksowany.
Dzięki @Zgarb za uratowanie 13 bajtów!
Dzięki @nimi za uratowanie bajtu!
źródło
(==)=<<map(gcd n)$[sum k,product k]
powinien zaoszczędzić trochę bajtów.[sum k,product k]
możemy byćmap($read.pure<$>show n)[sum,product]
.([n|n<-[0..],(==)=<<map(gcd n)$[product,sum]<*>[read.pure<$>show n]]!!)
MATL , 21 bajtów
Długi i nieefektywny ...
Wypróbuj online!
Jak to działa
źródło
JavaScript (ES6), 70 bajtów
Okazało się to trochę jak odpowiedź @ Arnaulda, ale rekurencja jest najwyraźniej o 2 bajty krótsza. Działa w Chrome, chociaż jest bardzo wolny na wejściach większych niż 30 lub mniej (50 zajmuje 6 sekund).
źródło
Python 2,
122110 bajtów1 zindeksowany, musisz użyć interpretera języka Python z dość wysokim limitem rekurencji.
źródło
Cud, 33 bajty
Zero indeksowane. Stosowanie:
Wyjaśnienie
Bardziej czytelny:
Zasadniczo dostaje nieskończoną listę liczb podzielnych przez jej cyfrową sumę i iloczyn, filtrując nieskończoną listę liczb całkowitych przez predykat. Następnie ten
n
element jest po prostu wybierany z listy.źródło
Julia, 81 bajtów
Jest to anonimowa funkcja, która przyjmuje liczbę całkowitą i zwraca liczbę całkowitą. Aby to nazwać, nadaj mu nazwę. Podejście jest oczywiste: sprawdzaj każdą liczbę, aż napotkamy
n
warunki sekwencji.all
Wyboru jest konieczne w celu zapewnienia, że nie dostaćDivisionError
od%
kiedy iloczyn cyfr jest 0.Nie golfowany:
Wypróbuj online! (obejmuje wszystkie przypadki testowe)
źródło
prod(d)
dop
lub coś i potem zastępującall(d.>0)
zp>0
. I możesz uratować inną, przesuwając jąi%sum(d)
na drugą stronę1
tjp<1>i%sum(d)
.C89,
381226195170169 bajtów1-indeksowane (takie same dokładne odpowiedzi jak w wyzwaniu).
Zakłada 4 bajty (32 bity)
int
(najnowocześniejsze architektury) .Naprawdę wierzę, że to nie może być krótsze.
Funkcjonować
int g (int)
wycieka z pamięci i uzyskuje dostęp do niezainicjowanej pamięci raz na połączenie, ale nie powoduje awarii i zwraca właściwy numer.Pełny program, który pobiera dane wejściowe
./prog $(seq 1 10)
unarne (dla 10) z nie golfowym (trochę):Stara odpowiedź:
C99, 381 bajtów
To może być bardziej golfa.
Pełny program:
źródło
int
, ponieważ jest to domyślny typ liczb całkowitych.C, 110 bajtów
Niegolfowane i użytkowanie:
źródło
Python3,
13480 bajtówNowa wersja dzięki Flp.Tkc
Nowy kod, przypomniałem sobie sposób gry w golfaSam kod nie jest bardzo golfowy, bardziej przypomina golf brutalnyg (x) to funkcja, która zwraca True, jeśli x spełnia kryteria.
źródło
<1
zamiast==0
. Nie potrzebujeszis True
, celem instrukcji if jest sprawdzenie, czy warunek jest spełniony. Możesz użyć skrótu wstecznego Pythona 2str/repr
do golenia niektórych bajtów. Jest też wiele niepotrzebnych białych znaków.h+=g(str(k))
dodaje 1, jeśli prawda, 0, jeśli fałsz.x
(lewy apostrof) w Pythonie 2 to samorepr(x)
lubstr(x)
w Python 3 :)PHP, 96 bajtów
Trwa
n
jako argument wiersza poleceń.Grał w golfa
Bez golfa
źródło
PowerShell v2 +, 84 bajty
Iteracyjne rozwiązanie. Pobiera dane wejściowe
$n
i wchodzi wfor
pętlę, dopóki$n
nie jest równa zero. Każdą iterację odejmujemy od$n
wyniku instrukcji logicznej, podzielonej poniżej:Zatem tylko wtedy, gdy
$a%(sum)
i oba$a%(product)
są równe zeru, to dodanie również będzie równe zero, a zatem wartość logiczna nie będzie Prawda, a zatem zostanie zmniejszona.$n
Po wyjściu z pętli (tj. Trafieniu n-tego terminu), po prostu umieszczamy
$a
w potoku, a dane wyjściowe są niejawne.Przykłady
Uwaga: to rzuca kilka o „usiłowanie dzielenia przez zero” błędy na stderr, który jest domyślnie ignorowany. Dodałem jawnie
2>$null
do poniższego przykładu, aby wyczyścić dane wyjściowe. Jest również dość powolny, gdy dojdzie do około30
, i50
zajmuje około 45 sekund na moim komputerze.źródło
BASH, 125 bajtów
źródło