C, 320 294 octets
Compiler avec -std = c99
#include<stdio.h>
int s(int i){for(int j=i;j;j/=10)i+=j%10;return i;}int main(){int c=0,i;while(scanf("%d",&i)){c++;if(!i)continue;int j,o[]={1,3,9},p[]={1,3,9};Q:for(j=0;j<3;j++){if(o[j]==i)goto D;else if(o[j]<i){o[j]=s(o[j]);goto Q;}}i=s(i);goto Q;D:printf("Case #%d\n\nfirst meets river %d at %d\n\n",c,p[j],o[j]);}}
Non golfé:
#include <stdio.h>
int s(int i)
{
for(int j = i; j; j /= 10)
i += j % 10;
return i;
}
int main()
{
int c = 0, i;
while(scanf("%d", &i))
{
c++;
if(!i)
continue;
int j,o[]={1,3,9},p[]={1,3,9};
Q: for(j = 0; j < 3; j++)
{
if(o[j] == i)
goto D;
else if(o[j] < i)
{
o[j] = s(o[j]);
goto Q;
}
}
i = s(i);
goto Q;
D: printf("Case #%d\n\nfirst meets river %d at %d\n\n", c, p[j], o[j]);
}
}
Essentiellement, les rivières "cibles" sont augmentées jusqu'à ce qu'elles soient plus grandes que la rivière contre laquelle nous testons, puis la rivière test est augmentée. Cette opération est répétée jusqu'à ce que la rivière test soit égale à une autre rivière.
Je ne lis pas les paramètres de la ligne de commande de ce programme et je ne sais pas si vous êtes censé le faire. Vous pouvez maintenant passer des paramètres à STDIN. Vous pouvez terminer en passant une entrée non numérique.
Bon sang, battu d'une demi-heure.
Réponses:
JavaScript (ES6)
Ceci est une réponse assez rapide en utilisant un langage assez lent. Vraiment, l'exécution du temps ne devrait pas être un problème en utilisant n'importe quelle langue avec des tables de hachage. Tous mes tests sous 100 ms.
Méthode anonyme avec la liste des cas de test comme paramètre d'entrée.
la source
Java 7,
519505 octetsOui, c'est long, moche et peut sans aucun doute être complètement changé en code-golf plus .. Je suis à la fois distrait et fatigué, alors je devrais peut-être juste le supprimer à nouveau ..
C'était un défi assez difficile pour être honnête. Mais au moins vous avez votre première réponse ..;) (Ce qui pourrait même être plus long que votre programme C ++ non golfé original .. xD)
Cas non testés et testés:
Essayez-le ici.
Production:
la source
Compilation time: 0.62 sec, absolute running time: 0.14 sec, cpu time: 0.11 sec, memory peak: 22 Mb, absolute service time: 0,77 sec
pour moi localement. Alors oui, c'est assez lent ..Scala, 774 octets
Violon: http://scalafiddle.net/console/4ec96ef90786e0f2d9f7b61b5ab0209b
Je n'ai pas envie de jouer au golf. Il trouve une solution au problème posé dans les 50 ms
L'utilisation peut ne pas être exactement ce que vous voulez:
scala river.scala
Vous pouvez maintenant saisir en continu des nombres suivis d'une entrée. Et terminez le programme avec 0. Le résultat sera imprimé dès que vous appuyez sur Entrée.
la source
C, 228
283300octetsCeci est un mod du code de Yakov pour profiter des modèles de rivière. Cela le rend environ 3 fois plus rapide. De plus, les entiers non signés évitent la
cltod
pénalité sur les machines 64 bits, c'est donc quelques octets de plus mais fractionnellement plus rapide.Non golfé:
Explication:
Cela sélectionne la bonne rivière. La rivière 1 rencontre toutes les autres rivières, nous utilisons donc cela comme cas de repli. Si 3 est le plus grand diviseur commun de la rivière test, nous sélectionnons la rivière 3 (
1 + !(i%3)*2
). Si 9 est le plus grand diviseur commun de la rivière test, nous remplaçons les valeurs précédentes et sélectionnons la rivière 9.Pourquoi ça marche? La rivière 9 passe à 9, 18, 27, 36, etc. Cela fait un multiple de 9 à chaque fois, donc ce sera toujours le chemin le plus court vers une rivière sœur. La rivière 3 progressera par un multiple de 3 à chaque fois: 3, 6, 12, 15, 21, etc. Alors que les rivières qui sont un multiple de 9 sont également un multiple de 3, nous les choisissons comme rivière 9 en premier, ne laissant que le multiples de 3. Le reste rencontrera la rivière 1 en premier: 1, 2, 4, 8, 16, 23, 28, etc.
Une fois que nous avons sélectionné notre bonne rivière, nous marchons les deux rivières jusqu'à ce qu'elles se rencontrent.
la source
Python 3, 144 octets
la source
C
Très simple, ça a l'air si long car j'ai déroulé les 3 rivières. Il génère d'abord les 3 rivières jusqu'à
RIVER_LENGTH
(ce qui, je l'espère, est assez grand), puis pour chaque étape,N
il effectue une recherche binaire sur les trois flux pour voir s'il se trouve dans l'un d'eux. Cela fonctionne parce que les flux sont déjà triés, nous pouvons donc faire le check-in delog(n)
temps.Il faut d'abord un nombre pour le nombre de cas, au lieu d'utiliser
0
pour délimiter la fin des entrées, parce que vous savez, C. C'est juste pour plus de commodité et n'affecte vraiment rien, donc j'espère que ça va.la source