Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

ruby - shcwartzian transform: sortiranje po zbirovima redova.

[es] :: Ostali programski jezici :: ruby - shcwartzian transform: sortiranje po zbirovima redova.

[ Pregleda: 2234 | Odgovora: 16 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

EmmaR
Srbija

Član broj: 269847
Poruke: 455



+171 Profil

icon ruby - shcwartzian transform: sortiranje po zbirovima redova.26.07.2017. u 17:39 - pre 35 meseci
podaci: student.txt
Code:

Dan 78 83 94 95
Tod 98 94 97 92
Leo 60 66 79 56


ciljni rezultat:
Code:

Leo 60 66 79 56 => 261 
Dan 78 83 94 95 => 350 
Tod 98 94 97 92 => 381 


originalni kod (Programming with The Canvas HTML5 CSS3 JavaScript Python Ruby Perl by Quan Nguyen):
Code:

ruby -e'
tot = 0
print readlines.
collect{|line|
col=line.split();
col[1..-1].inject(0){|tot,x|tot+=x.to_i};
[tot,printf("%s => %d \n", line.chop, tot)]}.
sort{|a,b|b[0].to_i <=> a[0].to_i}.
collect {|y|y[1]}
' student.txt

i rezultat:
Code:

Dan 78 83 94 95 => 0 
Tod 98 94 97 92 => 0 
Leo 60 66 79 56 => 0 
[nil, nil, nil]

Gde je greska?


Moje rešenje:
Code:

#!/usr/bin/ruby

tot = 0

File.open("student.txt","r") do |fh|
    print 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 

print "\n"

i rezultat:
Code:

Leo 60 66 79 56 => 261 
Dan 78 83 94 95 => 350 
Tod 98 94 97 92 => 381 
[nil, nil, nil]

Radi, samo sto ima višak:
Code:
[nil, nil, nil]

Kako ga eliminisati?
ER
 
Odgovor na temu

jablan

Član broj: 8286
Poruke: 4541



+709 Profil

icon Re: ruby - shcwartzian transform: sortiranje po zbirovima redova.26.07.2017. u 17:50 - pre 35 meseci
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
 
Odgovor na temu

Branimir Maksimovic
Senior Software Engineer

Član broj: 64947
Poruke: 4443
*.bvcom.net.



+921 Profil

icon Re: ruby - shcwartzian transform: sortiranje po zbirovima redova.26.07.2017. u 18:20 - pre 35 meseci
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)


press any key to continue or any other to quit....
 
Odgovor na temu

jablan

Član broj: 8286
Poruke: 4541



+709 Profil

icon Re: ruby - shcwartzian transform: sortiranje po zbirovima redova.26.07.2017. u 18:34 - pre 35 meseci
^ kad računaš res preskačeš prazne linije, a posle to zipuješ sa (lines cnt). ne znam dobro haskel, ali čini mi se da neće biti lepo ako zaluta neka prazna linija usred ulaznog fajla? :)

inače izgleda baš cool.
 
Odgovor na temu

Branimir Maksimovic
Senior Software Engineer

Član broj: 64947
Poruke: 4443
*.bvcom.net.



+921 Profil

icon Re: ruby - shcwartzian transform: sortiranje po zbirovima redova.26.07.2017. u 18:37 - pre 35 meseci
Nece da, lepo si to uocio ;) treba da se opali filter i tamo .
press any key to continue or any other to quit....
 
Odgovor na temu

jablan

Član broj: 8286
Poruke: 4541



+709 Profil

icon Re: ruby - shcwartzian transform: sortiranje po zbirovima redova.26.07.2017. u 18:40 - pre 35 meseci
koja onda dođe složenost? :D
 
Odgovor na temu

Branimir Maksimovic
Senior Software Engineer

Član broj: 64947
Poruke: 4443
*.bvcom.net.



+921 Profil

icon Re: ruby - shcwartzian transform: sortiranje po zbirovima redova.26.07.2017. u 18:46 - pre 35 meseci
Ne znam na sta mislis ali haskell je lazy, memoise izracunavanja i pravi thunk-ove ako se ne koriste na licu mesta tako da je sve jedno dal ces let a = filter (not.null) $ lines cnt ili dva puta ponoviti isto mu dodje ;)
press any key to continue or any other to quit....
 
Odgovor na temu

jablan

Član broj: 8286
Poruke: 4541



+709 Profil

icon Re: ruby - shcwartzian transform: sortiranje po zbirovima redova.26.07.2017. u 18:49 - pre 35 meseci
aha, nisam to znao, fino. jel to deo specifikacije jezika ili konkretnog kompajlera?
 
Odgovor na temu

