Gib alle Rechtecke auf, die mich trennen


37

Definitionen

  • Ein perfektes Quadrat ist eine ganze Zahl, die als Quadrat einer anderen ganzen Zahl ausgedrückt werden kann. Zum Beispiel 36ist ein perfektes Quadrat, weil 6^2 = 36.
  • Eine quadratfreie Zahl ist eine ganze Zahl, die mit Ausnahme von durch kein perfektes Quadrat teilbar ist 1. Zum Beispiel 10ist eine quadratische Zahl. Allerdings 12ist keine Zahl quadrat, weil 12teilbar durch 4und 4ist ein perfekter Platz.

Aufgabe

Bei einer positiven Ganzzahl nwird die größte teilende quadratfreie Zahl ausgegeben n.

Testfälle

n   output
1   1
2   2
3   3
4   2
5   5
6   6
7   7
8   2
9   3
10  10
11  11
12  6
13  13
14  14
15  15
16  2
17  17
18  6
19  19
20  10
21  21
22  22
23  23
24  6
25  5
26  26
27  3
28  14
29  29
30  30
31  31
32  2
33  33
34  34
35  35
36  6
37  37
38  38
39  39
40  10
41  41
42  42
43  43
44  22
45  15
46  46
47  47
48  6
49  7
50  10

Wertung

Das ist . Kürzeste Antwort in Bytes gewinnt.

Es gelten Standardlücken .

Referenz


1
... und heißt das radikale - also 1980er!
Jonathan Allan

Eng verbunden , multiplizieren Sie einfach die beiden Ausgänge. Bearbeiten: Egal, es stimmt nur mit würfelfreien Zahlen überein.
11.

Antworten:


45

05AB1E , 2 Bytes

fP

Probieren Sie es online!

Wie es funktioniert

f   Implicitly take input and compute the integer's unique prime factors.
 P  Take the product.

26
> _> wirklich ... ??
HyperNeutrino

@HyperNeutrino yep - wenn eine Zahl nicht quadratfrei ist, liegt das daran, dass einige ihrer Primfaktoren eine Multiplizität haben.
Jonathan Allan

@ JonathanAllan Ich interessiere mich nur für die eingebauten für einzigartige Primfaktoren. Ich wünschte, Jelly hätte eine von denen ...
HyperNeutrino

@HyperNeutrino Es ist 05AB1E, gewöhne dich daran. 05AB1E verfügt über einige wirklich redundante integrierte Funktionen, die anscheinend Byte sparen.
Erik der Outgolfer

6
Korrektur, "Bytes speichern", da ist wohl nichts dran.
Draco18s

14

Brachylog , 3 Bytes

ḋd×

Probieren Sie es online!

Eine sehr originelle Antwort ...

Erläuterung

ḋ          Take the prime factors of the Input
 d         Remove duplicates
  ×        Multiply

1
Wieder schlägt Brachylog Jelly, weil ein Zwei-Byte-Atom hier nur ein Byte ist. > :-P
HyperNeutrino

4
Gelee mit vielen eingebauten Stoffen wird oft als Vorteil angesehen. Mehr integrierte Funktionen bedeuten jedoch, dass sie im Durchschnitt längere Namen benötigen. Es gibt also Kompromisse bei der Gestaltung von Golfsprachen.

2
Ich versuche nicht, "dieser Typ" zu sein, und vielleicht verstehe ich die Bytezählung nur falsch, aber sind das nicht 6 Bytes? mothereff.in/byte-counter#ḋd ×
Captain Man

5
@CaptainMan Brachylog verwendet eine benutzerdefinierte Codepage mit 256 Zeichen, die Sie hier finden .
Fatalize

14

JavaScript (ES6), 55 54 50 46 Byte

OEIS zitieren :
a (n) ist der kleinste Teiler u von n, so dass n u ^ n teilt

Aktualisierte Implementierung:
a (n) ist der kleinste Teiler u von n positiven ganzen Zahlen u, so dass n u ^ n teilt

let f =

n=>(g=(p,i=n)=>i--?g(p*p%n,i):p?g(++u):u)(u=1)

for(n = 1; n <= 50; n++) {
  console.log(n,f(n));
}


Nizza Ansatz für das Problem, esp. mangels eingebauter Faktorisierung
Riking

12

MATL , 6 4 Bytes

2 Bytes mit Hilfe von @LeakyNun gespeichert

Yfup

Probieren Sie es online!

Erläuterung

Betrachten Sie die Eingabe 48.

Yf   % Implicit input. Push prime factors with repetitions.  STACK: [2 2 2 2 3]
u    % Unique.                                               STACK: [2 3]
p    % Product of array. Implicit display.                   STACK: 6


