Jak działa spoje?

0

Link do zadania: https://www.spoj.com/submit/TEST/id=22622268
Dostałem zadanie na spoje (TEST - Life, the Universe, and Everything) typu:

Input:

1
2
88
42
99

Output:

1
2
88

Gdy trafisz na 42 wyjdz. Wykonałem je w c# w bardzo pokrecony sposob. Poniższy kod mi działa, ale na spoje nie przechodzi testcasow. Pytanie dlaczego? Nie rozumiem tego systemu.

using System;

public class Solution
{
    public static void Main()
    {
        int r1 = Convert.ToInt32(Console.ReadLine());
        int r2 = Convert.ToInt32(Console.ReadLine());
        int r3 = Convert.ToInt32(Console.ReadLine());
        int r4 = Convert.ToInt32(Console.ReadLine());
        int r5 = Convert.ToInt32(Console.ReadLine());

        for (int i = 0; i < 5; i++)
        {
            if (r1 == 42)
            {
                break;
            }
            else
            {
                Console.WriteLine(r1);
            }

            if (r2 == 42)
            {
                break;
            }
            else
            {
                Console.WriteLine(r2);
            }

            if (r3 == 42)
            {
                break;
            }
            else
            {
                Console.WriteLine(r3);
            }

            if (r4 == 42)
            {
                break;
            }
            else
            {
                Console.WriteLine(r4);
            }

            if (r5 == 42)
            {
                break;
            }
            else
            {
                Console.WriteLine(r5);
            }

        }


        Console.ReadKey();
    }
}
1

Żartujesz prawda? A co jak liczba 42 będzie szósta liczbą?

0

Żal komentować Twój kod. Przeczytaj kilka pierwszych rozdziałów jakiejś książki o C# dla początkujących i wtedy wróć do zadania. Postaraj się zredukować kod w metodzie Main do 3 linii (nie licząc pustych linii i klamer dla pętli).

Wskazówki:

  • Porównuj input z wartością "42" typu string zamiast konwertować go na int.
  • Użyj pętli while zamiast pętli for.
0

Nie chodzi o redukowanie linii. Tylko o to ze kod spelnia swoja funkcjonalnosc, a spoje go nie akceptuje. W momencie gdy wypada 42 kod sie zatrzymuje. Jak jest w zadaniu.

@liczb mozna wprowadzic tylko 6. Nie widzę zwiazku.

0
Kaczka Pytek napisał(a):

Nie chodzi o redukowanie linii. Tylko o to ze kod spelnia swoja funkcjonalnosc, a spoje go nie akceptuje. W momencie gdy wypada 42 kod sie zatrzymuje. Jak jest w zadaniu.

@liczb mozna wprowadzic tylko 6. Nie widzę zwiazku.

Skąd Wiesz, że można wprowadzić tylko sześć liczb?

0
int r1 = Convert.ToInt32(Console.ReadLine());
int r2 = Convert.ToInt32(Console.ReadLine());
int r3 = Convert.ToInt32(Console.ReadLine());
int r4 = Convert.ToInt32(Console.ReadLine());
int r5 = Convert.ToInt32(Console.ReadLine());

napisalem 5 tylko post juz zostal usuniety...

0

Czy można to rozwiązać w ten sposób:



#include <iostream>

using namespace std;

int main()
{
	int a = 0;
	cout << "podaj liczbę";
	cin >> a;
	 cout<<a;
	 
	 while (a != 42)
	 {
		 cout << "podaj liczbę";
		 cin >> a;
		 if(a!=42)
		{ cout<<a;}
		 else
		 {cout<<"koniec programu";}
	 }
	

	return 0;

   
}
1

Poniższy kod mi działa, ale na spoje nie przechodzi testcasow. Pytanie dlaczego? Nie rozumiem tego systemu.

Kod może i jako tako działa, ale dla podanego przykładu. W rzeczywistości chodzi o napisanie kodu "uniwersalnego", który zadziała gdy np. 42 będzie np.tysiąc sześćset dziewięćdziesiąta dziewiąta w kolejce.

Nie chodzi o redukowanie linii. Tylko o to ze kod spelnia swoja funkcjonalnosc, a spoje go nie akceptuje. W momencie gdy wypada 42 kod sie zatrzymuje. Jak jest w zadaniu.

Skoro nie akceptuje, to znaczy że nie spełnia. I chodzi tu o redukowanie linii - zadanie da się zrobić za pomocą jednej pętli (a przynajmniej mi tak zaliczyło).

liczb mozna wprowadzic tylko 6. Nie widzę zwiazku.

Skąd ten pomysł? Jesteś w stanie wskazać cokolwiek na poparcie tej tezy?

0

Wysłałem swoje rozwiązanie na SPOJ- system wyrzucił błąd złe rozwiązanie. A już miałem nadzieję że mam szczęście początkującego. Te liczby z zadania mają być pobierane od użytkownika, czy zapisane gdzieś w programie i testowane w pętli while (number!=42). Z góry dziękuję za pomoc. Czy mógłby ktoś łaskawie spojrzeć na mój kod i doradzić co powinienem usprawnić/napisać od nowa. Pozdrawiam Krzysztof :)

0

@crispia:
Prawie dobrze, wywal te couty.
Ogólna zasada jest taka:

numer = 0
dopóty (warunek,by pętla była nieskończona) 
  wczytaj numer;
  jezeli nie jest 42 
    wypisz go
 w przeciwnym razie
    wyjdź z pętli

PS, Edytowany, by nie było gotowca. Sprawdzone, zaliczyło mi tą metodą w Pythonie i C++.

0
string line = string.Empty;
while ((line = Console.ReadLine()) != null && line != "42") {
        Console.WriteLine(line);
 }

Mam nadzieję że patrząc na powyższy kod zrozumiesz co robiłeś źle.. Oczywiście da się to zrobić "prościej" tak jak @Serechiel

0
Serechiel napisał(a):

@crispia:
Prawie dobrze, wywal te couty.
Ogólna zasada jest taka:

numer = 0
dopóty (warunek,by pętla była nieskończona) 
  wczytaj numer;
  jezeli nie jest 42 
    wypisz go
 w przeciwnym razie
    wyjdź z pętli

PS, Edytowany, by nie było gotowca. Sprawdzone, zaliczyło mi tą metodą w Pythonie i C++.

Wyrzuciłem z kodu couty.

int main()
{
    int a=0 ;
    
while (a != 42)
     {
         cin >> a;
         if(a!=42)
         {cout<<a;}
     }
    return 0;
 
}

SPOJ wyświetla błąd. Na kompilatorze on line c++ program działa tak: wpisuję liczbę 1, wyświetla 1, wpisuję 2 wyświetla 2, wpisuję 88 wyświetla 88. Po wpisaniu 42 program kończy działanie. Może jestem antytalentem ale co może jeszcze być nie tak. Pozdrawiam Krzysztof :)

0

SPOJ wyświetla błąd

Dużo to nam mówi..

0

wrong answer i zrzut ekranu ze SPOJ-a :)

screenshot-20181102164408.png

1

@crispia:
Liczby mają być wypisane linia po linii.

cout<<a<<'\n';
0

@Serechiel
@Deltech
@lubie_programowac
Wielkie dzięki za pomoc. Wreszcie system zaakceptował rozwiązanie. Jeszcze raz pięknie dziękuję i polecam się na przyszłość. Pozdrawiam Krzysztof :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1