Citat:
Branimir Maksimovic: Evo ti u Haskell-u ;)
Code:
import Data.List (sort)
main = do
cnt <- readFile "student.txt"
let res = map (\line -> sum (map read $ tail $ words line))
$ filter (not.null) $ lines cnt
mapM_ (\(a,b)->putStrLn $ b++" => "++show a) $ sort $ zip res (lines cnt)
Jel' može bez "Haskija"? Jedan izlet mi je bio više nego dovoljan za glavobolju. Mada, ima sve više funkcionalnog programiranja i u "običnim" jezicima.
Citat:
jablan: Ako hoćeš da naučiš programiranje, tvoje pitanje ne treba da bude "kako ga eliminisati", već "zašto se pojavljuje".
Pretpostavljam zato što imaš cr/lf na kraju fajla, tj. praznu liniju. Preskači prazne linije.
Ali generalno kod ti je zbrkan, previše chainuješ metode, menjaš state u funkcionalnim metodama (ne ide print u map), konvertuješ integer u string, pa ga ponovo čupaš iz stringa regexom i konvertuješ nazad u integer da bi sortirao itd.
Doduše ni njihovo rešenje nije mnogo bolje. :(
Poz
Fajl nema praznih redova, ali zato svaki string (red) sadrži \n:
Code:
# ...
linije fh.readlines
print linije
# ...
# rezultat
# ["Dan 78 83 94 95\n", "Tod 98 94 97 92\n", "Leo 60 66 79 56\n"]
U međuvremenu sam došla do nekog ne baš najsrećnijeg rešenja:
Code:
#!/usr/bin/ruby
tot = 0
File.open("student.txt","r") do |fh|
linije = fh.readlines.collect{|line|
col = line.split();
tot = col[1..-1].inject(0){|tot,x|tot+=x.to_i};
line = line.chop;
line += " => " + tot.to_s;}.
sort_by { |x| x[/\s+\d+$/].to_i }.
collect{|y|print "#{y} \n"}
end
koje daje odgovarajući rezultat
Problem je očigledno bio u dva print-a. Pre toga sam pokušala da uklonim print iz
Code:
collect{|y|print "#{y} \n"}
=>
Code:
# ...
collect{|y|"#{y} \n"}
# ili
collect{|y|y"}
rezultat:
Code:
["Leo 60 66 79 56 => 261", "Dan 78 83 94 95 => 350", "Tod 98 94 97 92 => 381"]
Njihovo rešenje je tačno u smislu da se prevodi i izvršava bez greške, ali zato niti sortira niti prikazuje zbirove. Bar je tako za
Code:
>ruby -v
ruby 1.9.3p484 (2013-11-22 revision 43786) [x86_64-linux]
Inače, većina njihovih primera ima grešku, a najgori su za Perl 6, evo na istom primeru:
Code:
#!/usr/bin/perl6
use v6;
my @lines;
for (open "student.txt").lines { @lines.push($_) };
my @linex = @lines.sort({[+]($^a.words)});
.say for @linex;
rezultat:
Code:
>perl6 shTrans2.pl
Cannot convert string to number: base-10 number must begin with valid digits or '.' in '⏏Dan' (indicated by ⏏)
in method Numeric at gen/parrot/CORE.setting:12063
in sub infix:<+> at gen/parrot/CORE.setting:3964
in sub infix:<+> at gen/parrot/CORE.setting:3962
in sub infix:<+> at gen/parrot/CORE.setting:3964
in sub infix:<+> at gen/parrot/CORE.setting:3962
in sub at gen/parrot/CORE.setting:16587
in block at shTrans2.pl:6
>perl6 -v
This is perl6 version 2013.12 built on parrot 5.9.0 revision 0
više nego očigledan problem:
Code:
my @linex = @lines.sort({[+]($^a.words)});
pokušaj implicitne konverzije stringa u broj i sabiranja što nije dozvoljeno.
Nikako da pronađem adekvatno rešenje: Sve što pronalazim je vezano za sortiranje stringova.
[Ovu poruku je menjao EmmaR dana 26.07.2017. u 22:28 GMT+1]
ER