Hackerrank zaman aşımı hatası

Katılım
23 Haziran 2016
Mesajlar
3.103
Makaleler
18
Çözümler
12
Hackerrank'teki bir soruyu çözerken kodum zaman aşımına (terminated due to timeout) uğruyor. Bunun nasıl önüne geçebilirim?


Bu kodum bazı testleri geçerken diğer test durumlarını geçemedi. Sadece alt görevi tamamlayabildi. Bu yüzden sadece %60 puan alabildim.



hackerrank.png



C:
#include <assert.h>
#include <limits.h>
#include <math.h>
#include <stdbool.h>
#include <stddef.h>
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char* readline();

// Complete the strangeCounter function below.
long strangeCounter(long t) {

long firs_second=3, temp;
long i;

/* Burada temp'e firs_second atamasını yapmamın nedeni döngü içinde firs_second'ın ilk değerine ihtiyacım olması */
temp = firs_second;

/*
i=1;
while(i<t)
{
temp -=1;
if(temp == 0)
{
firs_second *=2;
temp = firs_second;
}
i++;
}
*/

for(i=1; i<t; i++)
{
temp -=1;
if(temp == 0) // temp değeri her sıfır olduğunda yeni bir azalma evresine girecek.
{
firs_second *=2;
temp = firs_second;
}
}

return temp;
}

int main()
{
FILE* fptr = fopen(getenv("OUTPUT_PATH"), "w");

char* t_endptr;
char* t_str = readline();
long t = strtol(t_str, &t_endptr, 10);

if (t_endptr == t_str || *t_endptr != '\0') { exit(EXIT_FAILURE); }

long result = strangeCounter(t);

fprintf(fptr, "%ld\n", result);

fclose(fptr);

return 0;
}

char* readline() {
size_t alloc_length = 1024;
size_t data_length = 0;
char* data = malloc(alloc_length);

while (true) {
char* cursor = data + data_length;
char* line = fgets(cursor, alloc_length - data_length, stdin);

if (!line) { break; }

data_length += strlen(cursor);

if (data_length < alloc_length - 1 || data[data_length - 1] == '\n') { break; }

size_t new_length = alloc_length << 1;
data = realloc(data, new_length);

if (!data) { break; }

alloc_length = new_length;
}

if (data[data_length - 1] == '\n') {
data[data_length - 1] = '\0';
}

data = realloc(data, data_length);

return data;
}
 
Son düzenleme:
Sorunun çözümü için bir süre oluyor. İşte o süreyi geçmiş kodun. Tüm senaryoları ve süre şartını sağlayan bir kodu yazmak mümkün. Öyle bir kod yazman bekleniyor senden.

C ile yap deyince Allah ne verdiyse eklemiş Hackerrank. Sen de ne yapmışsın pek anlamadım.

Ben şöyle yaptım. Aslında güzel bir kod değil, while true demek pek iyi değildir. Ama çalışıyor. C'de olmayan bir şey kullanmadığım için C'de de çalışıyor.

Sen malloc falan kullanmışsın. Hiç gerek yok. Muhtemelen içeride sonsuz döngü var. O yüzden süreyi aşıyor.

Hackerrank kullanmayalı baya olmuş. Submit demeyip run code deyince tüm testlerden geçti sandım.

Test 5 ve 6'da 999.999.997.668 ve 999.999.766.777 gibi sayılar veriyor. Çok daha hızlı şekilde yapmak gerekiyor.

Bunun önüne daha hızlı şekilde hesap yaparak geçebilirsin. Sayıları tek tek artırmak yerine örüntü bulup onu takip etmek gerekiyor. Şu an pek müsait değilim o yüzden bakamayacağım. Gece yarısından sonra aklıma gelirse bakarım.

Kod:
long strangeCounter(long t) {
    long time = 1;
    long firstValue = 3;
    long value = firstValue;

    while (true) {
        for (value = firstValue; value > 0; --value) {
            if (time == t)
               return value;
            ++time;
        }

        firstValue *= 2;
        value = firstValue;
    }
 
    return value;
}
 
C ile yap deyince Allah ne verdiyse eklemiş Hackerrank. Sen de ne yapmışsın pek anlamadım.
Sen malloc falan kullanmışsın.
Ben sadece strangeCounter kısmını yazıyorum. Soru da benden sadece fonksiyon yazmamı bekliyor. Malloc falan ben de bilmiyorum.
Muhtemelen içeride sonsuz döngü var. O yüzden süreyi aşıyor.
Ama sonsuz döngüye girseydi bütün testlerde başarısız olmaz mıydı? 18 puan alıyorum mesela kodu çalıştırınca.

Amacım kod istemek değildi. Kendi kodumu nasıl düzeltirimdir. Konu içinde bunu belirtmeliydim.

Mesela kendi kodunda neden true kullandın anlamadım. Bu arada C'yi giriş seviyesinde ancak biliyorum.
 
Baştaki kısımları silmeyi unutmuşum. Sadece fonksiyonu attın sanmıştım.

Sonsuz döngüye girecek bir şey yapmamışsın gibi zaten. Sorun sayının çok büyük olması. Örüntü bulmak gerek.
Hatta yazdığım kodda for döngüsünden sonra time ve value değerlerini yazdırdığımda farkın hep 2 olduğunu gördüm. Bana verdiği değer her sütunun ilk satırı. Buradan yürüyebilirsin.
 
Baştaki kısımları silmeyi unutmuşum. Sadece fonksiyonu attın sanmıştım.

Sonsuz döngüye girecek bir şey yapmamışsın gibi zaten. Sorun sayının çok büyük olması. Örüntü bulmak gerek.
Hatta yazdığım kodda for döngüsünden sonra time ve value değerlerini yazdırdığımda farkın hep 2 olduğunu gördüm. Bana verdiği değer her sütunun ilk satırı. Buradan yürüyebilirsin.
Sınıf grubundaki bir arkadaş böyle çözmüş. Sınıf grubunda da tartışıyorduk bu soruyu.

C:
long strangeCounter(long t) {
   
    long i;
    for(i=4;i<=t;)
    {
        i = i*2+2;
    }
    return i-t;
}

Örüntüyü bulup yazmış.

t=1 → return → 3
t=2 → return → 2
t=3 → return → 1
t=4 → return → 6
t=5 → return → 5
.
.
.

Açıkçası ilk kurduğum kod da güzel bir algoritmaydı ama olsun.
 
Sınıf grubundaki bir arkadaş böyle çözmüş. Sınıf grubunda da tartışıyorduk bu soruyu.

C:
long strangeCounter(long t) {

 long i;
 for(i=4;i<=t;)
 {
 i = i*2+2;
 }
 return i-t;
}

Örüntüyü bulup yazmış.

T = 1 → return → 3
T = 2 → return → 2
T = 3 → return → 1
T = 4 → return → 6
T = 5 → return → 5
.
.
.

Açıkçası ilk kurduğum kod da güzel bir algoritmaydı ama olsun.

Hackerrank ücretsizmi acaba.
 

Technopat Haberler

Geri
Yukarı