Tytuł mówi wszystko. Dwie wejściowe 32-bitowe liczby całkowite dodatnie m, n >= 2
, wyjście gcd(m,n)
w postaci pierwszej faktoryzacji.
Wejście
Argumenty linii poleceń lub 1 linia stdin w porządku, cokolwiek jest lepsze dla golfa.
Wynik
Pojedyncza spacja rozdzielana wykładnikami (bez dodatkowych spacji). Nie wysyłaj nic, jeśli dane wejściowe są względnie pierwsze.
Przykłady:
$ ./factorize 96 162
2^1 3^1
$ ./factorize 14 15
$ ./factorize 196 294
2^1 7^2
Zasady
- Nie można używać zasobów zewnętrznych, bibliotek matematycznych ani wbudowanych funkcji do faktoryzacji lub GCD. Przykłady: Java, no
java.lang.Math
. ruby, nieprime_division
, perl, niefactor
itp.
gcd(n,m) == 1
?q:a+.b
lub__ q:a+.b
w J używa nieexternal resources or math libraries
, ale nie opublikuję tego, ponieważ jest to zbyt dalekie od ducha pytania. Myślałem, że podzielę się tutaj.Odpowiedzi:
Python 3,
255250237226188180150142137136 znakówTo niesamowite, jak bardzo mogłem to skrócić, po prostu pomijając różne rzeczy (na przykład znalezienie gcd)! Mógłbym również zmniejszyć 10 dodatkowych znaków, czyniąc tę funkcję, która oczekuje 2 ints, jak niektóre inne odpowiedzi, zamiast czytać ze standardowego wejścia.
źródło
while g<a and g<b:
nawhile(g<a)*(g<b):
a%g+b%g
bitelse:g+=1
może byćg+=1
, chyba że coś mi umknie.Ruby -
16811711410110097Edycja: Po zastanowieniu się, zdałem sobie sprawę, że nie potrzebuję sita, ponieważ pierwszeństwo czynnika jest załatwione w pętli faktoryzacji. Ponadto, jak poinformowały odpowiedzi innych ( laindir i Tal to te, w których widziałem go, choć wygląda na to, że inni też to zrobili), usunąłem osobne obliczenia gcd, ponieważ ma to również miejsce w faktoryzacji.
Edycja 2: Nie potrzebuję
do
.Edycja 3: ściśnij to bardziej.
Edycja 4: Wyciągnąłem jeszcze jedno miejsce.
Edycja 5:
upto
zamiasteach
;?^ == "^"
!Dane wyjściowe (to samo po edycji):
Z pewnością można by poprawić, ale nieźle jak na mój pierwszy.
źródło
map{|i|i.to_i}
namap &:to_i
. Możesz usunąć 5. bajt, nie licząc nowego wiersza na końcu pliku; Ruby działa bez tego.$*
zamiastARGV
.Python 2 -
254252196185156151134126121Interpretator
repl.it
Przykładowe dane wejściowe - standardowe
Przykładowe dane wyjściowe - standardowe wyjście
źródło
…`a`+'^'+`f.count(a)`…
?f.append(i)
na,f+=[i]
aby zapisać 5 znaków.f=''
wciąż tam jest?)Java -
184175Zainspirowane jest to odpowiedzią @Geobits (i odrobiną odpowiedzi @ Tal), ale dość jej jest inaczej, że postanowiłem stworzyć własną odpowiedź.
Pasy testowe bez golfa (w pewnym sensie) z (weryfikacją przez człowieka):
źródło
dc, 96 bajtów
Czyta jeden wiersz standardowego wejścia. Jego wynik nie kończy się na nowej linii. (EDYCJA: Po każdym rozkładzie na czynniki generuje również dodatkowe miejsce. Niektóre inne odpowiedzi zmniejszają przestrzeń, ale ta nie.)
Przykład:
Kod z komentarzami:
źródło
PowerShell - 82
źródło
2..$a
do pętli Foreach-Object%{...}
. Pętla zbiera wartościif($p){"$_^$p"}
.JavaScript (wersja robocza ECMAScript 6) - 89 znaków
Konwertuje pierwotną (iteracyjną) odpowiedź poniżej na rekurencyjną.
Wyjaśnienie
Iteracyjna odpowiedź: JavaScript (ECMASCript 6) -
108 (lub 121)98 znakówWersja 2:
Wersja 1:
Odpowiadając na pierwotnie zadane pytanie:
Lub w celu zachowania zgodności ze zmianą reguły po fakcie:
Wyjaśnienie
Wynik
źródło
f(158,237)
proszę" 79^1"
filter()
połączenie?Perl 6: 90 znaków, 94 bajty
Nieco golfa i skomentował:
Użycie jest jak:
źródło
Perl,
1441331181149793Wersja bez golfa:
Dosłownie zacząłem uczyć się Perla, aby odpowiedzieć na to pytanie (jest to mój pierwszy kod Perla w historii), więc podejrzewam, że można go jeszcze pograć w golfa.
źródło
foreach
zawsze jest to synonimfor
Perla 5, więc to powinno odciąć 4 znaki :)Java:
247241Śledzi czynniki w tablicy i po prostu drukuje je w pętli.
Wygląda na to, że Java ma przyzwoity rozmiar.
źródło
int
tracisz 4,int
ale odzyskujesz je za pomocąnew int[
->,new Integer[
więc jest to pranie.n%i<1&&m%i<1
nan%i+m%i<1
.()
. Jeślin==m
, to i tak ustawi się domyślniem+1
.m/=i;i=1;
zm/=i--;
Nim będzie działał szybciej też :)for
pętli są konieczne?JavaScript (ECMAScript 5)
170164163113Prawie nie mogłem się oprzeć podążaniu za tropem MT0. Wcześniej zastanawiałem się nad rekurencją, ale wydawało się to zbyt łatwe do zepsucia. I tak naprawdę jest. Najmniejsza odmiana niszczy wszystko.
Dla tych, którzy lubią skrzypce, jest skrzypce.
Nie golfowany:
Stara wersja
Nie golfowany:
Oto kilka testów:
źródło
f(301343045, 421880263);
prawdopodobnie dlatego, że moja przeglądarka nie pozwala mi na tak głębokie rekurencje . Głupi zepsuty Firefox!GolfScript, 68 bajtów
Zauważ, że takie podejście wymaga O (b 2 ) czasu i przestrzeni dla liczb całkowitych „a” i „b”.
Kosztem jednego dodatkowego bajtu konieczne są tylko „O” (b) czas i przestrzeń:
Jak to działa
źródło
Python 3 (123)
Wykorzystuje to w zasadzie taką samą strukturę jak odpowiedź Tal .
Wystarczy zapętlić w górę do p = a-1, ponieważ natychmiast zwiększamy, aby otrzymać p = a i a> = min (a, b). Jeśli b> a, nie zaszkodzi wypróbować bezużytecznych wartości p powyżej a.
W 2.X, myślę, że możemy zaoszczędzić, drukując znaki każdy kawałek jak mamy to zamiast gromadzenia ciąg:
if c:print'%d^%d'%(p,c),
. Niestety, Python 3 nie ma kompaktowego sposobu drukowania bez końcowego znaku nowej linii.źródło
PHP, 96
źródło
p=0;g+=1
w jedną linię, zaczynającg
od 1 zamiast tego, co pozwala ci to zrobićg<a
zamiastg<=a
. Mam nadzieję, że polubisz pytona.awk -
1151119685Nowa wersja obsługuje tylko jeden wiersz danych wejściowych. Dzięki durron597 za zwrócenie uwagi, że muszę się tylko upewnić
i <= $1
.Nie golfowany:
Wcześniej mógł wielokrotnie pobierać pary liczb
Nie golfowany:
źródło
&&i<=b
?i > b
, tob % i != 0
... dzięki :)NF=0;
nie usuwa 1 $ i 2 $. Wynikecho 301343045 421880263 | awk -f factorize.awk | sed 's/ */ /g'
jest taki,5 7 1021^1 59029^1
że 1 $ to 5, a 2 $ 7. Sed wyciska dodatkowe spacje, które pochodzą z drukowania 1022 $, 1023 $, 1024, ..., 59028 $ jako puste ciągi znaków połączone spacjami.$0=z;
$0=z;
jest taka sama liczba znaków jakNF=0;
. Jeśli$0=z;
byłby dłuższy, powiedziałbym, żebyś zatrzymałNF=0;
.Pip , 41 bajtów
Nie jest to odpowiedź konkurencyjna, ponieważ język jest nowszy niż pytanie. Ale ten znak GolfScript 68 musiał zejść.
Wyjście kończy się spacją; jeśli to problem, następująca wersja ma również 41 bajtów (łącznie z
-s
flagą):Sformatowane z objaśnieniami:
Pip, w przeciwieństwie do GolfScript, CJam i in. jest językiem imperatywnym z operatorami infix; czerpie także inspirację z języków programowania tablicowego. To zadanie ładnie wyświetla oba paradygmaty w pracy.
(Zauważ, że zatwierdzenie 2015-4-20 jest potrzebne do uruchomienia tego, ponieważ właśnie naprawiłem kilka błędów.)
źródło
Python 2 - 262 bajtów
Linia 6 wymaga pracy.
źródło
…`a`+'^'+`f.count(a)`…
?Groovy: 174 znaków
To jest port rozwiązania Geobits do Groovy 2.2.1:
Oto wersja bez golfa:
źródło
R: 139
Z wcięciami:
Stosowanie:
źródło