Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointiputka: Putkaposti 41: Huono pakkaus

Sivun loppuun

Antti Laaksonen [03.09.2010 15:25:21]

#

Syksy tuo tullessaan uuden putkapostin:

https://www.ohjelmointiputka.net/postit/tehtava.php?tunnus=hupa

Metabolix [03.09.2010 15:38:27]

#

Kiva tehtävä. Nykyinen ratkaisu taitaa kuitenkin olla jo paras mahdollinen, nimittäin jos zip havaitsee, että "pakkaamisesta" ei ole apua, se tallentaa tiedoston pakkaamattomana.

Kray [03.09.2010 16:03:51]

#

Nykyiset tuloksethan ovat kaikki tod.näk. satunnaisdataa jota saadaan kätevästi esim. *nixien /dev/(u)randomista. Nuo 158 tavua ovat zipin headereita. Itse sain paisutettua tiedoston peräti 4056 tavuun yksinkertaisesti nimeämällä tiedoston mahdollisimman pitkästi (zip säilyttää tiedostonimet headerissa), mutta putkan tulokseen tällä ei ollut vaikutusta ilmeisestikin uploadin vaihtaessa nimen.

Metabolix [03.09.2010 16:12:31]

#

Kray kirjoitti:

Nykyiset tuloksethan ovat kaikki tod.näk. satunnaisdataa

Itse ainakin ratkaisin tehtävän ihan yksinkertaisella logiikalla. Tämä tietenkin vaatii perustietoja käytettävän pakkausalgoritmin periaatteista.

Grez [03.09.2010 16:13:22]

#

Kray kirjoitti:

Nykyiset tuloksethan ovat kaikki tod.näk. satunnaisdataa jota saadaan kätevästi esim. *nixien /dev/(u)randomista. Nuo 58 tavua ovat zipin headereita.

Tarkoittanet 158 tavua?

Kray kirjoitti:

mutta putkan tulokseen tällä ei ollut vaikutusta ilmeisestikin uploadin vaihtaessa nimen.

Niin, tehtävänannossa sanotaan, että:

lainaus:

se muutetaan ZIP-paketiksi seuraavalla Unix-komennolla:

zip suuri.zip suuri.dat

Eli ilmeisesti tiedoston nimi on aina suuri.dat

Chiman [03.09.2010 17:33:15]

#

Vähän yli puoli tuntia ehti kulua uuden tehtävän ilmoittamisesta, ennen kuin periaate vastauksen tuottamiseen kerrottiin. En oikein hahmota nopean spoilaamisen ideaa, mutta ehkä olen ainoa.

Metabolix [03.09.2010 20:08:54]

#

Joudun pyörtämään puheeni: isommalla datamäärällä (64 kilotavua) sain zip-ohjelman luomaan pakkauksen kanssa hieman isomman tiedoston kuin ilman pakkausta. Ehkä siis tähänkin tehtävään on jokin syöte, jolla ohjelmaa saa huijattua. Tämän selvittämiseksi pitäisi varmaankin tutustua ohjelman lähdekoodiin.

rndprogy [03.09.2010 20:40:11]

#

vai olisiko headerissa sitten informaatio tiedoston koosta ilmoitettu sellaisessa formaatissa, joka kasvattaa tiedoston kokoa? isompi luku vaatii varmasti enemmän tilaa.

Grez [03.09.2010 20:51:12]

#

Huono implementaatio.

Putkaposti kirjoitti:

jos menetelmä pienentää jonkin tiedoston kokoa, se vastaavasti suurentaa jonkin tiedoston kokoa

US Patent 5,533,051 väittää että siinä esitelty menetelmä pienentää minkä tahansa ja että kertaalleen pienennettyä voi aina pienentää lisää samalla menetelmällä ..

aaämdee [03.09.2010 21:35:57]

#

Grez kirjoitti:

US Patent 5,533,051 väittää että siinä esitelty menetelmä pienentää minkä tahansa ja että kertaalleen pienennettyä voi aina pienentää lisää samalla menetelmällä ..

Oliko tuo vitsi? Eihän moinen ole edes teoriassa mahdollista. Siis, että voisi muka aina pakata mitä tahansa dataa pienemmäksi.

Blaze [03.09.2010 21:46:05]

#

Mistä lähtien amerikkalaisilla patenteilla on ollu mitään tekemistä todellisuuden kans?

Metabolix [03.09.2010 21:50:15]