Branimir Maksimovic
Senior Software Engineer

Član broj: 64947
Poruke: 4443
*.bvcom.net.



+921 Profil

icon Re: ruby - shcwartzian transform: sortiranje po zbirovima redova.26.07.2017. u 18:51 - pre 35 meseci
Specifikacija jezika. Zato je Haskell prilicno zeznut kad napravis ogroman broj komputacija bez da koristis rezultat, prakticno pravis memory leak ;)
press any key to continue or any other to quit....
 
Odgovor na temu

jablan

Član broj: 8286
Poruke: 4541



+709 Profil

icon Re: ruby - shcwartzian transform: sortiranje po zbirovima redova.26.07.2017. u 19:18 - pre 35 meseci
da se vratimo na ruby

EmmaR, najbolje kreni odavde:

Code:

linije = sve_linije_iz_fajla(input)
linije = izbaci_prazne(linije)
linije_sa_totalima = dodaj_total_na_svaku(linije)
sortirane_linije_sa_totalima = sortiraj_po_totalima(linije_sa_totalima)
ispisi_sa_totalima(sortirane_linije_sa_totalima)


pa kreni redom i implementiraj svaku od metoda, najbolje sa testovima.

javi ako negde zapne.
 
Odgovor na temu

EmmaR
Srbija

Član broj: 269847
Poruke: 455



+171 Profil

icon Re: ruby - shcwartzian transform: sortiranje po zbirovima redova.26.07.2017. u 21:11 - pre 35 meseci
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
 
Odgovor na temu

Branimir Maksimovic
Senior Software Engineer

Član broj: 64947
Poruke: 4443
*.bvcom.net.



+921 Profil

icon Re: ruby - shcwartzian transform: sortiranje po zbirovima redova.26.07.2017. u 21:56 - pre 35 meseci
Citat:

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.


Pa vidim da pokusavas da uradis funkcionalno resenje i u Ruby-ju i u Perl-u. A Haskell je dusu dan za funkcionalno programiranje jer je cist funkcionalan jezik :P
Recimo evo lepo je Jablan rekao ne bi trebalo pozivati f-je sa side efektima u cistim f-jama. Ali to nema ogranicenje u Ruby-ju. U Haskell-u je nemoguce to izvesti
osim ako ne provuces kroz unsafePerformIO ;)
Zato postoji mapM_ koja je specijalno namenjena za f-ju sa side efektima ;)
I sad na kraju reci sta je more readable ? ;)

press any key to continue or any other to quit....
 
Odgovor na temu

EmmaR
Srbija

Član broj: 269847
Poruke: 455



+171 Profil

icon Re: ruby - shcwartzian transform: sortiranje po zbirovima redova.26.07.2017. u 22:16 - pre 35 meseci
Citat:
Branimir Maksimovic: Pa vidim da pokusavas da uradis funkcionalno resenje i u Ruby-ju i u Perl-u. A Haskell je dusu dan za funkcionalno programiranje jer je cist funkcionalan jezik :P
Recimo evo lepo je Jablan rekao ne bi trebalo pozivati f-je sa side efektima u cistim f-jama. Ali to nema ogranicenje u Ruby-ju. U Haskell-u je nemoguce to izvesti
osim ako ne provuces kroz unsafePerformIO ;)
Zato postoji mapM_ koja je specijalno namenjena za f-ju sa side efektima ;)
I sad na kraju reci sta je more readable ? ;)


Stvar iskustva i sklonosti. Za Haskell imam utisak da su ga kreirali Vulkanci, dok već Erlang mnogo bolje razumem (sve dok neko ne ubaci konkuretno programiranje).
Za sada glasam za klasiku.

P.S. Ne primenjujem ja funkcionalna rešenja, već ih prepisujem i eventualno malo menjam (ako ne rade ili mi se ne sviđa kako rade).
ER
 
Odgovor na temu

jablan

Član broj: 8286
Poruke: 4541



+709 Profil

icon Re: ruby - shcwartzian transform: sortiranje po zbirovima redova.27.07.2017. u 06:36 - pre 35 meseci
E, tek sad sam zapravo probao tvoj kod iz prve poruke. Poslednje [nil, nil, nil] dobijaš kao rezultat ispisa prvog printa (linija 6), koji printa rezultat cele kobasice, tj. poslednjeg collect. Jednostavno izbaci prvo print i neće ti pisati taj ispis na kraju.

I please pročitaj savete koje sam ti dao ranije. U collect ne ide print. Poslednji collect u kome printaš, zameni sa each. Collect (odnosno map, kako ga ceo svet zove), koristi se samo kad ti treba njegov return value.

