C, 320 294 bajtów
Skompiluj z -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]);}}
Nie golfowany:
#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]);
}
}
Zasadniczo rzeki „docelowe” są zwiększane, dopóki nie będą większe niż rzeka, na której testujemy, a następnie rzeka testowa jest zwiększana. Jest to powtarzane, aż rzeka testowa będzie równa jakiejś innej rzece.
Nie czytam parametrów z wiersza poleceń w tym programie i nie jestem pewien, czy powinieneś. Teraz możesz przekazać parametry do STDIN. Możesz zakończyć, przekazując dane nienumeryczne.
Również cholernie pobity przez pół godziny.
Odpowiedzi:
JavaScript (ES6)
To dość szybka odpowiedź przy użyciu dość wolnego języka. Naprawdę, wykonanie czasu nie powinno stanowić problemu przy użyciu dowolnego języka z tabelami skrótów. Wszystkie moje testy poniżej 100 ms.
Metoda anonimowa z listą przypadku testowego jako parametrem wejściowym.
źródło
Java 7,
519505 bajtówTak, jest długi, brzydki i bez wątpienia można go całkowicie zmienić na golfa kodowego. Jestem rozkojarzony i zmęczony, więc może powinienem go po prostu usunąć
. Szczerze mówiąc, było to dość trudne wyzwanie. , Ale przynajmniej masz swoją pierwszą odpowiedź ...;) (która może być nawet dłuższa niż twój oryginalny nieoznakowany program w C ++ .. xD)
Przypadki bez golfa i testy:
Wypróbuj tutaj.
Wynik:
źródło
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
dla mnie lokalnie. Więc tak, to dość powolne ..Scala, 774 bajty
Fiddle: http://scalafiddle.net/console/4ec96ef90786e0f2d9f7b61b5ab0209b
Nie mam ochoty na golfa. Znajduje rozwiązanie postawionego problemu w ciągu 50 ms
Użycie może nie być dokładnie takie, jak chcesz:
scala river.scala
Teraz możesz w sposób ciągły wprowadzać liczby, a następnie Enter. I zakończ program za pomocą 0. Wynik zostanie wydrukowany, jak tylko naciśniesz Enter.
źródło
C 228
283300bajtówJest to modyfikacja kodu Jakowa, aby wykorzystać wzorce rzeczne. To sprawia, że ~ 3x szybciej. Ponadto liczby całkowite bez znaku unikają
cltod
kary na komputerach 64-bitowych, więc jest kilka bajtów dłuższych, ale ułamkowo szybszych.Nie golfowany:
Wyjaśnienie:
To wybiera właściwą rzekę. Rzeka 1 spotyka się z każdą inną rzeką, dlatego używamy tego jako przypadku rezerwowego. Jeśli 3 jest największym wspólnym dzielnikiem testowej rzeki, wybieramy rzekę 3 (
1 + !(i%3)*2
). Jeśli 9 jest największym wspólnym dzielnikiem rzeki testowej, zastępujemy poprzednie wartości i wybieramy rzekę 9.Dlaczego to działa? Rzeka 9 płynie 9, 18, 27, 36 itd. Za każdym razem jest to wielokrotność 9, więc zawsze będzie to najkrótsza droga do siostrzanej rzeki. Rzeka 3 pokona wielokrotność 3 za każdym razem: 3, 6, 12, 15, 21 itd. Podczas gdy rzeki, które są wielokrotnością 9, są również wielokrotnością 3, najpierw wybieramy je jako rzekę 9, pozostawiając tylko wielokrotności 3. Pozostała część spotka się najpierw z rzeką 1: 1, 2, 4, 8, 16, 23, 28 itd.
Po wybraniu właściwej rzeki przeprawiamy się przez obie rzeki, aż się spotkają.
źródło
Python 3, 144 bajty
źródło
do
Bardzo proste, wygląda tak długo, ponieważ rozwinąłem wszystkie 3 rzeki. Najpierw generuje 3 rzeki
RIVER_LENGTH
( do których mam nadzieję, że jest wystarczająco duży), a następnie dla każdego krokuN
dokonuje binarnego przeszukiwania wszystkich trzech strumieni, aby sprawdzić, czy jest w którymkolwiek z nich. Działa to, ponieważ strumienie są już posortowane, dzięki czemu możemy wykonać sprawdzenie wlog(n)
czasie.Najpierw potrzeba liczby dla liczby przypadków, zamiast
0
ograniczania końca danych wejściowych, ponieważ wiesz, że C. Jest to tylko dla wygody i tak naprawdę nie wpływa na nic, więc mam nadzieję, że jest w porządku.źródło