#

Grez kirjoitti:

US Patent 5,533,051 väittää että siinä esitelty menetelmä pienentää minkä tahansa ja että kertaalleen pienennettyä voi aina pienentää lisää samalla menetelmällä ..

Tässä on oma vastaava menetelmäni: Pakatun tiedoston alussa on aina muutaman tavun mittainen otsikkotieto, joka sisältää olennaisesti datan pituuden ja valitun dataformaatin numeron (0..255). Tätä seuraa pakattu data, joka on aina täsmälleen yhden tavun lyhyempi kuin alkuperäinen. Kätevää, eikö? Ja paras on vielä edessä: varsinainen pakkausalgoritmi toimii vakioajassa syötteen pituudesta riippumatta! (Toki datan siirtely muistissa yhä vie aikansa.)

Joo, asiasta tietämättömiä on helppo huijata, kunhan esittää väitteensä tarpeeksi tyylikkäästi.

Grez [04.09.2010 08:03:50]

#

aaämdee kirjoitti:

Oliko tuo vitsi?

Mua ainakin pikemminkin itkettä kuin naurattaa.

progo [05.09.2010 10:57:46]

#

Eikö tähän kannattaisi vaihtaa sellainen pakkausohjelma, joka ei jätä leikkiä kesken hankalan tiedoston kanssa. Vai onko se toiminnallisuus sidottu formaattiin?

-tossu- [05.09.2010 11:16:59]

#

Zip-paketti kannattaisi vaihtaa johonkin tiettyyn algoritmiin tai tarpeeksi tyhmään pakkausformaattiin. Nyt /dev/urandom:inkin tuottama satunnaisdata saa täydet pisteet.

Antti Laaksonen [05.09.2010 11:58:45]

#

ZIP-menetelmä on kaikkien tuntema pakkausmenetelmä, minkä vuoksi se on luonteva valinta tehtävään. Moni on saanut tuloksen 1158, mutta onko joku varma siitä, että se on paras mahdollinen tulos?

Torgo [05.09.2010 13:23:43]

#

Antti Laaksonen kirjoitti:

Moni on saanut tuloksen 1158, mutta onko joku varma siitä, että se on paras mahdollinen tulos?

Se että zip kertoo pakkauksen olevan 0 ja se että pakattu tiedosto on pakkauksen sisällä sellaisenaan kertonee jotain. Ja koska tiedoston nimi ja pakkauskomentokin ovat fiksattuja, niin ei headerin pituuteenkaan ole käsittääkseni mahdollista vaikuttaa.

Antti Laaksonen [05.09.2010 14:06:44]

#

Tämä on totta, mutta ohjelma saattaa "pakata" tiedoston, vaikka pakattu tiedosto olisi suurempi kuin alkuperäinen tiedosto.

Ohjelman tuloste, kun 1000 tavun tiedosto lisätään sellaisenaan:

  adding: suuri1.dat    (in=1000) (out=1000) (stored 0%)
total bytes=1000, compressed=1000 -> 0% savings

Ohjelman tuloste, kun 65536 tavun tiedosto lisätään "pakattuna":

  adding: suuri2.dat    (in=65536) (out=65546) (deflated 0%)
total bytes=65536, compressed=65546 -> 0% savings

Jälkimmäisessä tapauksessa "pakattu" tiedosto vie siis 10 tavua enemmän tilaa kuin alkuperäinen tiedosto. Voisiko sopivasti valittu 1000 tavun tiedosto aiheuttaa vastaavaa?

Grez [05.09.2010 18:01:25]

#

Minkäköhän kokoisissa palasissa ZIP pakkaa (tämä kilpailussa käytetty ZIP implementaatiot oletusasetuksillaan). Meinaan jos se saa osaa paloista pakattua vähän ja osaa ei, niin se saattaa harhautua laittamaan näitä paloja talteen vaikka koko tiedoston tallettaminen pakkaamattomana saattaisi viedä vähemmän tilaa. Tietenkin jos lohkon koko on yli 1000, niin tuossa kilpailutehtävän tapauksessa peli on menetetty vaikka 64k tiedostolla kokoa pystyisikin kasvattamaan.

L2-K2 [06.09.2010 16:28:35]

#

Antti Laaksonen kirjoitti:

Tämä on totta, mutta ohjelma saattaa "pakata" tiedoston, vaikka pakattu tiedosto olisi suurempi kuin alkuperäinen tiedosto.

