C, 320294 bytes
Compilar con -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]);}}
Sin 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]);
}
}
Esencialmente, los ríos "objetivo" se incrementan hasta que son mayores que el río contra el que estamos probando, y luego se aumenta el río de prueba. Esto se repite hasta que el río de prueba sea igual a otro río.
No estoy leyendo parámetros desde la línea de comandos en este programa, y no estoy seguro de si se supone que debes hacerlo. Ahora puede pasar parámetros a STDIN. Puede terminar pasando una entrada no numérica.
También maldita sea, golpeado por media hora.
Respuestas:
JavaScript (ES6)
Esta es una respuesta bastante rápida usando un lenguaje bastante lento. Realmente, el tiempo de ejecución no debería ser un problema al usar cualquier lenguaje con tablas hash. Todas mis pruebas de menos de 100 ms.
Método anónimo con la lista de casos de prueba como parámetro de entrada.
fuente
Java 7,
519505 bytesSí, es largo, feo y, sin duda, puede cambiarse por completo para codificarlo más ... Estoy distraído y cansado, así que tal vez debería eliminarlo nuevamente ...
Fue un desafío bastante difícil para ser honesto. Pero al menos tienes tu primera respuesta ...;) (que podría ser incluso más larga que tu programa original de C ++ sin golf ... xD)
Sin golf y casos de prueba:
Pruébalo aquí.
Salida:
fuente
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
para mí localmente. Así que sí, es bastante lento ...Scala, 774 bytes
Violín: http://scalafiddle.net/console/4ec96ef90786e0f2d9f7b61b5ab0209b
No tengo ganas de jugar al golf. Encuentra una solución al problema planteado dentro de los 50 ms
El uso puede no ser exactamente lo que quieres:
scala river.scala
Ahora puede ingresar continuamente números seguidos de una entrada. Y finalice el programa con 0. El resultado se imprimirá tan pronto como presione enter.
fuente
C,
228283300bytesEste es un mod del código de Yakov para aprovechar los patrones del río. Esto lo hace ~ 3 veces más rápido. Además, los enteros sin signo evitan la
cltod
penalización en máquinas de 64 bits, por lo que son unos pocos bytes más largos pero fraccionalmente más rápidos.Sin golf:
Explicación:
Esto selecciona el río correcto. El río 1 se encuentra con cualquier otro río, por lo que usamos esto como el caso alternativo. Si 3 es el máximo divisor común del río de prueba, seleccionamos el río 3 (
1 + !(i%3)*2
). Si 9 es el máximo divisor común del río de prueba, anulamos los valores anteriores y seleccionamos el río 9.¿Por qué funciona esto? El río 9 va 9, 18, 27, 36, etc. Este paso por un múltiplo de 9 cada vez, por lo que siempre será la ruta más corta a un río hermano. El río 3 pasará por un múltiplo de 3 cada vez: 3, 6, 12, 15, 21, etc. Si bien los ríos que son múltiplos de 9 también son múltiplos de 3, los elegimos primero como río 9, dejando solo el múltiplos de 3. El resto se encontrará primero con el río 1: 1, 2, 4, 8, 16, 23, 28, etc.
Una vez que hemos seleccionado nuestro río correcto, pisamos los dos ríos hasta que se encuentran.
fuente
Python 3, 144 bytes
fuente
C
Muy simple, parece tan largo porque desenrollé los 3 ríos. Primero genera los 3 ríos hasta
RIVER_LENGTH
(que espero que sea lo suficientemente grande), y luego, para cada pasoN
, realiza una búsqueda binaria en los tres flujos para ver si está en alguno de ellos. Esto funciona porque las transmisiones ya están ordenadas, por lo que podemos hacer la verificación de contenido alog(n)
tiempo.Primero se necesita un número para el número de casos, en lugar de usar
0
para delimitar el final de las entradas, porque ya sabes, C. Esto es solo por conveniencia y realmente no afecta nada, así que espero que esté bien.fuente