Herausforderung
Bei einer positiven Ganzzahl von N
28 oder mehr wird eine Liste von Zahlen ausgegeben N
, in der jede Ziffer genau einmal 1
durchlaufen wird 7
. Sie können als Programm oder Funktion geben.
Die Ziffern können einzeln oder verkettet angezeigt werden, sofern Sie sie ohne Wiederholungen jeweils einmal verwenden. Beispielsweise [12, 34, 56, 7]
ist gültig, wie [1, 27, 6, 4, 35]
und [1234, 567]
, aber nicht [123, 34567]
oder [3, 2, 1476]
. Die Reihenfolge, in der die Nummern aufgelistet sind, spielt keine Rolle.
Wenn N
dies mit 1-7 nicht möglich ist, geben Sie nichts zurück oder geben Sie nichts aus.
Andere Informationen
Dies ist Codegolf, daher gewinnt der kürzeste Code in Bytes bis Donnerstag, den 15. Oktober.
Stellen Sie Fragen in den Kommentaren.
Alles, was ich in der Herausforderung nicht spezifiziere, liegt bei Ihnen.
Standardlücken sind nicht zulässig.
Beispiele
Dies kann Verwirrung stiften:
Eingang
28
Ausgabe
[1, 2, 3, 4, 5, 6, 7]
Eingang
100
Ausgabe
[56, 7, 4, 31, 2]
Eingang
1234567
Ausgabe
[1234567]
Eingang
29
Ausgabe
Nichts, 29 ist ungültig.
Eingang
1891
Ausgabe
[1234, 657]
Eingang
370
Ausgabe
[15, 342, 7, 6]
Ich werde mehr machen, wenn nötig.
Hier ist ein Pastebin aller möglichen Zahlen, die mit diesen sieben Zahlen erstellt wurden, mit freundlicher Genehmigung von FryAmTheEggman.
29
?(N/A)
als Ausgabe.[1234566, 1]
ist keine gültige Ausgabe, da 6 wiederholt wird. Sie dürfen keine Zahlen in der Ausgabe wiederholen.1, ..,, 7
sodass mindestens so viele1
wie10
, mindestens so viele10
wie100
usw. vorhanden sind.Antworten:
Pyth,
1814 BytesVielen Dank an @isaacg für das Abschlagen von 2 Bytes und den Weg für 2 weitere.
Der Code stürzt ab, wenn keine Ausgabe erzeugt wird, wodurch keine Ausgabe erzeugt wird.
Dies funktioniert für kleine Eingaben, wenn Sie geduldig genug sind, und für größere, wenn Sie genügend Zeit und Speicher haben.
Um zu überprüfen, ob der Code wie beabsichtigt funktioniert, können Sie den Code
7
durch ein3
für die Ziffern 1 bis 3 ersetzen . Klicken Sie hier für eine Testsuite.Beispiel läuft
Wie es funktioniert
quelle
r\1\8
. Ist auch@ .. 0
das selbe wieh
.h
, aber ich hatte keine Ahnung, dass Sie es so gebrauchen könntenS
. (Die Zeichenreferenz im Online-Interpreter erwähnt es nicht.)jkS7
Scheint noch kürzer zu sein, da ich es nichts
mehr brauche .Python 3, 109
Eine Funktion, die eine Zahl annimmt und ein Tupel wie dieses ausgibt
123,4567,
. Ja, das ist ein gültiges Tupel.Die Idee ist, alle möglichen Zeichenfolgen so zu generieren
43,126,7,5,
, dass die Ziffern1
durch7
Kommas getrennt sind, ohne dass zwei Kommas aufeinander folgen. Werten Sie diesen Ausdruck als Tupel aus und seine Summe ist gleichn
, drucken Sie ihn aus und schließen Sie ihn mit einem Fehler ab.Um alle diese Zeichenfolgen zu erstellen, verfolgen wir die
s
zu verwendenden Zeichen und versuchen, sie entweder mit einem Komma zu versehen, wodurch die Ziffer am Ende der Eingabe endet, oder ohne, in welchem Fall sich zukünftige Ziffern darauf verketten.Kurzschluss wird verwendet, um zu überprüfen, dass
s
das Feld leer ist, weil das Listenfeld leer istn==sum(eval(l))
. In diesem Fall wird gedrucktl
und mit einem Fehler beendet, indem~
dasNone
zurückgegebene Feld gedruckt wird (danke an Sp3000 dafür.).Ich glaube, dass in Python 3.5 zwei Zeichen durch Schreiben gespeichert werden können
s={*'1234567'}
(danke Sp3000).Es gibt einige kleine Ärgernisse, die Zeichen auffressen. Einer ist , dass in dem Fall , dass
l
wie die Suche1234567
ohne Komma, es als eine einzelne Zahl analysiert wird und Aufrufsum
gibt einen Fehler. Dies geschieht mit dem Hack, bei dem manl
mit dem Element beginnt0
und es beim Drucken entfernt. Dies kostet 6 Zeichen.Das Durchlaufen
c
des Kommas und der leeren Zeichenfolge ist ärgerlich wortreichfor c in(',','')
, da Python 3 nicht zulässt, dass dieses Tupel nackt ist. Ich möchte,?
dass es ein',?'
Zeichen gibt, das in Zahlen ignoriert wird, um 4 Zeichen weniger zu tun , aber es scheint kein solches Zeichen zu geben.Alte Methode:
Python 2, 117
Definiert eine Funktion, die eine Nummer annimmt und eine Liste druckt.
Die Idee ist, mit der Rekursion jeden Zweig auszuprobieren. Die Variablen verfolgen sind
n
benötigts
noch zu verwendenden Ziffernl
der bisher gemachten Nummernp
Wenn
n==0
unds
leer ist, drucken Siel
und beenden Sie durch Fehler.Wenn die aktuelle teilweise gebildete Zahl
p
nicht Null ist, versuchen Sie, sie zur Liste hinzuzufügen und von der verbleibenden Summe zu entfernen.Versuchen Sie für jede Ziffer, die
x
wir von verwenden könnens
, sie anzuhängenp
und zu entfernens
.quelle
Pyth, 23
Naive Brute Force, online zu langsam, dauert auf meinem Computer ungefähr eine Minute. Verwendet das übliche Muster "Schleife für immer bis zur Ausnahme" von Pyth-Golf, bei dem der Zugriff auf die resultierende gefilterte Liste von Kombinationen einen Fehler für unmögliche Zahlen verursacht, wie z
29
.Ausgänge wie eine Python-Liste, z
Hier ist eine Paste aller 10136-Nummern, die auf diese Weise erstellt werden können.
quelle
Python 2.7,
178172169 BytesBeachten Sie, dass die letzten drei Zeilen mit Tabulatoren eingerückt werden sollen, aber ich kann in diesem Editor nicht herausfinden, wie das geht.
Bearbeiten: Eine Ebene der Verschachtelung mit Hilfe von Sp3000 abgeflacht
quelle
JavaScript (ES6), 165
196Edit etwas gekürzt. Könnte kürzer sein
eval
, aber ich mag es, schnell zu seinBrute Force, schändlicherweise länger als die Pith-Version, aber schneller. Testen Sie das folgende Snippet in einem EcmaScript 6-kompatiblen Browser.
quelle
Python 2,
270268 BytesIch arbeite immer noch am Golfen.
Dies wiederholt sich, bis eine Übereinstimmung gefunden wird.
quelle
import as
ist selten notwendig - das kannst dufrom itertools import*;P=permutations
map(str,i)
als das Listenverständnis, und Sie können die Liste r direkt erstellen, anstatt eine verschachtelte Liste:r=[int(''.join(map(str,i)))for j in x for i in P(x,j)]
zu reduzieren. Ähnliches gilt für t.`n`
anstelle von verwendenstr(n)
, dan
die maximale Ganzzahl nie überschritten wird.Haskell (145 Bytes)
Verwendet die Rekursion.
Ungolfed (337 Bytes):
quelle
Scala, 195 Bytes
Dies ist nicht die effizienteste und es dauerte über 15 Minuten, um die Ausgabe für 29 zu erhalten, aber es funktioniert
Hier ist eine Ausgabe
quelle
Ruby, 105 Bytes
Rohe Gewalt! Überprüft jede Teilmenge der Längen zwischen 0 und 7 der Ganzzahlen zwischen 1 und 7654321 und stellt fest, ob eine davon unseren Kriterien entspricht. Sie möchten wahrscheinlich nicht warten, bis dies beendet ist.
Um den Algorithmus auszuführen und zu verifizieren, können Sie den Suchbereich einschränken, indem Sie
7654321
die größte Zahl eingeben, von der Sie wissen, dass sie in der Antwort enthalten ist. Zum Beispiel 56 für n = 100 oder 1234 für n = 1891. Hier ist ein Probelauf des letzteren:quelle