C, 320 294 byte
Kompilasi dengan -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]);}}
Tidak Disatukan:
#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]);
}
}
Pada dasarnya, sungai "target" meningkat hingga lebih besar dari sungai yang kami uji melawan, dan setelah itu sungai uji ditingkatkan. Ini diulangi sampai sungai uji sama dengan beberapa sungai lain.
Saya tidak membaca parameter dari baris perintah di program ini, dan saya tidak yakin apakah Anda seharusnya. Sekarang Anda dapat meneruskan parameter ke STDIN. Anda dapat mengakhiri dengan mengirimkan input non-numerik.
Sial, dipukuli setengah jam.
Jawaban:
JavaScript (ES6)
Ini adalah jawaban yang cukup cepat menggunakan bahasa yang cukup lambat. Sungguh, waktu eksekusi seharusnya tidak menjadi masalah menggunakan bahasa apa pun dengan tabel hash. Semua pengujian saya di bawah 100 ms.
Metode anonim dengan daftar kasus uji sebagai parameter input.
sumber
Java 7,
519505 byteYa, ini panjang, jelek, dan tanpa diragukan lagi dapat sepenuhnya diubah menjadi kode-golf lebih. Saya berdua terganggu dan lelah, jadi mungkin saya harus menghapusnya lagi ..
Itu adalah tantangan yang cukup sulit untuk jujur. Tapi setidaknya Anda memiliki jawaban pertama Anda ..;) (Yang mungkin bahkan lebih lama dari program C ++ asli yang tidak di-ungolfed Anda .. xD)
Kasus yang tidak disatukan & uji:
Coba di sini.
Keluaran:
sumber
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
untuk saya secara lokal. Jadi ya, ini sangat lambat ..Scala, 774 byte
Fiddle: http://scalafiddle.net/console/4ec96ef90786e0f2d9f7b61b5ab0209b
Saya tidak ingin bermain golf. Itu menemukan solusi untuk masalah yang diajukan dalam 50ms
Penggunaan mungkin tidak persis seperti yang Anda inginkan:
scala river.scala
Sekarang Anda dapat secara terus-menerus memasukkan angka yang diikuti oleh sebuah entri. Dan hentikan program dengan 0. Hasilnya akan dicetak segera setelah Anda menekan enter.
sumber
C, 228
283300byteIni adalah mod dari kode Yakov untuk mengambil keuntungan dari pola sungai. Ini membuatnya ~ 3x lebih cepat. Juga, bilangan bulat yang tidak ditandatangani menghindari
cltod
penalti pada mesin 64-bit, jadi itu beberapa byte lebih lama tetapi lebih cepat.Tidak Disatukan:
Penjelasan:
Ini memilih sungai yang benar. Sungai 1 bertemu setiap sungai lainnya, jadi kami menggunakan ini sebagai kasing mundur. Jika 3 adalah pembagi umum terbesar dari sungai uji, kami memilih sungai 3 (
1 + !(i%3)*2
). Jika 9 adalah pembagi umum terbesar dari sungai uji, kami menimpa nilai sebelumnya dan memilih sungai 9.Mengapa ini bekerja? Sungai 9 pergi 9, 18, 27, 36, dll. Ini langkah dengan kelipatan 9 setiap kali sehingga akan selalu menjadi rute terpendek ke sungai saudara. Sungai 3 akan melangkah dengan kelipatan 3 setiap kali: 3, 6, 12, 15, 21, dll. Sementara sungai yang kelipatan 9 juga kelipatan 3, kami memilihnya sebagai sungai 9 terlebih dahulu, hanya menyisakan kelipatan 3. Sisanya akan bertemu sungai 1 pertama: 1, 2, 4, 8, 16, 23, 28, dll.
Setelah kami memilih sungai yang benar, kami melangkah dua sungai sampai mereka bertemu.
sumber
Python 3, 144 byte
sumber
C
Sangat sederhana, itu hanya terlihat lama karena saya membuka gulungan semua 3 sungai. Pertama-tama menghasilkan 3 sungai hingga
RIVER_LENGTH
(yang saya harap cukup besar), dan kemudian untuk setiap langkah diN
atasnya melakukan pencarian biner pada ketiga aliran untuk melihat apakah ada di salah satu dari mereka. Ini berfungsi karena stream sudah diurutkan, sehingga kita dapat melakukan check-in berisilog(n)
waktu.Dibutuhkan nomor untuk jumlah kasus terlebih dahulu, daripada menggunakan
0
untuk membatasi akhir input, karena Anda tahu, C. Ini hanya untuk kenyamanan dan tidak benar-benar mempengaruhi apa pun, jadi saya harap tidak apa-apa.sumber