Contexte
Quand j'étais à l'école primaire, nous jouions à un jeu en classe de mathématiques qui se déroulait comme suit.
Tous les enfants sont assis dans un grand cercle et comptent à tour de rôle, à partir de 1 .
Toutefois, les nombres suivants doivent être ignorés lors du comptage:
- Les nombres qui sont des multiples de 3 .
- Nombres qui ont un 3 dans sa représentation décimale.
Les 15 premiers chiffres que les enfants devraient dire sont
1 2 4 5 7 8 10 11 14 16 17 19 20 22 25
Chaque fois que quelqu'un se trompe dans un numéro - dit un nombre qui n'est pas dans la séquence ou saute un nombre qui est - il est retiré du cercle. Cela continue jusqu'à ce qu'il ne reste qu'un seul enfant.
Tâche
Vous êtes mauvais à ce jeu, alors vous décidez de tricher. Ecrivez un programme ou une fonction qui, à partir d'un numéro de séquence, calcule le numéro suivant de la séquence.
Vous n'avez pas à gérer des nombres qui ne peuvent pas être représentés à l'aide du type numérique natif de votre langue, à condition que votre programme fonctionne correctement jusqu'à l'entrée 251 et que votre algorithme fonctionne pour des entrées arbitrairement grandes.
L'entrée et la sortie peuvent utiliser n'importe quelle base pratique.
Puisque vous devez cacher votre code, il doit être aussi court que possible. En fait, c'est du code-golf , donc le code le plus court en octets l'emporte.
Cas de test
1 -> 2
2 -> 4
11 -> 14
22 -> 25
29 -> 40
251 -> 254
la source
7
qui était omis quand je le jouais, mais vous diriez autre chose, au lieu de passer au numéro suivant.Réponses:
Brachylog , 10 octets
Essayez-le en ligne!
Explication
la source
JavaScript (ES6), 30 octets
la source
J, 24 octets
Approche directe qui consiste simplement à effectuer une itération ultérieure de l'entrée n jusqu'à ce qu'elle trouve le prochain nombre valide par les règles.
Formulaires cinq smileys,
$:
,:)
,0=
,=|
et>:
.Usage
Explication
la source
Python 2,
73 6643 octetsMerci à xnor de m'avoir dit que j'étais ridicule en utilisant 2 variables, et également à Mitch Schwartz.
la source
x=input()+1
while'3'[:x%3]in`x`:x+=1
print x
.x=~input()
, en soustrayant au lieu d’ajouter et en imprimant-x
.05AB1E , 11 octets
Essayez-le en ligne!
Explication
la source
Perl, 19 octets
Code de 18 octets + 1 pour
-p
.Usage
la source
Java 8,
57565550 octetsMerci à @Numberknot pour 1 octet Merci à @Kevin Cruijssen pour 5 octets
C'est un
Function<Integer, Integer>
Explication
Une implémentation naïve qui incrémente simplement jusqu'à atteindre un nombre acceptable.
Classe d'essai
Sortie de la classe de test:
la source
|
place de||
do-while
? Seulement une boucle régulière régulière est plus courte:i->{for(;++i%3<1|(i+"").contains("3"););return i;}
( 50 octets )while
etdo-while
, et ils m'ont tous les deux donné le même score, mais j'ai aimé ledo-while
look que j'avais ... je n'ai pas pensé à utiliser unefor
boucle ... Merci!Japt, 18 octets
Testez-le en ligne
J'ai enfin une chance d'utiliser
ß
:-)Comment ça marche
la source
PowerShell v2 +, 46 octets
Prend les entrées
$args[0]
, ajoute1
, enregistre dans$a
, démarre unefor
boucle. La conditionnelle maintient la boucle en cours tant que l'une$a-match3
(expression régulière)-or
$a%3
est égale à zéro (la valeur!
est la suivante1
). La boucle s'incrémente simplement$a++
. À la fin de la boucle, nous plaçons simplement$a
le pipeline et la sortie via impliciteWrite-Output
se produit à la fin du programme.Exemples
la source
R, 46 octets
la source
n
place decat(n)
.Python 2,
494442 octetsL'autre entrée de Python bat ceci (édition: pas plus :-D), mais je l'ai postée parce que j'aime plutôt son approche récursive. Merci à Mitch Schwarz et à Erik the Golfer de m'avoir aidé à raccourcir cette étape.
la source
f=lambda x:f(x+1)if x%3>1or'3'in`x+1`else-~x
. Si vous voulez garder Python 3, vous pouvez jouer au golf le dernierx+1
à-~x
et supprimer l'espace.f=lambda x:'3'[:~x%3]in`~x`and f(x+1)or-~x
etf=lambda x:f(x+1)if'3'[:~x%3]in`~x`else-~x
Lua, 58 octets
la source
Pyke, 13 octets
Essayez-le ici!
la source
while
au début.C #,
56, 51 octets.Ceci est étonnamment court pour une réponse en C #!
la source
t=x=>(++x)%3<1|(x+"").Contains("3")?t(x):x;
Dans Visual Studio, il vous suffit de définir la variable et de la définir sur nullFunc<int, int> t = null;
, puis de définir la fonction récursive sur la ligne suivante.Haskell,
5048 octetsEssayez-le sur Ideone. Sauvegardé 2 octets grâce à @Charlie Harding .
Alternative: (50 octets)
la source
until(\x->mod x 3>0&¬Elem '3'(show x))succ.succ
.Pyth, 11 octets
Essayez-le en ligne: démonstration ou suite de tests
Explication:
la source
GolfSharp , 43 octets
la source
Ruby, 47 octets
Je sens vraiment que cela peut être joué au golf plus loin.
la source
i
au lieu de"#{i}"
MATL , 14 octets
Essayez-le en ligne!
Explication
la source
Labyrinth ,
117102 octetsEssayez-le en ligne!
Labyrinth est un langage de programmation bidimensionnel basé sur des piles et, aux jonctions, la direction est déterminée par le haut de la pile (le positif va à droite, le négatif à gauche, le zéro va tout droit). Il existe deux boucles principales dans ce programme. Le premier modifie l'entrée entière de 3 et s'incrémente à 0. Le second vérifie si le dernier chiffre est 3 (en soustrayant 3 et en modifiant par 10), puis en divisant par 10 pour obtenir un nouveau dernier chiffre.
la source
PHP,
60555446 octetsMerci à @ user59178 d’avoir coupé quelques octets, à @AlexHowansky pour un octet, à @Titus pour quelques autres
Appelé en ligne de commande avec
-r
. Méthode naïve qui boucle lorsque le nombre est un multiple de 3 ou en a 3 dans ses chiffres.la source
for($i=$argv[1];!(++$i%3)|strpos(" $i",'3'););echo$i;
il est peut-être possible de faire mieux en assignant$i
tout en l’utilisant.strpos(_.$i,'3')
%3<1
, l' un avec au51
lieu de'3'
, deux autres avec austrstr($i)
lieu destrpos(_.$i)
et deux autres en échangeant les|
opérandes dans la deuxième version:<?for(;strstr($i=++$argv[1],51)|$i%3<1;);echo$i;
-> 48 octetsPHP,
4741 octetsinspiré par Xanderhall , mais la dernière idée justifie enfin sa propre réponse.
ou
Cela tire parti du fait que l'entrée provient également de la séquence: Pour
$n%3==1
, le nouveau modulo l'est2
. Car$n%3==2
le nouveau modulo est4-3=1
.$n%3==0
n'arrive jamais.Exécuter en pipe
-R
ou essayer en ligne .la source
APL (Dyalog Unicode) ,
33282719 octets SBCSEssayez-le en ligne!
-6 grâce à Adám. -8 grâce à ngn.
Ancienne Explication:
APL (Dyalog Extended) ,
23SBCS de 17 octetsEssayez-le en ligne!
Merci à Adam. -6 grâce à ngn.
Ancienne Explication:
la source
Perl 6 ,
27 2524 octetsEssayez-le en ligne!
Trouve le premier nombre plus grand que l’entrée qui n’a pas de trois et a un reste quand moduloé par 3. J'espérais faire quelque chose de fantaisie avec la condition, comme
!/3/&*%3
mais ça ne marche pas avec le!
.:(
Explication:
la source
C, 81 octets
la source
réticulaire, 30 octets
Essayez-le en ligne!
Explication
1: initialisation
Ceci convertit le
i
signal en umbern
, puis diminue (v
)2: boucle
3: finale
la source
Lot, 93 octets
Prend une entrée sur STDIN.
la source
CJam, 19 octets
En ligne
Explication:
Si une explication moins verbeuse était demandée, j'aurais fait ceci:
la source
Pyth, 19 octets
Suite de tests
Je suis sûr que je peux jouer au golf ... c'est la même chose que ma réponse à CJam.
Explication:
la source
J
. Vous pouvez incrémenterQ
. Et si vous le faites intelligemment, vous pouvez intégrer l’opération à la condition while:W|!%=hQ3/
Q \ 3; Q`.W|!%=hQ3/`Q\3;Q
Clojure, 73 octets
Boucle récursive while
n
est divisible par 3 ou contient un 3 dans sa représentation sous forme de chaîne. Bien que j'utilise une récursion non optimisée, il a été capable de gérer 2999999 en tant qu'entrée, donc ça devrait aller.Ungolfed
la source