Sie entwickeln Code, um ID-Nummern zu generieren. Die Richtlinie erfordert, dass keine ID-Nummern die Ziffernfolge 666 enthalten .
Erstellen Sie eine Funktion (oder das Äquivalent Ihrer Sprache), die einen positiven Ganzzahlparameter verwendet und die nächste Ganzzahl zurückgibt, die 666 nicht enthält, wenn diese Ganzzahl in Dezimalzahl ausgedrückt wird. (60606 ist in Ordnung, 66600 nicht.)
Ihr Code darf keine Schleife verwenden, in der eine hinzugefügt wird, bis ein Ergebnis gefunden wird, das den Regeln entspricht.
f(1) returns 2.
f(665) returns 667.
f(665999999) returns 667000000 without having looped a million times.
(Following examples added since the question was first posed.)
f(666666666) also returns 667000000.
f(66600) returns 66700.
f(456667) returns 456670.
UPDATE: Das
Ersetzen von 666 durch 667 funktioniert nicht, wenn mehr als ein 666 in der Eingabe vorhanden ist.
66700
.Antworten:
Python, keine Manipulation von Strings
Werke von Potenzen von 10 zu finden,
p
wo 666 erscheint, und das Hinzufügenp - n % p
zun
dem ersetzt666xxxxx
mit66700000
.quelle
m /= 10
zum //= 10
. Wenn Sie dies nicht tun, wird m ein Float und die Bedingungm % 1000 == 666
wird fortwährend falsch und andere "666" in n bleiben unverändert.JavaScript (aktualisiert für alle Testfälle)
Die wenig bekannte Wahrheit ist, dass es tatsächlich vier
6
s gibt, von denen jedoch eines die anderen verraten und in Codeform polymorphisiert hat, um sie aus den Ziffern derWeltauszurotten . Hier ist die verräterische Sechs:Hier ist eine Erklärung. Verschönern Sie zuerst den Code und entfernen Sie unnötige Dinge wie
''+'string'
und((code))
:Konvertieren Sie seltsame Notationen (wie
~indexOf
und['replace']
) in häufigere:Und jetzt verstehe einfach, dass der Algorithmus so abläuft:
Befindet sich bereits eine 666 in der Eingabe,
sonst,
Alte Version (funktioniert nicht für
666666666
) :Um dies zu verstehen, verschönern wir es zuerst:
Jetzt entfernen wir nutzlose Dinge wie
'' + string
und'str' + 'ing'
, entfernen die unnötiges
Variable und ändern die Verrücktheit-~![]
in1
:'l ength'['replace'](/ /g,'')
ist einfach"length"
:Und
"undefined"[0]
ist"u"
und"u".length
ist1
:Jetzt sind wir fertig! Es sollte jetzt ziemlich einfach zu verstehen sein.
quelle
666666666
666666666
und die Schriftart des6
ist schicker;)~1
für!= -1
ist ziemlich cool.~a.indexOf('b')
generiert das richtige JS, probiere es auf livescript.net aus!Applescript
Diese Seite hat nicht genügend Applescript-Antworten. Lasst uns einige Dämonen verbannen!
Protokollausgabe:
Ich wollte einige der mächtigeren Zitate von The Exorcist dazu bringen, aber das hätte dazu geführt, dass dies entschieden NSFW geschrieben hätte. Sie können stattdessen die IMDB-Seite lesen.
quelle
Perl
Sie sagten, wir dürfen nicht in einer Schleife inkrementieren. Ich verwende überhaupt keine mathematischen Operatoren! Hier ist ein reiner Regex-Substitutionsansatz (keine Garantie für Ihre Gesundheit).
Die ersten drei Ersetzungen erhöhen die Zahl um eins. Ich habe dieses Problem selbst einmal gelöst, aber es enthielt eine Substitution, die wiederholt werden musste, bis keine Substitutionen mehr vorgenommen wurden, sodass ich stattdessen Andrew Cheongs Ansatz verwendete.
Die vierte Ersetzung verwandelt alle Ziffern nach a
666
in Nullen. Die endgültige Auswechslung macht den Rest666
zu einem667
.Als Bonus funktioniert dies mit mehreren Ganzzahlen in der Eingabe, solange diese durch nicht-stellige Zeichen getrennt sind.
quelle
LiveScript
Das verbiegt die Regeln. Sie haben gesagt, ich darf keine Schleife verwenden, die eine hinzufügt, bis ein korrektes Ergebnis gefunden wird. Also ziehe ich stattdessen minus eins ab !
Eine Golfversion in
534845 Bytes zum Spaß:Vielen Dank an user1737909 für die weitere Unterstützung beim Golfen.
Tests
Benötigt Node.js mit dem
LiveScript
npm-Modul oder einer kompatiblen Assert-Bibliothek.quelle
Rubin
Dies ist (glaube ich) die erste Antwort, die für 666666666 funktioniert. (Außer der betrügerischen Subtraktion von -1-Antwort.;))
Ich bin jetzt in Eile; Erklärung wird später hinzugefügt.
Update : wesentlich effizientere Version (fast konstante Laufzeit, glaube ich):
quelle
Power Shell
quelle
J
Endlich eine gute Verwendung für
E.
!Im Wesentlichen finden wir die erste Position, an der das Argument voll ist
666
, und ersetzen diese Teilzeichenfolge und alles weitere durch66700000...
bis zum Ende.Im Detail erklärt:
":@>:
- Inkrementiere um eins und konvertiere in einen String.'666'&E.
- Machen Sie einen Vektor aus Booleschen Werten, der an jeder Stelle wahr ist, an der '666' in der Zeichenfolge beginnt.i.1:
- Finden Sie den Index des ersten wahren im Vektor, sonst geben Sie die Länge des Vektors zurück.#@[-]
- Länge der Zeichenkette (die auch die Länge des Vektors ist) abzüglich des Ergebnisses voni.
.'667'{.!.'0'~
- Nehmen Sie einen Teilstring von '667' mit der Länge dieses Ergebnisses und füllen Sie ihn bei Bedarf rechts mit '0' auf.{.~
- Nehmen Sie einen Teilstring mit der Länge des Originalergebnisses ausi.
.,
- Fügen Sie die beiden zusammen.In Benutzung:
Und da dies kein Code-Golf ist, muss dies nicht mit verrückten Optimierungen zur Hölle golfen. Jeder gewinnt!
quelle
C #
148137 ZeichenKonnte dank @recursive ein paar Zeichen abschneiden
Ungolfed:
Geige: http://dotnetfiddle.net/XB83bf
quelle
Int32
kann durch ersetzt werdenint
.Python
quelle
Perl
Inline-Code, der den Inhalt ändert
$_
, eine hübsche Standardideologie in Perl. Kann in Verbindung mit folgender-p
Flagge verwendet werden:quelle
J
Keine Saiten, Schleifen oder Bedingungen:
Ähnlich wie bei der Lösung von cardboard_box wird die Zahl durch Division durch Zehnerpotenzen in Dreiergruppen unterteilt. Es verwendet den Index des ersten Vorkommens von 666, um die Zahl entsprechend aufzurunden.
quelle
Haskell (70 Zeichen)
Hier ist eine einfache Implementierung in Haskell.
map digitToInt . show
eine möglicherweise böse ID in eine Liste von Ziffern konvertiert.purge
das böse Muster abgeglichen und durch sein gutes Äquivalent ersetzt.foldl' ((+).(*10)) 0
reduziert die Liste der Stellen einInteger
.Mal sehen, ob es funktioniert!
Sieht gut aus. Und nur zum Spaß eine Golfversion.
quelle
Java
Reicht das nicht aus?
quelle
String.valueOf(currentId + 1)
.return Integer.parseInt(String.valueOf(currentId + 1).replace("666", "667"));
R
Das Ersetzen von 666 durch 667 funktioniert.
Ergebnisse
quelle
3 verschiedene JavaScript-Antworten:
1. JavaScript (ECMAScript 6)
Wandelt die Zahl in eine Zeichenfolge um und durchläuft jedes Zeichen, bis festgestellt
666
wird, dass die letzte6
in a geändert7
und0
für alle folgenden Zeichen ausgegeben wird.2. JavaScript (ECMAScript 6-Entwurf)
Rekursive Funktion ohne Stringmanipulation:
Oder ausführlicher:
Tests:
3. JavaScript
Reguläre Ausdrücke verwenden:
Oder (das gleiche, aber mit ECMAScript 6)
quelle
6.667
, der technisch gesehen immer noch vorhanden ist. Glaube aber nicht, dass es geholfen werden kann.1e20
ist ungefähr die größte Größenordnung, die JavaScript (zumindest in FireFox) als Ganzzahl ausgibt, ohne auf wissenschaftliche Notation zurückzugreifen.AWK
gibt
edit: 2. lösung
Ausbeuten
quelle
awk
Indexe Strings 1-basiert sind.f(665) returns 667
wird nach "der nächsten Ganzzahl ohne 666"awk
ish und b) die Verwendung von String-Funktionen minimiert.Python:
Oder:
quelle
666666
in667667
statt667000
?Java
Verwenden der rekursiven Funktion, um 666 ganz links zu finden, und Berechnen, um wie viel die Nummer angepasst werden muss, wenn der Call-Stack erneut abgerufen wird.
quelle
f(666666666) -> 667000000
popularity-contest
, keincode-golf
.Stapel
Einfache iterierte String-Manipulation.
Es beginnt bei den ersten drei Zeichen der Zahl (als Zeichenfolge) und arbeitet sich bis zum Ende vor, bis 666 gefunden wird. Anschließend wird diese 666 durch 667 ersetzt und eine Schleife bis zur Länge der Zeichenfolge ausgeführt, wobei Nullen hinzugefügt werden.
Die Testfälle liefern alle die richtigen Ergebnisse.
quelle
Perl, 45 Bytes
Ein einzelner regulärer Ausdruck mit dem Flag / e erledigt hier die ganze Arbeit:
quelle
SQL
Um genau zu sein, SQL Server 2012 Transact-SQL.
quelle
Python
quelle
Julia
REPL-Ergebnisse
quelle
C #
Mache ich das richtig
quelle
vba
In Aktion:
Ergebnis:
quelle
C ++
Ich weiß, dass dies kein Code-Golf ist, aber (a) einige Leute haben vorgeschlagen, dass es eine gute Golf-Herausforderung ist, und (b) dies ist meine erste Herausforderung / Golf-Antwort, ich dachte, es würde Spaß machen, und wenn ich es tue Dies hier Ich werde nicht in einer tatsächlichen Golf-Herausforderung für einen schrecklichen Golfer auftauchen. X)
Grundsätzlich funktioniert das Ersetzen von '666' durch '667', wenn Sie dies zum ersten Mal in der Zahl tun und dann die nachstehenden Nullen ausschreiben.
Golf (
175155 Zeichen):Ungolfed:
quelle
x+=c=='6'?1:0
, du kannst damit durchkommenx+=c=='6'
. Hab es aber nicht ausprobiert.std::
vorher ausgelassenstringstream
. Ohne das kompiliert es nicht.x+=c=='6'
Reduzierung sowie dies mit Int-Ziffern anstelle von Sstream-Zeichen zu tun suchen ...Rubin
quelle
Perl, 36 nur ein Unter, keine Bytes
Eine kürzere Version als meine letzte Lösung, die eine Mischung aus arithmetischen und regulären Operationen verwendet.
quelle
C
OK - keine Einschränkungen und viel zu viel Leerzeichen, aber es ist kein Golf. Auch ein bisschen Spaß beim Formatieren in "while (d -> 0)".
quelle