Wprowadzenie
Coś, z czym bawiłem się w matematyce rekreacyjnej, to konstrukcja tabeli dzielników do wizualnego porównywania / kontrastowania głównych dzielników zbioru liczb. Zestaw liczb wejściowych znajduje się u góry jako etykiety kolumn, główne dzielniki znajdują się po lewej stronie jako etykiety wierszy, a znak wskazuje, gdzie dwa wiersze w górę.
Na przykład w celu wprowadzenia zostanie 6, 9, 14, 22
zbudowana tabela podobna do poniższej:
6 9 14 22
2 * * *
3 * *
7 *
11 *
Jest tak, ponieważ 6
ma główne dzielniki 2
i 3
, 9
ma główne dzielniki 3
i tak dalej.
Budowa
- Tabela jest skonstruowana w taki sposób, że liczby wejściowe tworzą etykiety kolumn oddzielone spacjami i w porządku rosnącym (można założyć, że są wstępnie posortowane), a główne dzielniki są wymienione po lewej stronie w porządku rosnącym, po jednym w wierszu tworzącym wiersz etykiety.
- Zauważ, że początkowe spacje na głównych dzielnikach i liczbach wejściowych mogą być wymagane, jeśli liczby mają różne długości, tak aby wszystkie kolumny miały tę samą szerokość i odpowiednio się wyrównały.
- Każdy dzielnik jest reprezentowany przez jedną
*
(lub inną odpowiednią postać ASCII, którą wybierzesz, o ile ten sam znak jest używany we wszystkich wystąpieniach). - Wiele dzielników jest ignorowanych (np.
3 x 3 = 9
Ale jest tylko jeden*
dla tego skrzyżowania). *
Może być umieszczony w dowolnym miejscu w kolumnie poziomej, tak długo, jak jest to jednoznaczne (mam wszystkie moje przykłady Europejska*
wyrównany do prawej).
Wkład
- Lista liczb całkowitych dodatnich w dowolnym, wygodnym formacie , każdy
>1
. - Możesz założyć, że dane wejściowe są wstępnie posortowane.
- Gwarantujemy, że dane wejściowe mają tylko unikalne wartości.
Wydajność
Wynikowa reprezentacja ASCII w formie tabeli pierwszego dzielnika.
Zasady
- Wiodące lub końcowe znaki nowej linii lub białe znaki są opcjonalne, o ile same znaki są odpowiednio ustawione w linii.
- Jeśli krótsza jest linia podziału oddzielająca nagłówki kolumn / wierszy od danych tabelarycznych, jest to również dozwolone.
- Dopuszczalny jest pełny program lub funkcja. Jeśli funkcja, możesz zwrócić dane wyjściowe zamiast je drukować.
- Jeśli to możliwe, dołącz link do internetowego środowiska testowego, aby ludzie mogli wypróbować Twój kod!
- Standardowe luki są zabronione.
- To jest golf golfowy, więc obowiązują wszystkie zwykłe zasady gry w golfa, a wygrywa najkrótszy kod (w bajtach).
Przykłady
6,9,14,22
6 9 14 22
2 * * *
3 * *
7 *
11 *
2,3,5,7
2 3 5 7
2 *
3 *
5 *
7 *
2,4,8,16,32
2 4 8 16 32
2 * * * * *
75,99,151,153
75 99 151 153
3 * * *
5 *
11 *
17 *
151 *
Odpowiedzi:
Mathematica,
10190 bajtówDzięki ngenisis za uratowanie 11 bajtów!
∣
Znaków o jedną trzecią sposób przez to U + 2223 (3 bity). Nienazwana funkcja zmiennej liczby argumentów, z których każdy jest niezerową liczbą całkowitą, która zwracaTableForm
obiekt (sformatowane wyjście) w następujący sposób:f=#&@@@FactorInteger[1##]
definiujef
się jako zbiór wszystkich liczb pierwszych dzielących dowolne dane wejściowe (równoważnie, dzieląc ich iloczyn1##
), podczas gdyg
jest to lista zawierająca dane wejściowe.Outer[If[#∣#2,Y,""]&,f,g]
tworzy tabelęY
s i puste ciągi odpowiadające podzielności (używamy niezdefiniowanego tokenaY
zamiast ciągu"Y"
lub w"*"
celu zapisania dwóch bajtów). Następnie używamyTableForm[...,TableHeadings->{f,g}]
do formatowania wynikowej tablicy za pomocą odpowiednich nagłówków wierszy i kolumn.Poprzednie zgłoszenie:
źródło
""
.TableForm[Outer[If[#∣#2,Y,""]&,f=#&@@@FactorInteger[1##],g={##}],TableHeadings->{f,g}]&
jeśli dzielniki są dozwolonep[f,]
.TableForm
jest spoko, mam nadzieję, że pozostanie w moim zestawie narzędzi!Galaretka , 18 bajtów
Używa
1
zamiast*
, zgodnie z regułami.Wypróbuj online!
Jak to działa
źródło
Galaretka ,
2523 bajtówWypróbuj online!
W jaki sposób?
Może być krótszy w użyciu
ÆE
i odfiltrowaniu pustych wierszy.źródło
JavaScript (ES6),
264260...179173 bajtówMyślę, że to podejście na stałe przekroczyło obecnie wartość rekurencyjną (obecnie 178 bajtów):
Wykorzystuje
0
zamiast*
, co jest dozwolone przez wyzwanie.Testowy fragment kodu
Pokaż fragment kodu
źródło
|
operatora w instrukcji if, ponieważ porównujesz 2 booleany ...i<2
kontroli wewnątrz.map
funkcji?...i<2?a:a.map(x=>x%i&&c)
na...a.map(x=>i<2?x:x%i&&c)
, nie jest to krótsze. Jeśli masz na myśli przeniesienie go do drugiego.map
, być może ...Python 2 - 197 bajtów
Przełączono na Python 2, aby ułatwić obsługę danych wejściowych i umożliwić konwersję napisów. Zastosowania
gmpy2
do generowania następnej liczby pierwszej. Format wyjściowy nadal oparty na poprzednim zgłoszeniu do Python 3 (patrz poniżej), mianowicie wypełnienie listyg
symbolami i sformatowanie jej.Wypróbuj online!
Wyjaśnienie
Dla tych, którzy sami nie chcą dekodować.
Poprzedni
Python 3 - 251 bajtów
Jestem pewien, że ktoś może zrobić lepiej. Na podstawie tej odpowiedzi dotyczącej generowania liczb pierwszych <
k
.Pojawi się wersja bez golfa i wyjaśnienie.
źródło
i=list(map(int,input().split(',')))
możesz po prostu zrobići=input()
i pobrać dane z formularza[1, 2, 3, 4]
.p=gmpy2.next_prime(p);t=['*'[m%p:]for m in i]
i usunąć miejsce wif"*" in
.Mathematica, 165 bajtów
Raczej gadatliwy - może ktoś może coś z tym zrobić:
źródło
Narzędzia Bash + GNU,
134133132125123 bajtówWypróbuj online!
źródło
Python 2 ,
181179 bajtów-2 bajty dzięki FlipTack
Dane wejściowe muszą być krotką.
Wypróbuj online!
źródło
all(i%j for j in p)
działa zamiast używaćmap
?Partia, 451 bajtów
Objaśnienie: Zaczyna się od obliczenia szerokości pola
w
na podstawie maksimum wartości wejściowychm
. Generuje pierwszy wiersz wyniku, wypełniając pusty ciąg i liczby wejściowe do szerokościw
za pomocą podprogramut
. Następnie zapętla liczby całkowite, zaczynając od 2, generując linię wyjściową, wypełniając liczbę całkowitą, a następnie wywołując proceduręc
aby wstawić pusty ciąg lub gwiazdkę stosownie do każdej wartości, jednak wygenerowana linia jest pomijana, jeśli nie zawiera gwiazdek. Podczas generowania wyniku każda wartość jest dzielona przez liczbę całkowitą, aż pozostawi resztę, więc pętla kończy się, gdy żadna wartość nie jest większa niż 1.Zauważ, że
set v=
zostanie wykonany po%v%
jest podstawiona dofor
pętli na tej samej linii.źródło
Python 2 ,
157148146145143 bajtówUżywa
0
zamiast*
, zgodnie z regułami.Wypróbuj online!
tło
Aby zidentyfikować liczby pierwsze, używamy następstwa twierdzenia Wilsona :
Jak to działa
Pierwszy wiersz określa funkcję pomocnika.
p przyjmuje zmienną liczbę argumentów, które przechowuje w krotce t .
'%%%ds '%len(`x[-1]`)
Wykorzystuje ciąg formatu skonstruować ciąg formatu;%%
to dosłowny znak procentu,%d
jest symbolem zastępczym dla liczby całkowitej, któralen(`x[-1]`)
zwraca, tj. liczbę cyfr ostatniego elementu w x (dane wejściowe, jeszcze nie zdefiniowane), orazs
jest dosłowny.Jeśli np. Ostatni element x ma trzy cyfry, daje to wynik
%3s
, który*len(t)
powtarza się raz dla każdego elementu x . Na koniec%t
stosuje ten ciąg formatu do krotki t , konstruując ciąg elementów t , oddzielonych spacjami i wyrównanych do prawej do określonej długości.Drugi wiersz definiuje faktyczne przesłanie: funkcję f, która przyjmuje listę x jako dane wejściowe. Po zastąpieniu
exec
instrukcji, która wykonuje poprzedzający ją ciągx[-1]
,for
pętlą, otrzymujemy następujący kod.Najpierw f inicjuje k i m do 1 . Zauważ, że (k - 1)! = 0! = 1 = m .
Następnie
p(' ',*x)
wypisuje spację i liczby całkowite w x , używając funkcji p .Teraz wchodzimy do pętli, aby wydrukować pozostałe dane wyjściowe.
Po pierwsze,
r=[n%k and' 'for n in x]
tworzy się listę resztek każda liczba całkowita n w x , podzielonej przez k . Reszty dodatnie, tj. Reszty , które nie odpowiadają wielokrotnościom k , są zgodne z prawdą i zostają zastąpione spacjąand' '
.Następnie konstruujemy
m%k*r
. Ponieważ m = (k - 1)! na podstawie twierdzenia Wilsona będzie to po prostu r, jeśli k jest liczbą pierwszą, ale pusta lista, jeśli nie. Jeśli w wyniku jest co najmniej jedna 0 , tj. Jeśli k jest liczbą pierwszą, a co najmniej jedna liczba całkowita w x jest podzielna przez k ,0in m%k*r
zwróci True ip(k,*r)
zostanie wywołana, drukuje k i wskaźniki podzielności:0
jeśli podzielne, spacja, jeśli nie .Na koniec mnożymy m przez k² i inkrementujemy k , więc jakość m = (k - 1)! nadal utrzymuje.
źródło
MATL , 31 bajtów
To używa
1
zamiast*
, jak pozwala na to wyzwanie.Wypróbuj online! Lub sprawdź wszystkie przypadki testowe .
Wyjaśnienie ( nieaktualne )
źródło
Rakieta 176 bajtów
Nie golfowany:
Testowanie:
Wydajność:
źródło