Takođe, umesto što praviš string sa totalom, pa čupaš total iz njega, pa ga opet konvertuješ u integer da bi sortirala, napravi posebnu međustrukturu (npr. niz, u mom primeru promenljiva linije_sa_totalima). Na primer, niz:

Code:

[
  [350, "Dan 78 83 94 95"], 
  [381, "Tod 98 94 97 92"],
  [261, "Leo 60 66 79 56"]
]

možeš direktno da sortiraš pozivom metode sort na njemu, bez ikakvih argumenata (sortiraće po prvom elementu). Posle taj sortirani niz ispiši u željenom formatu.

Čini mi se da taj ko je pisao knjigu ne poznaje dobro ruby, pa nisam siguran koliko je pametno da učiš iz njegovih primera, ako ti je uopšte cilj da naučiš ruby. A Perl, iskreno, nisam siguran koliko ima smisla danas uopšte učiti. Svakako ne kao prvi jezik.
 
Odgovor na temu

EmmaR
Srbija

Član broj: 269847
Poruke: 455



+171 Profil

icon Re: ruby - shcwartzian transform: sortiranje po zbirovima redova.27.07.2017. u 14:12 - pre 35 meseci
Citat:
jablan: E, tek sad sam zapravo probao tvoj kod iz prve poruke. Poslednje [nil, nil, nil] dobijaš kao rezultat ispisa prvog printa (linija 6), koji printa rezultat cele kobasice, tj. poslednjeg collect. Jednostavno izbaci prvo print i neće ti pisati taj ispis na kraju.

I please pročitaj savete koje sam ti dao ranije. U collect ne ide print. Poslednji collect u kome printaš, zameni sa each. Collect (odnosno map, kako ga ceo svet zove), koristi se samo kad ti treba njegov return value.

Takođe, umesto što praviš string sa totalom, pa čupaš total iz njega, pa ga opet konvertuješ u integer da bi sortirala, napravi posebnu međustrukturu (npr. niz, u mom primeru promenljiva linije_sa_totalima). Na primer, niz:

Code:

[
  [350, "Dan 78 83 94 95"], 
  [381, "Tod 98 94 97 92"],
  [261, "Leo 60 66 79 56"]
]

možeš direktno da sortiraš pozivom metode sort na njemu, bez ikakvih argumenata (sortiraće po prvom elementu). Posle taj sortirani niz ispiši u željenom formatu.

Čini mi se da taj ko je pisao knjigu ne poznaje dobro ruby, pa nisam siguran koliko je pametno da učiš iz njegovih primera, ako ti je uopšte cilj da naučiš ruby. A Perl, iskreno, nisam siguran koliko ima smisla danas uopšte učiti. Svakako ne kao prvi jezik.



Hvala.

To je online knjiga sa Google book-a (da je dobra sigurno je ne bi stavili kao free, a s druge strane neko bi je vec negde "okacio" u prihvatljivom formatu).

Ponešto znam o Ruby od pre i sigurno ne bih problem rešavala kako je u knjizi navedeno, ali ajde da probam.

ER
 
Odgovor na temu

EmmaR
Srbija

Član broj: 269847
Poruke: 455



+171 Profil

icon Re: ruby - shcwartzian transform: sortiranje po zbirovima redova.27.07.2017. u 14:24 - pre 35 meseci
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)



Zamisli , još i radi:
Code:

 >ghc shTrans.hs -o shTrans.out
Linking shTrans.out ...
 >./shTrans.out 
Leo 60 66 79 56 => 261
Dan 78 83 94 95 => 350
Tod 98 94 97 92 => 381



ER
 
Odgovor na temu

jablan

Član broj: 8286
Poruke: 4541



+709 Profil

icon Re: ruby - shcwartzian transform: sortiranje po zbirovima redova.27.07.2017. u 15:14 - pre 35 meseci
Citat:
EmmaR:
To je online knjiga sa Google book-a (da je dobra sigurno je ne bi stavili kao free, a s druge strane neko bi je vec negde "okacio" u prihvatljivom formatu).

Ponešto znam o Ruby od pre i sigurno ne bih problem rešavala kako je u knjizi navedeno, ali ajde da probam.

Možda najbolje da skineš http://rubykoans.com/ pa da kreneš odatle (posebno što baca akcenat na TDD). Iskreno, ne znam koju bih knjigu savetovao baš početniku. Pogledaj možda i https://learnrubythehardway.org/book/
 
Odgovor na temu

[es] :: Ostali programski jezici :: ruby - shcwartzian transform: sortiranje po zbirovima redova.

[ Pregleda: 2234 | Odgovora: 16 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.