Intro
In der Freizeitmathematik habe ich mit der Konstruktion einer Divisortabelle gespielt, um die Primteiler einer Reihe von Zahlen visuell zu vergleichen / gegenüberzustellen. Die eingegebenen Zahlen stehen oben als Spaltenbezeichnungen, die Primteiler links als Zeilenbezeichnungen und eine Markierung gibt an, wo sich die beiden in einer Reihe befinden.
Für die Eingabe wird beispielsweise 6, 9, 14, 22
eine Tabelle ähnlich der folgenden erstellt:
6 9 14 22
2 * * *
3 * *
7 *
11 *
Dies liegt daran, dass 6
es Hauptteiler von 2
und 3
, 9
Hauptteiler von 3
und so weiter gibt.
Konstruktion
- Die Tabelle ist so aufgebaut, dass die Eingabenummern Spaltenbezeichnungen bilden, die durch Leerzeichen und in aufsteigender Reihenfolge voneinander getrennt sind (Sie können davon ausgehen, dass sie vorsortiert sind), und die Primteiler links in aufsteigender Reihenfolge für jede Zeile aufgelistet sind, die die Zeile bildet Etiketten.
- Beachten Sie, dass führende Leerzeichen in den Primteilern und Eingabezahlen erforderlich sein können, wenn die Zahlen unterschiedlich lang sind, damit alle Spalten die gleiche Breite haben und entsprechend ausgerichtet sind.
- Jeder Teiler wird durch ein einzelnes
*
(oder ein anderes geeignetes ASCII-Zeichen Ihrer Wahl dargestellt, sofern für alle Vorkommen dasselbe Zeichen verwendet wird). - Mehrere Teiler werden ignoriert (z. B.
3 x 3 = 9
gibt es nur einen*
für diese Schnittmenge). - Das
*
kann überall horizontal in der Spalte platziert werden, solange es eindeutig ist (ich habe alle meine Beispiele*
rechtsbündig).
Eingang
- Jeweils eine Liste positiver Ganzzahlen in einem beliebigen Format
>1
. - Sie können davon ausgehen, dass die Eingabe vorsortiert ist.
- Die Eingabe hat garantiert nur eindeutige Werte.
Ausgabe
Die resultierende ASCII-Grafikdarstellung der Primteilertabelle.
Regeln
- Führende oder nachfolgende Zeilenumbrüche oder Leerzeichen sind optional, sofern die Zeichen selbst korrekt ausgerichtet sind.
- Wenn eine Trennlinie zwischen den Spalten- / Zeilenüberschriften und den Tabellendaten kürzer ist, ist dies ebenfalls zulässig.
- Es ist entweder ein vollständiges Programm oder eine Funktion zulässig. Bei einer Funktion können Sie die Ausgabe zurückgeben, anstatt sie zu drucken.
- Fügen Sie nach Möglichkeit einen Link zu einer Online-Testumgebung hinzu, damit die Benutzer Ihren Code ausprobieren können!
- Standardlücken sind verboten.
- Dies ist Codegolf, daher gelten alle üblichen Golfregeln, und der kürzeste Code (in Byte) gewinnt.
Beispiele
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 *
Antworten:
Mathematica,
101-90BytesDanke an ngenisis für das Speichern von 11 Bytes!
Das
∣
Zeichen ungefähr ein Drittel des Durchgangs ist U + 2223 (3 Bytes). Unbenannte Funktion einer variablen Anzahl von Argumenten, von denen jedes eine Ganzzahl ungleich Null ist, die einTableForm
Objekt (formatierte Ausgabe) wie folgt zurückgibt :f=#&@@@FactorInteger[1##]
Definiertf
die Menge aller Primzahlen, die eine der Eingaben aufteilen (gleichbedeutend mit der Aufteilung ihres Produkts1##
), währendg
die Liste aus den Eingaben besteht.Outer[If[#∣#2,Y,""]&,f,g]
erstellt eine Tabelle mitY
s und leeren Strings entsprechend der Teilbarkeit (wir verwenden das undefinierte TokenY
anstelle eines Strings"Y"
oder"*"
um zwei Bytes zu speichern). AnschließendTableForm[...,TableHeadings->{f,g}]
formatieren wir das resultierende Array mit den entsprechenden Zeilen- und Spaltenüberschriften.Vorherige Einreichung:
quelle
""
.TableForm[Outer[If[#∣#2,Y,""]&,f=#&@@@FactorInteger[1##],g={##}],TableHeadings->{f,g}]&
wennp[f,]
.TableForm
ist cool, hoffentlich bleibt das in meiner toolbox!Jelly , 18 Bytes
Verwendet
1
statt*
, wie es die Regeln erlauben.Probieren Sie es online!
Wie es funktioniert
quelle
Jelly ,
2523 BytesProbieren Sie es online!
Wie?
Es kann durchaus kürzer sein
ÆE
, leere Zeilen zu verwenden und herauszufiltern.quelle
JavaScript (ES6),
264260...179173 BytesIch denke, dieser Ansatz hat jetzt den rekursiven (derzeit 178 Bytes) dauerhaft überschritten:
Verwendet
0
anstelle von*
, was durch die Herausforderung erlaubt ist.Testschnipsel
Code-Snippet anzeigen
quelle
|
Operator in der if-Anweisung verwenden, da Sie 2 Boolesche Werte vergleichen ...i<2
Scheck innerhalb der.map
Funktion zu verschieben?...i<2?a:a.map(x=>x%i&&c)
zu meinst ,...a.map(x=>i<2?x:x%i&&c)
ist das nicht kürzer. Wenn Sie meinen, verschieben Sie es in die andere.map
, vielleicht ...Python 2 - 197 Bytes
Zu Python 2 gewechselt, um die Eingabe zu vereinfachen und die Konvertierung von Zeichenfolgen zu ermöglichen. Verwendet
gmpy2
zur Erzeugung der nächsten Primzahl. Das Ausgabeformat basiert immer noch auf der vorherigen Python 3-Übermittlung (siehe unten), dh, es wird eine Listeg
mit Symbolen gefüllt und formatiert.Probieren Sie es online!
Erläuterung
Für diejenigen, die es nicht selbst entschlüsseln wollen.
Bisherige
Python 3 - 251 Bytes
Ich bin mir ziemlich sicher, dass es jemand besser machen kann. Basierend auf dieser Antwort zur Generierung der Primzahlen <
k
.Ungolfed-Version und Erklärung folgen.
quelle
i=list(map(int,input().split(',')))
können Sie einfachi=input()
eine Eingabe in das Formular vornehmen[1, 2, 3, 4]
.p=gmpy2.next_prime(p);t=['*'[m%p:]for m in i]
und den Speicherplatz in entfernenif"*" in
.Mathematica, 165 Bytes
Ziemlich ausführlich - vielleicht kann jemand etwas damit anfangen:
quelle
Bash + GNU-Dienstprogramme,
134133132125123 BytesProbieren Sie es online!
quelle
Python 2 ,
181179 Bytes-2 Bytes dank FlipTack
Die Eingabe muss ein Tupel sein.
Probieren Sie es online!
quelle
all(i%j for j in p)
anstatt zu verwendenmap
?Batch, 451 Bytes
Erläuterung: Beginnt mit der Berechnung der Feldbreite
w
über das Maximum der Eingabewertem
. Erzeugt die erste Ausgabezeile, indem eine leere Zeichenfolge und die eingegebenen Zahlenw
mit der Unterroutine auf die Breite aufgefüllt werdent
. Durchlaufen Sie dann die Ganzzahlen ab 2, erzeugen Sie die Ausgabezeile, indem Sie die Ganzzahl auffüllen und dann die Unterroutine aufrufen,c
um je nach Wert eine leere Zeichenfolge oder ein Sternchen aufzufüllen. Die erzeugte Zeile wird jedoch übersprungen, wenn sie keine Sternchen enthält. Bei der Generierung der Ausgabe wird jeder Wert durch die Ganzzahl geteilt, bis ein Rest übrig bleibt. Die Schleife wird beendet, wenn kein Wert größer als 1 ist.Beachten Sie, dass das
set v=
ausgeführt wird, nachdem das%v%
in diefor
Schleife in derselben Zeile eingesetzt wurde.quelle
Python 2 ,
157148146145143 BytesVerwendet
0
statt*
, wie es die Regeln erlauben.Probieren Sie es online!
Hintergrund
Um Primzahlen zu identifizieren, verwenden wir eine Folgerung aus Wilsons Theorem :
Wie es funktioniert
Die erste Zeile definiert eine Hilfsfunktion.
p akzeptiert eine variable Anzahl von Argumenten, die es im Tupel t speichert .
Das
'%%%ds '%len(`x[-1]`)
verwendet eine Formatzeichenfolge, um eine Formatzeichenfolge zu erstellen;%%
ist ein literales Prozentzeichen,%d
ein Platzhalter für die zurückgegebene Ganzzahllen(`x[-1]`)
, dh die Anzahl der Stellen des letzten Elements in x (der Eingabe, die noch nicht definiert ist), unds
ist literal.Wenn zum Beispiel das letzte Element von x drei Ziffern hat, ergibt dies
%3s
, was sich*len(t)
einmal für jedes Element von x wiederholt . Schließlich%t
gilt , dass die Format - String auf das Tupel t , eine Reihe von Konstruktion t ‚s Elemente, durch Leerzeichen getrennte und alle rechtsbündig auf eine bestimmte Länge.Die zweite Zeile definiert die tatsächliche Einreichung: eine Funktion f , die eine Liste x als Eingabe nimmt. Nachdem Sie die
exec
Anweisung, die den vorangestellten String ausführtx[-1]
, durch einefor
Schleife ersetzt haben, erhalten Sie den folgenden Code.Zunächst initialisiert f k und m auf 1 . Beachte, dass (k - 1)! = 0! = 1 = m .
Mit der Funktion p werden dann
p(' ',*x)
ein Leerzeichen und die ganzen Zahlen in x gedruckt .Nun betreten wir die Schleife, um die verbleibende Ausgabe zu drucken.
Erstellt zunächst
r=[n%k and' 'for n in x]
die Liste der Reste jeder ganzen Zahl n in x geteilt durch k . Positive Reste, dh Reste, die nicht Vielfachen von k entsprechen , sind wahr und werden durch ein Leerzeichen ersetztand' '
.Als nächstes konstruieren wir
m%k*r
. Da m = (k - 1)! In der Folge von Wilsons Theorem ist dies einfach r, wenn k Primzahl ist, aber eine leere Liste, wenn nicht. Wenn das Ergebnis mindestens eine 0 enthält , dh wenn k eine Primzahl ist und mindestens eine Ganzzahl in x durch k teilbar ist ,0in m%k*r
wird True zurückgegeben undp(k,*r)
aufgerufen, wobei k und die Teilbarkeitsindikatoren ausgegeben werden:0
Wenn teilbar, ein Leerzeichen, wenn nicht .Schließlich multiplizieren wir m mit k² und erhöhen k , so dass die Qualität m = (k - 1) ist! hält weiter an.
quelle
MATL , 31 Bytes
Dies wird
1
stattdessen verwendet*
, wie es die Herausforderung zulässt.Probieren Sie es online! Oder überprüfen Sie alle Testfälle .
Erklärung ( veraltet )
quelle
Schläger 176 Bytes
Ungolfed:
Testen:
Ausgabe:
quelle