SPOJ - poprawna forma programu w Ruby

Witam.

Czy ktoś z forum mógłby udzielić mi porady co do postaci IO w kodzie Rubiego, jaki jest pozytywnie przyjmowany przez system weryfikujący na polskim SPOJu?

Innymi słowy, jak ma wyglądać pobieranie wejścia i wypisywanie/zwracanie wyjścia, (zwykły print/puts i gets a nawet $stdin.gets się nie sprawdza)? Jestem przekonany, że mój algorytm dla zadania Tablica działa poprawie, jednakże system nie przyjmuje mojego rozwiązania.

Na SPOJu mają Ruby 1.9.

Oto kod:

[code]#!/usr/bin/ruby

ilosc = gets.to_i

tab = []

(0…ilosc).each do |x|
tab[x] = gets.split.reverse.uniq
end

(0…ilosc).each do |x|
puts “#{tab[x].join(” “)}\n”
end[/code]
Ktoś ma jakiś pomysł?

Może powinno być #!/usr/bin/env ruby ?
Dodatkowo puts samo dodaje przejście do nowej linii.

Przeczytaj dokładnie treść zadania. Masz 2 błędy logiczne w programie.

Faktycznie… ale mi głupio teraz.

Oto poprawny i zaakceptowany przez SPOJ kod:

[code]#!/usr/bin/ruby

ilosc = gets.to_i

tab = []

(0…ilosc).each do |x|
tab[x] = gets.split
tab[x] = tab[x][1…tab[x][0].to_i].reverse
end

(0…ilosc).each do |x|
puts “#{tab[x].join(” “)}”
end[/code]

To jeszcze podpowiem Ci, że nie musisz bawić się w zapamiętywanie wyników poszczególnych testów. Możesz na bieżąco wypisywać je i też zostanie zaakceptowane (stdin i stdout to dwa niezależne strumienie). I dla porównania moje rozwiązanie:

tests = gets.to_i tests.times do _, *arr = gets.split(" ") puts arr.reverse end

Spoko, faktycznie jest krócej ale nie do końca realizujesz treść zadania, gdyż np.:

W powyższym listingu, pierwsza liczba 7 określa ilość kolejnych liczb z tego listingu, które masz wziąć pod uwagę gdy robisz reverse.

Co, jeżeli podam więcej niż 7 liczb, np:

Wtedy Twój algorytm nie zadziała poprawnie. Połączyłem nasze obie wersje i otrzymałem:

[code=Ruby]#!/usr/bin/ruby

ilosc = gets.to_i

ilosc.times do
temp, *arr = gets.split
puts arr[0…temp.to_i].reverse
end[/code]
Pozdrawiam!

Przeczytaj jeszcze raz treść zadania, wszystko jest ok. Mój program został zaakceptowany przez SPOJ. W treści zadania jest jasno napisane:

[code]Input

Najpierw t - liczba testów. Następnie dla każdego testu liczba n i n liczb, n <= 100.

Output

Dla każdego testu n liczb w porządku odwrotnym niż na wejściu.[/code]

@Mawrecki
Co do ilości sprawdzanych liczb chyba masz rację. Widocznie autor zadania nie założył przy testach takiej okoliczności i nie jest to sprawdzane.
BTW Dołożyłbym jeszcze join(" ") żeby na wyjściu było dokładnie tak jak w podanym przykładzie.

[code=Ruby]#!/usr/bin/ruby
ilosc = gets.to_i

ilosc.times do
temp, *arr = gets.split
puts arr[0…temp.to_i].reverse.join(" ")
end[/code]

Czy wy czytacie tę samą treść zadania co i ja? Ja tam widzę, że każdy test składa się z n liczb i n liczb ma się znaleźć na wyjściu (wszystkie). Gdyby nie testowano takich przypadków to cała zabawa nie miałaby sensu (a to jedno z prostszych zadań).

[quote=radarek]W treści zadania jest jasno napisane:

 Następnie dla każdego testu liczba n i n liczb, n <= 100.

[/quote]

[quote=Mawrecki]Co, jeżeli podam więcej niż 7 liczb, np:

Wtedy Twój algorytm nie zadziała poprawnie.[/quote]
W takim wypadku to chyba dane wejsciowe sa niepoprawne jak juz cos.

Otóż to. A w SPOJ można zakładać poprawność danych wejściowych.