Betrachten Sie die natürliche Reihenfolge bis 6 (ignorieren Sie 1) :
2,3,4,5,6
Wir scannen von links (in diesem Fall von 2), suchen nach einer durch 2 teilbaren Zahl (hier 4) und entfernen dann beide Zahlen aus der Liste (hier 2 & 4), sodass die Liste sich auf Folgendes reduziert:
3,5,6
Wir setzen den gleichen Prozess fort, hier ganz links ist 3, also suchen wir nach einer durch 3 teilbaren Zahl. 6 ist mit Sicherheit diese Zahl und somit werden 3 und 6 entfernt.
5
Nun können keine weiteren derartigen Suchvorgänge durchgeführt werden. Somit wird dies die Liste von ALONED-Zahlen für n = 6.
ZIELSETZUNG
- Wenn n größer als 1 ist, drucken Sie alle entsprechenden Alone-Nummern.
EINGANG
2
6
15
20
22
AUSGABE
2
5
8,9,11,12,13,15
11,12,13,15,17,19,20
12,13,15,17,19,20,21
NOCH EIN ANDERES AUSGEARBEITETES BEISPIEL
Für n = 22
=>2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22
=>3,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22 (remove 2 & 4)
=>5,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22 (remove 3 & 6)
=>7,8,9,11,12,13,14,15,16,17,18,19,20,21,22 (remove 5 & 10)
=>8,9,11,12,13,15,16,17,18,19,20,21,22 (remove 7 & 14)
=>9,11,12,13,15,17,18,19,20,21,22 (remove 8 & 16)
=>11,12,13,15,17,19,20,21,22 (remove 9 & 18)
=>12,13,15,17,19,20,21 (remove 11 & 22) (OUTPUT)
Das ist Code-Golf , also gewinnt der kürzeste Code in Bytes.
Antworten:
05AB1E ,
22171514 BytesProbieren Sie es online!
Erläuterung
quelle
Python 2,
907973 Bytes-6 Bytes dank xnor
Nimmt die eingegebene Nummer auf stdin. Ideone es!
Erläuterung
Wir konstruieren die Anfangsliste aus der eingegebenen Nummer und speichern sie in
L
. Schleifen Sie als nächstes, während die letzte Zahl größer oder gleich dem Zweifachen der ersten Zahl ist, und entfernen Sie das Zweifache der ersten Zahl aus der Liste. Dies ist immer die nächste Zahl, die durch teilbar istL[0]
.L=L[1:]
nimmt auch die erste Nummer ab. Wenn die Bedingung nicht mehr erfüllt ist, können keine weiteren Entfernungen vorgenommen werden, und die Liste wird gedruckt.quelle
range
bereits eine Liste.Python, 61 Bytes
Es ist ein bisschen einfacher, diesen weniger Golf-Code zu verstehen:
Dies nutzt eine direkte Charakterisierung von Aloned Numbers:
Warum gilt das? Wenn Sie den Vorgang für
n
ausführen, sagen wir, wir entfernen eine ungerade Zahla
in der unteren Hälfte (1
bis)n/2
). Dann2*a
wird entfernt, egal wo in der Liste es ist. Also4*a
bleibt (wenn es existiert). Wenn es sich jedoch in der unteren Hälfte befindet, gelangt der Löschvorgang dorthin und entfernt beide4*a
und8*a
. So sehen wir , dass eine obere Hälfte Nummer entfernt wird , wenn es von Form ist2*a
,8*a
... mit ungeradenc
, aber bleibt , wenn es Form hata
,4*a
,8*a
, ...Die Ausnahme ist für
a=1
, die nicht in der Liste beginnt und so nicht entfernt wird. Infolgedessen beginnt die Entfernungskette mita=2
und die Regel für Zweierpotenzen wird umgedreht.In dem obigen Code,
(i&-i)**.5%1>0
ob Kontrolleni
fehlen die Formi = a * 2^b
mitb
ungeraden, durch den Bit-Trick , um den größten Macht-of-Zwei - Faktor, zu extrahieren2^b = i&-i
, dann überprüft , ob das Ergebnis nicht ein perfekter Platz. Danni&~-i>0
ist ein weiterer Trick, um zu überprüfen, obi
keine perfekte Potenz von 2 vorliegt. Diese Bedingungen werden dann korrigiert.Hier gibt es noch einige Verbesserungen
Zuerst verschieben wir den Index für den Bereich 1 nach unten, um ihn auf zu verkürzen
range(n/2,n)
vonrange(n/2+1,n+1)
und kompensieren dies, indem allei
durchi+1
(oder~-i
) ersetzen .Ob eine Potenz von 2 ist die Nummer eine Potenz von
4
(2 ^b
mitb
selbst) durch und-ing mit geprüft werden ,2**c/3
für einige großec
. Dies liegt daran, dass2**c/3
eine binäre Darstellung10101...101
mit Einsen in den geradzahlig positionierten Bits vorliegt. Mitc=2*n
genügt. Ergebnis zu negieren, wenni
eine Potenz von 2 ist, halbieren wir diese Zahl in diesem Fall, indem wir1
stattdessen die ungeraden Positionen verwenden.quelle
Groovy,
6558 BytesAlgorithmusidee von DSLoc , der gemerkt hat, dass man nur die entfernen muss.
Hier ist eine Aufschlüsselung:
quelle
Perl,
53494544 BytesBeinhaltet +1 für
-n
Geben Sie die Eingangsnummer für STDIN ein:
aloned.pl
:Die direkte Überprüfung der möglichen Nummern ist länger:
Dies überprüft alle Zahlen im oberen Bereich. Behalten Sie Zahlen mit einer geraden Zahl von 2 als Primfaktoren bei, es sei denn, die Zahl ist eine Potenz von 2 und dann ungerade (da 1 nicht in der ursprünglichen Reihe enthalten ist). Diese Methode sollte jedoch für andere Sprachen gut funktionieren.
quelle
MATL , 18 Bytes
Ausgeliehene Idee "Multiplizieren mit 2" aus @ Emignas Antwort 05AB1E .
Probieren Sie es online!
Erläuterung
quelle
Haskell,
71696256 BytesAnwendungsbeispiel:
q 22
->[12,13,15,17,19,20,21]
.Wenn es ein Vielfaches der ersten Zahl gibt
a
, dann ist es2*a
. Behalten Sie bei,a
wenn2*a
nicht in der Liste und fügen Sie einen rekursiven Anruf hinzua
und2*a
entfernen Sie ihn aus der Liste.quelle
Pyth - 19 Bytes
Wird definitiv umgestalten.
Test Suite .
quelle
Ruby, 124
Der Vergleich von Punktzahlen mit anderen Antworten ist offensichtlich der falsche Ansatz:
Das etwas clevere Bit hier ist,
a[g[0]]=a[g[1]]=!g[1]
das die Hash-Werte nach Bedarf auf wahr / falsch setzt.quelle
PHP, 98 Bytes
8 Bytes sparen durch @Titus Danke
Wenn ein nachlauf Komma erlaubt wird , dann kann es 9 Bytes verkürzen
(!$a?:print"$a,");
statt(!$a?:print$x?",$a":$x=$a);
quelle
$a
und$b
brauchen Klammern? Böse!(!$a?:print"$a,")
->print$a?"$a,":""
. -2 Bytes für beide Versionen, wenn Sie den Unterstrich als Trennzeichen verwenden.foreach(... as$v)
,$v-2
anstatt$k
und$v*2-2
anstelle von$k*2+2
.$a=&$r[$k]&&$b=&$r[$k*2+2]
funktioniert$a=$r[$k]and$b=$r[$k*2+2]
. Es tut mir leid, dass ich keine Seite gefunden habe, die Kombinationen mit Referenzen und dem&&
Operator erklärt. Aber ich brauche Referenzen, keine Aufgaben. Ich bin nicht sicher, ob ein nachgestelltes Komma oder ein anderes Trennzeichen zulässig ist.&
bitweise und Referenzen haben eine höhere Priorität als der&&
OperatorJavascript, 149 Bytes
Hier ist ein funktionierendes Beispiel. Alle HTML- und wrapper () -Funktionen sind nur so, dass sie tatsächlich interaktiv sind.
Code-Snippet anzeigen
Dieses Code-Snippet enthält einige Kommentare und ermöglicht es Ihnen, die Schritte für eine bestimmte Eingabe interaktiv anzuzeigen.
Code-Snippet anzeigen
quelle
JavaScript (ES6), 92 Byte
Ich dachte, ich hätte das gestern gepostet, aber offensichtlich nicht ...
Hier ist eine andere Version:
quelle
Java 7, 210 Bytes
Kann definitiv mit einem anderen Ansatz, wahrscheinlich mit einem Array mit einigen Tricks, noch mehr Golf gespielt werden. Aufgrund der Besetzung, der Unterbrechung, der getippten Liste und der If-Checks ist es etwas länger als erwartet, aber es funktioniert.
Ungolfed & Testcode:
Probieren Sie es hier aus.
Ausgabe:
quelle
Schläger 191 Bytes
Ungolfed (Kommentare nach ';'):
Testen:
Ausgabe:
quelle