@LeakyNun Heh, das wollte ich gerade posten :-) Danke
Luis Mendo


9

CJam , 8 Bytes

rimf_&:*

Warum muss jede Operation in diesem Programm aus 2 Bytes bestehen -_-

Probieren Sie es online!

ri       e# Read int from input
  mf     e# Get the prime factors
    _&   e# Deduplicate
      :* e# Take the product of the list

Ich konnte keinen Weg finden, um zu deduplizieren. Nett!
Luis Mendo

@ LuisMendo Ich habe das erst kürzlich entdeckt. Ich dachte immer, es sei eine Multiset-Schnittmenge, aber anscheinend ist es nur eine normale Set-Schnittmenge.
Business Cat

9

Retina , 36 30 28 Bytes

+`((^|\3)(^(1+?)|\3\4))+$
$3

Ein- und Ausgabe in unary .

Probieren Sie es online! (Beinhaltet eine Kopf- und Fußzeile zur dezimalen <-> unären Konvertierung und zur gleichzeitigen Ausführung mehrerer Testfälle.)

Erläuterung

Die Idee ist, die Eingabe als ein Quadrat mal einen Faktor abzugleichen. Der grundlegende reguläre Ausdruck zum Abgleichen eines Quadrats verwendet eine Vorwärtsreferenz, um Summen aufeinanderfolgender ungerader Ganzzahlen abzugleichen:

(^1|11\1)+$

Da wir perfekte Quadrate nicht passen wollen, aber Zahlen , die durch ein Quadrat teilbar sind, ersetzen wir , dass 1mit einer Rückreferenzierung selbst:

(^(1+?)|\1\2\2)+$

Die äußere Gruppe 1wird also n- mal verwendet, wobei n 2 das größte Quadrat ist, das die Eingabe teilt, und die Gruppe 2den verbleibenden Faktor speichert. Was wir wollen, ist, die ganze Zahl durch n zu teilen , um das Quadrat zu entfernen. Das Ergebnis kann als die Anzahl der Iterationen von Gruppe zu 1Gruppe ausgedrückt werden 2, dies ist jedoch etwas schwierig. Retina $*wird wahrscheinlich bald verbessert, um ein Nicht-Zeichen-Token als Argument für die rechte Hand zu verwenden. In diesem Fall könnten wir dies einfach ersetzen $#1$*$2, aber das funktioniert noch nicht.

Stattdessen zerlegen wir die ungeraden Zahlen unterschiedlich. Kehren wir zum einfacheren Beispiel des Abgleichs perfekter Quadrate mit zurück (^1|11\1)+$. Anstatt einen Zähler zu haben, \1der bei jeder Iteration auf 1 initialisiert und um 2 erhöht wird , haben wir zwei Zähler. Einer wird auf 0 und einer auf 1 initialisiert , und beide werden bei jeder Iteration um 1 erhöht . Wir haben also die ungeraden Zahlen 2n + 1 in (n) + (n + 1) zerlegt . Der Vorteil ist , dass wir am Ende folgendes haben n in einer der Gruppen. In seiner einfachsten Form sieht das so aus:

((^|1\2)(^1|1\3))+$

Wo \2ist n und \3ist n + 1 . Wir können dies jedoch ein wenig effizienter tun, indem wir feststellen, dass das n + 1 einer Iteration gleich dem n der nächsten Iteration ist, sodass wir hier Folgendes einsparen können 1:

((^|\3)(^1|1\3))+$

Jetzt müssen wir nur noch einen Anfangsfaktor verwenden, anstatt 1Eingaben abzugleichen, die durch ein perfektes Quadrat geteilt werden:

((^|\3)(^(1+?)|\3\4))+$

Jetzt müssen wir nur noch das Ganze durch $3das Ende ersetzen , das den Anfangsfaktor multipliziert mit der Anzahl der Schritte speichert und einen Faktor des Quadrats aus der Eingabe entfernt.

Dies wird +am Anfang des Programms wiederholt durchgeführt, um Eingaben zu berücksichtigen, die höhere Potenzen als Quadrate enthalten.


8

Oktave, 27 Bytes

@(x)prod(unique(factor(x)))

Ähnliches Vorgehen wie bei den anderen Antworten. Der Unterschied ist: Die Funktionen haben viel längere Namen. Ich glaube, der Code erklärt sich von selbst: Nimmt die prodSumme der uniquePrimzahlen factoreiner Zahl.


Sie ninja'd mir von ~ 30 Sekunden :)
Kritixi Lithos


7

Wolfram-Sprache, 29 28 Bytes

-1 Danke an @Martin Ender ♦

Most[1##&@@FactorInteger@#]&

Erläuterung:

           FactorInteger@#    (*Get prime factorization as {{a,b},{c,d}}*)
     1##&@@                   (*Multiply list elements together, to get the product of the factors and the product of their exponents*)
Most[                     ]&  (*Take the first element*)

2
Nur erkannt, das ist im Grunde @ GregMartin Kommentar auf die Mathematik-Antwort, nur weniger golfen ...
Scott Milner

Fühlen Sie sich nicht schlecht, ich hatte die noch weniger golferische Antwort vonTimes@@(#&@@@FactorInteger@#)&
Ian Miller

MostLässt es als Liste. Sie müssen Firstden Wert erhalten.
Ian Miller

@ IanMiller Mir ist klar, dass es weniger Bytes gibt, wenn Sie nur eine Liste mit nur einem Element zurückgeben. Ich bin davon ausgegangen, dass das ok ist, da es immer noch eine vernünftige Ausgabe ist.
Scott Milner

7

Python , 37 Bytes

f=lambda n,r=1:1>>r**n%n or-~f(n,r+1)

Probieren Sie es online!

Der größte quadratfreie Teiler von nist die kleinste Zahl rmit allen nPrimfaktoren. Wir können dies als r**n%n==0, da r**nmachen nKopien von jedem Primfaktor rund ist teilbar durch nnur , wenn jeder n‚s Primfaktoren vertreten ist.

Das 1>>r**n%nist gleichbedeutend mit int(r**n%n==0). Wenn TrueAusgang 1 verwendet werden kann, sind es 2 Byte weniger.

f=lambda n,r=1:r**n%n<1or-~f(n,r+1)

6

Mathematik , 40 Bytes

Times@@(Transpose@FactorInteger@#)[[1]]&

Probieren Sie es online!


Times@@#&@@Transpose@FactorInteger@#&Spart 3 Bytes ( #&@@ist ein Standardtrick [[1]]und kann in solchen Fällen oft zusätzliche Bytes in Klammern einsparen).
Martin Ender

Sie können auch Threadanstelle von verwenden Transpose. In Mathematica gibt es auch einen 3-Byte-Operator für Transpose, aber ich weiß nicht, ob Mathics ihn unterstützt.
Martin Ender

6
#&@@(1##&@@FactorInteger@#)&vermeidet die Notwendigkeit Transposezusammen. ( 1##&@@Ist nur Times@@in der Verkleidung, die funktioniert gut auf die geordneten Paare nachgegeben FactorInteger; und '#&@@ist First@in der Verkleidung.)
Greg Martin

@ GregMartin, das ist im Grunde Ihre eigene Lösung. Sie können sie gerne posten, wenn Sie möchten.
Pavel

Sieht so aus, als hätte Scott Milner es trotzdem geschafft :)
Greg Martin

5

Alice , 4 Bytes

iDo@

Probieren Sie es online!

Eingabe und Ausgabe werden als Codepunkt eines Zeichens angegeben (funktioniert für alle gültigen Unicode-Codepunkte).

Erläuterung

Nun, Alice hat eine eingebaute, Dderen Definition "Deduplizieren Primfaktoren" ist. Das heißt, solange ein Wert für eine Primzahl p durch etwas p 2 teilbar ist , dividiere diesen Wert durch p . Dies ist genau die Funktion, die für diese Herausforderung erforderlich ist. Der Rest ist nur Eingabe, Ausgabe, Programm beenden.

Der Grund, warum dies zu Alice hinzugefügt wurde, hat eigentlich nichts mit dieser Ganzzahlsequenz zu tun. Ich habe versucht, mich an das Thema zu halten, Teiler mit Teilzeichenfolgen und Primfaktoren mit Zeichen zu verknüpfen. Und ich brauchte eine Funktion, die zu "deduplizierten Zeichen" passt (was im Allgemeinen viel nützlicher ist, weil Sie damit Zeichenfolgen als Mengen behandeln können, insbesondere wenn sie zusammen mit den verschiedenen Multiset-Operatoren verwendet werden).


Der traurige Teil ist, dass dies auch mit einem eingebauten nicht die kürzeste Antwort ist.
11.

@Riker Nun, das liegt daran, dass Alice keine Golfsprache ist und daher eine explizite E / A und (da es sich um eine 2D-Sprache handelt) eine Programmbeendigung benötigt.
Martin Ender

Ja, aber immer noch etwas traurig.
11.

@ ConorO'Brien Wir haben diese Diskussion gerade an einer anderen Stelle geführt, und das gilt nur, wenn der eigenständige Operator ein Ausdruck ist, der für die Funktion ausgewertet wird (was hier nicht der Fall ist, da Funktionen / Operatoren keine erstklassigen Werte sind). . codegolf.meta.stackexchange.com/a/7206/8478
Martin Ender

@ ConorO'Brien sorry das war ein exklusives "wir".
Martin Ender





1

Pyth, 8 6 Bytes

*F+1{P

* -2 Bytes dank @LeakyNun

Wäre 3, wenn Pyth ein eingebautes Produkt für Listen hätte ...

Versuch es!

*F+1{P
      Q     # Implicit input
     P      # Prime factors of the input
    {       # Deduplicate
  +1        # Prepend 1 to the list (for the case Q==1)
*F          # Fold * over the list

Sie können *F+1{Pstattdessen verwenden.
Undichte Nonne

1

C 65 50 Bytes

Vielen Dank an @ Ørjan Johansen für die Beseitigung der Notwendigkeit für r. Dank dieser und einiger anderer schmutziger Tricks konnte ich 15 Bytes wegpressen!

d;f(n){for(d=1;d++<n;)n%(d*d)||(n/=d--);return n;}

whileist weg und ersetzt mit ||und Index Twiddling. <=sollte die <ganze Zeit gewesen sein.

<=gedreht, <indem Sie das Inkrement bewegen, um zu erhalten n%(++d*d)(sollte aufgrund der Priorität des Operators genau definiert sein).


Originalcode:

d;r;f(n){for(r=d=1;d++<=n;)while(n%d<1)r*=r%d?d:1,n/=d;return r;}

Ich denke, Sie können es verkürzen, indem Sie es entfernen rund stattdessen verwenden while(n%(d*d)<1)n/=d;.
Ørjan Johansen

@ ØrjanJohansen Das scheint richtig. Ich dachte eher an Bauen als an Reduzieren. Ich habe einige zusätzliche Verbesserungen hinzuzufügen, die bald aktualisiert werden.
Algmyr

++d*dist in den C-Standards absolut nicht gut definiert - es ist ein klassischer Fall von explizit undefiniertem Verhalten. Aber wir werden hier sowieso Implementierungen durchführen.
Ørjan Johansen

Sollte eigentlich nicht d++<n, was gut definiert ist, noch funktionieren? Ich denke, die alte Version ging den ganzen Weg n+1(harmlos).
Ørjan Johansen

Sie haben wahrscheinlich Recht mit dem undefinierten Verhalten. Aus irgendeinem Grund dachte ich, dass Operator-Vorrang das lösen würde. Die meisten Beispiele, die ich von UB gesehen habe, verwenden Operatoren mit derselben Priorität, aber natürlich gibt es auch hier ein Datenrennen. Sie haben auch Recht d++<n, wenn Sie Recht haben. Aus irgendeinem Grund habe ich das nicht gesehen, als ich den Code neu geschrieben habe.
Algmyr

0

Axiom, 89 Bytes

f(x:PI):PI==(x=1=>1;g:=factor x;reduce(*,[nthFactor(g,i) for i in 1..numberOfFactors g]))

Test und Ergebnisse

(38) -> [[i, f(i)] for i in 1..30 ]
   (38)
   [[1,1], [2,2], [3,3], [4,2], [5,5], [6,6], [7,7], [8,2], [9,3], [10,10],
    [11,11], [12,6], [13,13], [14,14], [15,15], [16,2], [17,17], [18,6],
    [19,19], [20,10], [21,21], [22,22], [23,23], [24,6], [25,5], [26,26],
    [27,3], [28,14], [29,29], [30,30]]

Dies ist die Funktion, bei der factor () nicht verwendet wird

g(x:PI):PI==(w:=sqrt(x);r:=i:=1;repeat(i:=i+1;i>w or x<2=>break;x rem i=0=>(r:=r*i;repeat(x rem i=0=>(x:=x quo i);break)));r)

es sind aber nur 125 bytes


0

R, 52 Bytes

`if`((n=scan())<2,1,prod(unique(c(1,gmp::factorize(n))))

liest naus stdin. Erfordert die gmpInstallation der Bibliothek (damit TIO nicht funktioniert). Verwendet den gleichen Ansatz wie viele der obigen Antworten, stürzt jedoch bei der Eingabe von ab 1, da factorize(1)ein leerer Klassenvektor zurückgegeben wird bigz, der uniqueleider abstürzt .


Dies gibt 12 aus, wenn ich 12
eingebe

@Flounderer du bist richtig, ich habe den Code aktualisiert.
Giuseppe



0

Pyt , 3 Bytes

←ϼΠ

Erläuterung:

←                  Get input
 ϼ                 Get list of unique prime factors
  Π                Compute product of list
                   Implicit print
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.