Ohjelman tuloste, kun 1000 tavun tiedosto lisätään sellaisenaan:

  adding: suuri1.dat    (in=1000) (out=1000) (stored 0%)
total bytes=1000, compressed=1000 -> 0% savings

Ohjelman tuloste, kun 65536 tavun tiedosto lisätään "pakattuna":

  adding: suuri2.dat    (in=65536) (out=65546) (deflated 0%)
total bytes=65536, compressed=65546 -> 0% savings

Jälkimmäisessä tapauksessa "pakattu" tiedosto vie siis 10 tavua enemmän tilaa kuin alkuperäinen tiedosto. Voisiko sopivasti valittu 1000 tavun tiedosto aiheuttaa vastaavaa?

Niin, mutta tuo negatiivinen pakkaus taitaa johtua käytetyn DEFLATE-formaatin "pakkaamattoman" 00-lohkon maksimipituudesta, joka on 65535 tavua.

Grez [06.09.2010 16:32:12]

#

Yleisestikin ottaen zip-standardin mukaisia pakkauksia pystyy tekemään parempia ja huonompia. Kun ei tiedä Antin käyttämää versiota, niin mielestäni aika turha alkaa tutkia tarkemmin.

Esim. omassa melkein Unixissa eli Linuxissa zip (Copyright (c) 1990-2006 Info-ZIP - Zip 2.32 (June 19th 2006)) tuottaa vain 1150 tavua pitkän tiedoston 1000 tavusta urandomia sisältävästä suuri.dat:sta, kun taas Antin käyttämä versio tuottaa 8 tavua enemmän.

Vastaavasti 7-zip tuottaa oletusastuksilla -tzip -flagilla (eli zip eikä 7z) 1116 tavun tiedoston, eli 42 tavua Antin zippiä pienemmän. Voi toki olla että Windowsissa tallennetaan vähemmän informaatiota tiedostosta. Päivämäärä ainakin näyttää tallentuvan, mutta oikeusflageista ei tietoa.

tesmu [19.09.2010 18:26:18]

#

Käännän seuraavan kysymykseni rot13:sta.


Wbf bvxrva lzzäefva avva xälgäaaöffä rxnxfv ibvfva yhbqn fryynvfra .qng gvrqbfgba wbfgn ghyrr ghb 1000 gniha mvc-gvrqbfgb wbgn fvggra xälqäa .qng gvrqbfgban. Aävauäa mvc uhbznn rggä cnxxnhxfrfgn rv byr ulöglä xha fr ba wb xreena cnxnggh. Byraxb bvxrvyyn wäywvyyä?

Blaze [19.09.2010 22:46:52]

#

Voi sen noinkin tehdä, mut helpomminki onnistuu.

jutti [25.09.2010 09:41:08]

#

Xreeb zvgra yhbg gvrqbfgba, wbxn mvcngghan ba gnfna 1000 gnihn.

-tossu- [25.09.2010 11:14:43]

#

jutti kirjoitti:

Xreeb zvgra yhbg gvrqbfgba, wbxn mvcngghan ba gnfna 1000 gnihn.

Yhbznyyn gvqbfgba, wbffn ba 1000 gnihn fnghaanvfgn qngnn wn mvccnnznyyn fr. Bznyyn xbarryynav aäva fnnqha mvcva xbxb byv 1138 gnihn. 1000-138=862 Alg ynvgrgnna gvrqbfgbba 862 gnihn enaqbz-qngnn wn mvcngnna fr, wbyybva mvcva xbba cvgävfv byyn 1000 gnihn.

Metabolix [25.09.2010 12:52:11]

#

-tossu-: Aika hyvä, mutta toisaalta jos keksii tuon, ei ehkä kaipaa enää sitä 1000 tavun zippiä. :)

tesmu: Ratkaisuideassasi on virhe: tiedoston otsikko on pakkaamatonta dataa, joten kun 1000 tavun zip-tiedosto pakataan, se menee alkuperäistä pienempään tilaan. (Toki lisäksi tulee uuden zip-tiedoston otsikko, jolloin yhteiskoko kasvaa.) Seuraava on zip-ohjelman tuloste koneellani, kun suuri.dat onkin 1000 tavun zip-tiedosto, joka on tehty, kuten -tossu- yllä ehdotti:

  adding: suuri.dat     (in=1000) (out=979) (deflated 2%)

Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta