Tiukka oneliner

Anonyymi

Kuinka pieneen tilaan echo komennon saa koodattua C kielellä niin että GCC kääntää sen oletusasetuksilla? (Ubuntu 64)

#include<stdio.h>
main(int c,char **v){while(1!=c--)printf("%s ",*v,**v );printf("\n");}

Kaksi varoitusta antaa, mutta kääntää. Testasin että ohjelma toimii kuten käyttöjärjestelmän mukana tuleva echo. Saako tuosta puristettua tavuakaan pois? Ei saa huijata eli koodin pitää toimia oletusasetuksilla Ubuntu 64 käyttöjärjestelmässä.

Esimerkin lähdekoodin koko on tasan 90 tavua, sen pienemmäksi en saanut enkä keksi miten se olisi mahdollista.

18

859

    Vastaukset

    Anonyymi (Kirjaudu / Rekisteröidy)
    5000
    • Anonyymi

      ./echo "$(<a.txt )"
      bash: ./echo: Argumenttilista on liian pitkä

      Mitäs tuohon sanot ?

      • Anonyymi

        Itselläni toimii. Onkohan sinulla paljonkin tekstiä tuossa a.txt tiedostossa? Tuon virheilmoituksen antaa bash, kokeilithan myös muilla kuin echo komennoilla, tuleeko sama virheilmoitus?


      • Anonyymi
        Anonyymi kirjoitti:

        Itselläni toimii. Onkohan sinulla paljonkin tekstiä tuossa a.txt tiedostossa? Tuon virheilmoituksen antaa bash, kokeilithan myös muilla kuin echo komennoilla, tuleeko sama virheilmoitus?

        Järjestelmän oma echo komento ei anna virheilmoitusta, mutta tuo koodista käännetty echo antaa. Kyllä a.txt sisälsi paljon rivejä, mutta kuinka paljon on jo nyt mahdoton tarkistaa.


    • Anonyymi

      Yleensä kannattaa koodista tehdä mielumminkin helposti luettavaa kuin hyvin kompaktia. Erityisesti tämä tulee esille silloin, kun joku muukin joutuu koodia jossakin vaiheessa lukemaan ja sen toimintaan tutustumaan.

    • Anonyymi
    • Anonyymi

      No vaikka tämmönen, 84 tavua, huom. lopussa ei tarvita rivinvaihtoa, eli ilman sitä alkuperäinenkin oli 89 tavua.

      #include<stdio.h>
      main(int c,char **v){while(c-->1)printf("%s ",*v,**v );puts("");}

      Tuo printf:n ylimääräinen argumentti on kyllä jo vähän ruma temppu. Jos yhden lisämerkin uhraisi sen poistamiseen, niin sitten vaikka näin:

      #include<stdio.h>
      main(int c,char **v){while(c-->1&&**v )printf("%s ",*v);puts("");}

      No jaa... :)

      • Anonyymi

        85 tavua kylläkin ja pitää olla ylimääräinen printf argumentti. Niin tiukka ettei mahdu vaseliinia väliin.


    • Anonyymi

      PUPPUA POISTON ESTOON
      Tosiasia on, että yksikin kokonaisvaltaista kasvua kohti suunnattu ehdotus parantaa peräänkuulutettua lakonisuutta. Me emme tiedä mitä tapahtuu todella, jos looginen asennoituminen ennakoi osaltaan hyvinvoivan yhteiskunnan rinnalle muodostuneita epäkohtia. Me emme tiedä mitä tapahtuu todella, jos looginen asennoituminen ennakoi osaltaan hyvinvoivan yhteiskunnan rinnalle muodostuneita epäkohtia. On hyvin vaikea johdatella asioita siten, että tietoyhteiskunta havainnollistaa hyvinvointimalliamme sekä huonoja taloudellisia ja hallinnollisia oloja.

      ASIAA
      82 Näin (ei virheilmoitusta)
      #include<stdio.h>
      int main(int c,char **v){while(c-->1&&**v )printf("%s \n",*v);}

      78 Näin (errorit kuten teilläkin)
      #include<stdio.h>
      main(int c,char **v){while(c-->1&&**v )printf("%s \n",*v);}

      • Anonyymi

        Mutta nuo toimii eri tavalla. Rivinvaihtoa ei pitänyt tulla joka väliin. Tai jos saa tulla niin sitten printf:n tilalle puts, niin lyhenee vielä vähän.


      • Anonyymi
        Anonyymi kirjoitti:

        Mutta nuo toimii eri tavalla. Rivinvaihtoa ei pitänyt tulla joka väliin. Tai jos saa tulla niin sitten printf:n tilalle puts, niin lyhenee vielä vähän.

        ASIAA
        No jos noita käännösvirheitä hyväksytään, niin voihan sen tehdä näinkin, jätetään kääntäjän tehtäväksi liittää <stdio.h> mukaan:

        60 (errorit mukana)
        main(int c,char **v){while(c-->1&&**v )printf("%s \n",*v);}

        Käyttö:
        ./echo 'Terve mailma' "Terve mailma"


        PUPPUA
        Jos vertailemme lyhyesti asiaankuuluvia ilmiöitä, huomaamme, että useimpiin käyttötarkoituksiin aivan liian raskas relaatiotietokanta kuvaa hyvin toimintamenetelmiä parannettaessa vastuuntuntoisten yhteistyökumppaneiden aatteellisia intressejä. Täytyy siitä huolimatta että maailmalla on viime aikoina tapahtunut paljon, todeta, että informaatioteknologia vaatii täsmällisyyttä ja päättäväisyyttä, ja kannustaa kehittämään runsain määrin esiintyvää suurpiirteisyyttä sekä rauhattomuutta.


      • 50 merkkiä:
        main(int c,char**v){for(;--c;printf("%s ",* v));}

        59 merkkiä:
        main(int c,char**v){for(;--c;printf("%s ",* v));puts("");}

        Sitten, kuten varmaan tiedättekin, tässä kisassahan ei ole mitään järkeä.

        Kuten Anonyymi edellä kirjoitti (3.5.2019 19:33), koodista kannattaa tehdä mielumminkin helposti luettavaa kuin hyvin kompaktia. C-kääntäjä ei tee tiukasta onelinerista tippaakaan tehokkaampaa, tiiviimpää tai nopeampaa lopputulosta eli suoritettavaa koodia kuin jos lähdekoodi on kirjoitettu nättiin, väljään ja helposti ymmärrettävään muotoon.

        Kisassa olisi paljonkin järkeä, jos paremmuutta ratkotaan lopputuloksen tiukkuudella. Esimerkiksi montako tavua tai assembler-käskyä käännettyyn objektiin sisältyy. (Tehtävän toki pitäisi olla hieman vaativampi.) Mm. tätä tarkoitusta varten C-kääntäjästä saa ulos listauksen, josta objektin voi vaivatta lukea assembler-käskyinä.

        C-kielellä työskennellessä assembler-listausta kannattaa vilkaista silloin tällöin monestakin syystä. C-kieltä on hyvin helppoa käyttää "väärin" eli siten, että kääntäjän tuotos jää tehottomaksi, vaikka ohjelma toimisikin. Osoittimien käyttö vs. taulukon indeksointi on yksi esimerkki. PC-ympäristössä asialla tuskin on suurta merkitystä nykyään, mutta varsinkin sulautettujen ohjelmoinnissa jokaisella tavulla ja mikrosekunnilla saattaa olla suuri merkitys.


      • Anonyymi
        y2017 kirjoitti:

        50 merkkiä:
        main(int c,char**v){for(;--c;printf("%s ",* v));}

        59 merkkiä:
        main(int c,char**v){for(;--c;printf("%s ",* v));puts("");}

        Sitten, kuten varmaan tiedättekin, tässä kisassahan ei ole mitään järkeä.

        Kuten Anonyymi edellä kirjoitti (3.5.2019 19:33), koodista kannattaa tehdä mielumminkin helposti luettavaa kuin hyvin kompaktia. C-kääntäjä ei tee tiukasta onelinerista tippaakaan tehokkaampaa, tiiviimpää tai nopeampaa lopputulosta eli suoritettavaa koodia kuin jos lähdekoodi on kirjoitettu nättiin, väljään ja helposti ymmärrettävään muotoon.

        Kisassa olisi paljonkin järkeä, jos paremmuutta ratkotaan lopputuloksen tiukkuudella. Esimerkiksi montako tavua tai assembler-käskyä käännettyyn objektiin sisältyy. (Tehtävän toki pitäisi olla hieman vaativampi.) Mm. tätä tarkoitusta varten C-kääntäjästä saa ulos listauksen, josta objektin voi vaivatta lukea assembler-käskyinä.

        C-kielellä työskennellessä assembler-listausta kannattaa vilkaista silloin tällöin monestakin syystä. C-kieltä on hyvin helppoa käyttää "väärin" eli siten, että kääntäjän tuotos jää tehottomaksi, vaikka ohjelma toimisikin. Osoittimien käyttö vs. taulukon indeksointi on yksi esimerkki. PC-ympäristössä asialla tuskin on suurta merkitystä nykyään, mutta varsinkin sulautettujen ohjelmoinnissa jokaisella tavulla ja mikrosekunnilla saattaa olla suuri merkitys.

        Mutta kun onelinerit ovat ihan oikea kilpailuluokka alan tapahtumissa. Sen voittamalla saa rahaa ja naisia. Epäironisesti onelinereilla voidaan testata kuinka hyvin hallitsee ohjelmointikielen. Jos ohjelmoijat palkattaisiin onelinerin perusteella, currylle haisevista purkkaohjelmointitaloista jäisi jäljelle vain tuulessa vienosti liehuvat vuokrattavana kyltit. Pohjimmiltaan tässä on kyse valkoisen miehen ja samalla sivilisaation tulevaisuudesta, suhtautuisit sinäkin asiaan tarvittavalla vakavuudella.


    • Anonyymi

      Muistakaa huomioida ratkaisuissanne echo-komennon eri toiminnot, jotka saa selville esimerkiksi komennolla "help echo". Täässä Ubuntussa echo näyttää olevan 35 000 tavua pitkä.

      • Anonyymi

        Älä nyt pikkuasioihin takerru, kuhan kaiuttaa jotain näytölle.


      • Anonyymi

        $echo -h
        Echo. Oma versio. Tulostaa näytölle jotain.


    • Tiukkaa tavaraa tässä ketjussa. Joskus 1970-1980-luvulla, ja varmaan joskus niihin aikoihin, kun Linus Torvalds teki tohtori-opinnäytetyötä Linuxin parissa C:llä, tietokoneiden tehot ja muisti olivat tosiaankin rajalliset, mutta nykyään ei taida enää olla aivan näin tarkkaan bitin viilaukseen tarvetta?

      • Anonyymi

        Nykyään ohjelmien koodi on täynnä ylimääräistä läskiä mitä ei ollenkaan tarvittaisi. Bloatwareksi tuota on ollut tapana kutsua. Lisätään toimintoja joille oikeasti ei ole mitään käyttöä ja linkataan mukaan kasapäin kirjastoja, joita ilman koodin saisi paljon pienempään tilaan.


    • Anonyymi

      Mikäs olikaan jännittävä tietokoneen heti sammuttaminen... win10: oli jotain "cmd SHUTDOWN ja parametrejä, melko helppoa kuin anderoidien käyttöjärjestelmissäkin :EDD:

    Ketjusta on poistettu 0 sääntöjenvastaista viestiä.

    Luetuimmat keskustelut

    1. Kuolemanrangaistus

      Mielestäni kuolemanrangaistus on väärin kaikissa tilanteissa. Vaikka joku olisi murhannut 10 ihmistä, hänen surmaaminen
      Laki ja rikos
      115
      6727
    2. Muistakaa persut, että TE petitte, ei kokoomus

      Miksikö kukaan ei arvostele kokoomusta? No sen vuoksi, että kokoomus noudattaa vaalilupauksiaan. Sen sijaan TE persut,
      Maailman menoa
      372
      6146
    3. Miksi persut eivät häädä mamuja pois Suomesta?

      Sitä vartenhan persut äänestettiin valtaan. Nyt valta on persuilla. Mamut nostaa työttömyyskorvauksia. Persut huutaa mam
      Maailman menoa
      45
      4468
    4. Lopetan ikävöinnin

      Ei meistä enää koskaan tule mitään. Olen ikävöinyt ja kaivannut enkä saa mitään vastakaikua ja lämpöä. Parempi erillään
      Ikävä
      12
      3875
    5. Riikka Purra ei estä tehomaksun käyttöönottoa

      Sähkön hinnoittelua koskevan määräyksen on määrä astua voimaan vuoden 2029 alusta, Energiavirastosta kerrotaan. Määräyk
      Maailman menoa
      72
      3627
    6. Outo ilmiö - vasemmistolaiset eivät kirjoita mitään kokoomuksesta

      joka sentään johtaa hallitusta, ja jonka talouspolitiikkaa noudatetaan. Nämä muutamat vasemmistolaiset jotka täällä aina
      Maailman menoa
      111
      2836
    7. Sinä olet minun forEver

      Sinä olet minun sielussain, sydämessäin, huulillain, sinä olet ain, Sinä olet vieressäin, kainalossain, sylissäin, ain,
      Ikävä
      27
      2524
    8. Sanna Marinille pedataan paluuta pääministeriksi?

      Näyttäisi mylly lähteneen käyntiin nyt toden teolla. Nykyiset oikeistodemarit haukutaan vasemmistodemareiden toimesta ni
      Maailman menoa
      26
      2356
    9. Jos kaikki lopulta kuolevat, onko edes pahimmillakaan rikoksilla mitään väliä?

      Kaikki kuolevat lopulta. Siksi ihmisten tekemillä rikoksillakaan ei lopulta ole mitään merkitystä. Joidenkin mielestä t
      Filosofia
      22
      1856
    10. Väestöstä vain vassarit vaihtuvat nopeammin kuin persut

      Kevääseen 2023 verrattuna vassareita 50 prosenttia enemmän, ja persuja 25 prosenttia vähemmän.
      Maailman menoa
      18
      1654
    Aihe