C, 320 294 bytes
Compilar com -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]);}}
Ungolfed:
#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]);
}
}
Essencialmente, os rios "alvo" são aumentados até que sejam maiores que o rio contra o qual estamos testando e depois o rio de teste aumenta. Isso é repetido até que o rio de teste seja igual a outro rio.
Não estou lendo parâmetros na linha de comando deste programa e não tenho certeza se você deveria. Agora você pode passar parâmetros para STDIN. Você pode finalizar passando uma entrada não numérica.
Também danado, espancado por meia hora.
Respostas:
JavaScript (ES6)
Esta é uma resposta bastante rápida, usando uma linguagem bastante lenta. Realmente, o tempo de execução não deve ser um problema ao usar qualquer idioma com tabelas de hash. Todos os meus testes com menos de 100 ms.
Método anônimo com a lista de casos de teste como parâmetro de entrada.
fonte
Java 7,
519505 bytesSim, é longo, feio e sem dúvida pode ser completamente alterado para codificá-lo mais .. Estou ao mesmo tempo distraído e cansado, talvez devesse excluí-lo novamente ..
Foi um desafio muito difícil ser honesto. . Mas pelo menos você tem sua primeira resposta ..;) (que pode até ser maior que o seu programa C ++ original e não destruído .. xD)
Casos não testados e de teste:
Experimente aqui.
Resultado:
fonte
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 mim localmente. Então, sim, é muito lento ..Scala, 774 bytes
Violino: http://scalafiddle.net/console/4ec96ef90786e0f2d9f7b61b5ab0209b
Não sinto vontade de jogar golfe. Encontra uma solução para o problema colocado dentro de 50ms
O uso pode não ser exatamente o que você deseja:
scala river.scala
Agora você pode inserir continuamente números seguidos de um enter. E encerre o programa com 0. O resultado será impresso assim que você pressionar enter.
fonte
C,
228283300bytesEste é um mod do código de Yakov para tirar proveito dos padrões do rio. Isso torna ~ 3x mais rápido. Além disso, números inteiros não assinados evitam a
cltod
penalidade em máquinas de 64 bits, portanto, são alguns bytes mais longos, mas um pouco mais rápidos.Ungolfed:
Explicação:
Isso seleciona o rio correto. O rio 1 encontra todos os outros rios, por isso usamos isso como caso de reserva. Se 3 é o maior divisor comum do rio de teste, selecionamos o rio 3 (
1 + !(i%3)*2
). Se 9 é o maior divisor comum do rio de teste, substituímos os valores anteriores e selecionamos o rio 9.Por que isso funciona? O rio 9 vai 9, 18, 27, 36, etc. Isso dá um múltiplo de 9 a cada vez, portanto, sempre será o caminho mais curto para um rio irmão. O rio 3 passa por um múltiplo de 3 a cada vez: 3, 6, 12, 15, 21, etc. Embora os rios que são múltiplos de 9 também sejam múltiplos de 3, nós os escolhemos como o rio 9 primeiro, deixando apenas o múltiplos de 3. O restante encontrará o rio 1 primeiro: 1, 2, 4, 8, 16, 23, 28, etc.
Depois de selecionarmos o rio correto, pisamos nos dois até que eles se encontrem.
fonte
Python 3, 144 bytes
fonte
C
Muito simples, parece tão longo porque eu desenrolei todos os 3 rios. Primeiro ele gera os 3 rios até
RIVER_LENGTH
(o que eu espero que seja grande o suficiente) e, em seguida, para cada etapa,N
ele faz uma pesquisa binária nos três fluxos para ver se está em algum deles. Isso funciona porque os fluxos já estão classificados, para que possamos fazer o check-in contém olog(n)
tempo.É preciso um número para o número de casos primeiro, em vez de usar
0
para delimitar o final das entradas, porque você sabe, C. Isso é apenas por conveniência e realmente não afeta nada, por isso espero que esteja tudo bem.fonte