Vous développez du code pour générer des numéros d'identification. La politique exige qu'aucun numéro d'identification n'inclue la séquence de chiffres 666 .
Créez une fonction (ou l'équivalent de votre langue) qui prend un paramètre entier positif et retourne le prochain entier qui n'inclut pas 666 lorsque cet entier est exprimé en décimal. (60606 va bien, 66600 ne va pas.)
Votre code ne doit pas utiliser une boucle qui en ajoute une jusqu'à ce qu'il trouve un résultat conforme aux règles.
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: Le
remplacement de 666 par 667 ne fonctionnera pas s'il y a plus d'un 666 dans l'entrée.
66700
.Réponses:
Python, pas de manipulation de chaîne
Fonctionne en recherchant des puissances de 10
p
,, où 666 apparaît et en ajoutantp - n % p
àn
qui remplace666xxxxx
par66700000
.la source
m /= 10
àm //= 10
. Si vous ne le faites pas, m deviendra un float et la conditionm % 1000 == 666
sera continuellement fausse et les autres "666" dans n resteront inchangés.JavaScript (mis à jour pour fonctionner avec tous les cas de test)
La vérité peu connue, c’est qu’il ya en fait quatre
6
, mais l’un des trahis a été trahi et il a été transformé en code pour les éradiquer des chiffres dumonde. Voici ces six traîtres:Voici une explication. Tout d’abord, embellissez le code et supprimez les éléments inutiles tels que
''+'string'
et((code))
:Convertissez les notations étranges (comme
~indexOf
et['replace']
) en notations plus courantes:Et maintenant, comprenez simplement que l’algorithme va comme ceci:
S'il y a déjà un 666 dans l'entrée,
autre,
Ancienne version (ne fonctionne pas pour
666666666
) :Pour le comprendre, commençons par l'embellir:
Maintenant , nous allons supprimer les choses inutiles comme
'' + string
et'str' + 'ing'
, supprimer la inutiles
variable et changement bizarreries comme-~![]
dans1
:'l ength'['replace'](/ /g,'')
est simplement"length"
:Et
"undefined"[0]
est"u"
et"u".length
est1
:Maintenant nous avons fini! Cela devrait être assez facile à comprendre maintenant.
la source
666666666
666666666
, et la police de caractères6
est la plus chère;)~1
pour!= -1
c'est plutôt cool.~a.indexOf('b')
génère le bon JS, essayez-le sur livescript.net!Applescript
Ce site n'a pas assez de réponses Applescript. Permet de bannir certains démons!
Journal de sortie:
J'avais envie de citer quelques-unes des citations les plus puissantes de The Exorcist , mais cela aurait certainement rendu ce post affiché sur NSFW. Vous pouvez lire la page IMDB à la place.
la source
Perl
Vous avez dit que nous ne devons pas incrémenter dans une boucle. Je n'utilise aucun opérateur mathématique du tout! Voici une approche de substitution purement rationnelle (rien ne garantit que votre santé mentale sera sans danger).
Les trois premières substitutions incrémentent le nombre d'un. J'ai déjà résolu ce problème moi-même une fois, mais cela incluait une substitution qui devait être bouclée jusqu'à ce qu'aucune autre substitution ne soit faite. J'ai donc utilisé l'approche d'Andrew Cheong à la place.
La quatrième substitution transforme tous les chiffres qui suivent un
666
en zéros. La substitution finale transforme le reste666
en a667
.En prime, cela fonctionnera avec plusieurs nombres entiers dans l'entrée, à condition qu'ils soient séparés par des caractères non numériques.
la source
LiveScript
C'est plier les règles. Vous voyez, vous avez dit que je ne devais pas utiliser une boucle qui en ajoute une jusqu'à ce qu'elle trouve un résultat correct. Donc, je soustrais moins un à la place!
Une version de golf dans
534845 octets pour le plaisir:Merci à user1737909 pour l’avoir aidé à jouer au golf.
Des tests
Requiert Node.js avec le
LiveScript
module npm ou une bibliothèque d'assert compatible.la source
Rubis
C’est (je pense) la première réponse qui marche pour 666666666. (À l’exception de la soustraction cheaty -1 réponse;;))
Je suis pressé maintenant; l'explication sera ajoutée plus tard.
Mise à jour : version beaucoup plus efficace (durée d'exécution presque constante, je crois):
la source
PowerShell
la source
J
Enfin, un bon usage pour
E.
!Essentiellement, nous trouvons la première position dans laquelle l'argument a une valeur complète
666
, et nous remplaçons cette sous-chaîne et tout ce qui suit par66700000...
jusqu'à la fin.Expliqué en détail:
":@>:
- Incrémenter de un et convertir en chaîne.'666'&E.
- Créez un vecteur de booléens, vrai à chaque endroit qui commence par «666» dans la chaîne.i.1:
- Trouver l'index du premier vrai dans le vecteur, sinon renvoyer la longueur du vecteur.#@[-]
- Longueur de la chaîne (qui est aussi la longueur du vecteur) moins le résultat dei.
.'667'{.!.'0'~
- Prenez une sous-chaîne de '667' avec une longueur de ce résultat, en complétant à droite par '0' si nécessaire.{.~
- Prenez une sous-chaîne avec la longueur du résultat original dei.
.,
- Ajouter les deux ensemble.Utilisé:
Et comme il ne s’agit pas d’un code de golf, il n’est pas nécessaire de jouer au golf avec des optimisations loufoques. Tout le monde gagne!
la source
C #
148137 caractèresA été capable de raser quelques caractères grâce à @recursive
Ungolfed:
Violon: http://dotnetfiddle.net/XB83bf
la source
Int32
peut être remplacé parint
.Python
la source
Perl
Code en ligne qui modifie le contenu à l'intérieur
$_
, une idéologie assez standard en Perl. Peut être utilisé avec un-p
drapeau comme ceci:la source
J
Aucune ficelle, boucle ou conditionnel:
De la même manière que la solution de cardboard_box, cela divise le nombre en groupes de trois chiffres en divisant par dix. Il utilise l'indice de la première occurrence de 666 pour arrondir le nombre correctement.
la source
Haskell (70 caractères)
Voici une implémentation simple en Haskell.
map digitToInt . show
convertit un identifiant éventuellement diabolique en une liste de chiffres.purge
correspond au modèle pervers et le remplace par son bon équivalent.foldl' ((+).(*10)) 0
réduit la liste des chiffres à unInteger
.Voyons si ça marche!
Cela semble bon. Et juste pour le plaisir une version golfée.
la source
Java
N'est-ce pas suffisant de faire ça?
la source
String.valueOf(currentId + 1)
.return Integer.parseInt(String.valueOf(currentId + 1).replace("666", "667"));
R
Remplacement de 666 par 667 œuvres.
Résultats
la source
3 réponses JavaScript différentes:
1. JavaScript (ECMAScript 6)
Convertit le nombre à une chaîne itère ensuite sur chaque caractère jusqu'à ce qu'il trouve
666
alors il change cette dernière6
à un7
et les sorties0
pour tous les caractères suivants.2. JavaScript (projet ECMAScript 6)
Fonction récursive sans manipulation de chaîne:
Ou plus verbalement:
Tests:
3. JavaScript
En utilisant des expressions régulières:
Ou (le même mais en utilisant ECMAScript 6)
la source
6.667
tellement techniquement, elle est toujours là. Ne pensez pas que cela puisse être aidé cependant.1e20
est à peu près le plus grand ordre de grandeur que JavaScript (du moins dans FireFox) imprimera sous forme d’entier sans recourir à la notation scientifique.AWK
donne
edit: 2ème solution
les rendements
la source
awk
les chaînes basées sur 1 indexaient.f(665) returns 667
il demande "le prochain nombre entier ne comprenant pas 666"awk
ish et b) minimise l'utilisation de fonctions de chaîne.Python:
Ou:
la source
666666
au667667
lieu de667000
?Java
Utilisation de la fonction récursive pour trouver le 666 le plus à gauche et calculer le montant à ajuster lors de la reprise de la pile d’appels.
la source
f(666666666) -> 667000000
popularity-contest
, pas uncode-golf
.Lot
Manipulation simple de chaîne itérée.
Il commence aux trois premiers caractères du nombre (sous forme de chaîne) et continue jusqu'à la fin jusqu'à ce qu'il trouve 666, il remplace ensuite 666 par 667 et boucle à la longueur de la chaîne ajoutant des zéros.
Les cas de test produisent tous les résultats corrects.
la source
perl, 45 octets
Une seule expression rationnelle avec le drapeau / e fait tout le travail ici:
la source
SQL
Pour être précis, SQL Server 2012 Transact-SQL.
la source
Python
la source
Julia
REPL résultats
la source
C #
Est-ce que je le fais bien
la source
vba
En action:
résultat:
la source
C ++
Je sais que ce n'est pas du code-golf, mais (a) certaines personnes ont suggéré que c'était un bon défi de golf et (b) c'est ma première réponse au défi / golf, je pensais que ce serait amusant et Ici, je ne me vois pas dans un véritable défi de golf parce que je suis un terrible golfeur. X)
Fondamentalement, remplacer «666» par «667» fonctionne si vous le faites pour la première instance du nombre puis écrivez les 0 finaux.
Golfé (
175155 caractères):Ungolfed:
la source
x+=c=='6'?1:0
, vous pouvez vous en tirerx+=c=='6'
. Je n'ai pas essayé, cependant.std::
avantstringstream
. Il ne compile pas sans cela.x+=c=='6'
réduction, en plus de regarder cela avec int digits plutôt qu'avec les caractères sstream ...Rubis
la source
perl, 36 juste un sous, pas d'octets
Une version plus courte que ma dernière solution, utilisant un mélange d'arithmétique et de regex ops.
la source
C
OK - pas de limite à vérifier et beaucoup trop d’espace, mais ce n’est pas du golf. Aussi un peu amusant de formatage dans "while (d -> 0)".
la source