Tiukka oneliner

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.
18900
Äänestä

Muut lukivat myös

Vastaukset 18

Vanhimmat

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

Mitäs tuohon sanot ?

Äänestä
  • 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?

    Äänestä

  • 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.

    Äänestä

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.

2Äänestä

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...+:)

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

    Äänestä

PUPPUA+POISTON+ESTOONTosiasia+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.ASIAA82+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);}

Äänestä
  • 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.

    Äänestä

  • 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.

    ASIAANo+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"PUPPUAJos+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.

    Äänestä

  • 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.

    Äänestä

  • 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.

    Äänestä

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ä.

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

    Äänestä

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

    Äänestä

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?

Äänestä
  • 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.

    Äänestä

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:

Äänestä

Kommentoi aloitusta


Anonyymi kirjoitti:

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.

Anonyymi
5000

Ilmoita asiaton sisältö

  • Sisältää materiaalia, joka on loukkaavaa, herjaavaa, rasistista, uhkailevaa tai ahdistelevaa.

  • Materiaali sisältää nimiä, yhteystietoja tai muita henkilökohtaisia tietoja. Julkisuuden henkilöistä, julkisissa viroissa toimivista ihmisistä sekä yritysten vastuuhenkilöistä saa keskustella työhön liittyen. Myös yksityiselämään liittyvistä asioista voi keskustella siltä osin, kuin niistä on julkisesti kerrottu.

  • Sisältää lapsille haitallista tai heiltä kiellettyä materiaalia. Seksuaalinen sisältö on sallittua aiheeseen tarkoitetuilla palstoilla, joiden ikäraja on 18 vuotta.

  • Lainvastaista sisältöä voi olla mm. yksityiselämää loukkaavan tiedon levitys, kiihottaminen kansanryhmää vastaan, laiton uhkaaminen, alaikäisiin liittyvä seksuaalinen sisältö/grooming, petokset, identiteettivarkaudet, kunnianloukkaukset ja tekijänoikeusrikkomukset.

  • Sisältö ei liity palstan tai keskusteluketjun aiheeseen.

  • Viesti ei ole suomea tai ruotsia (pl. International Forums), se sisältää mainontaa, se sisältää tekijänoikeuksin suojattua materiaalia, se on massapostitus tai jokin muu syy.

Jaa keskustelu