Osaatteko tehdä eri kielillä ohjelmia, jotka ajettaessa tulostavat oman lähdekoodinsa? Ohjelma ei saa lukea levyltä mitään vaan sen pitää pystyä tulostamaan oma lähdekoodinsa ihan "sisäisesti", eli esim. C:ssä saa käyttää vain printf:ää ja vastaavia funktioita eikä ollenkaan lukufunktioita.
koodinsa tulostava ohjelma
09iafe
15752
0Äänestä
Muut lukivat myös
Odottaa vastausta
Näihin keskusteluihin ei ole vielä vastattu. Ole ensimmäinen.
Vastaukset 15
Vanhimmat
näetkö tällaiselle ohjelmalle jotain sovelluskäyttöäkin? sen jälkeen kun ohjelma on käännetty konekieleksi/tavukoodiksi ei lähdekoodia saa kuin konekieli/tavukoodi-muodossa. käytännössä tämä vaatii suoraan koodisegmentiltä lukemista eikä onnistu kuin matalan tason operaatioilla.
Väitän, että et osaa kirjoittaa sellaista ohjelmaa. Kyseessä on ohjelmointihaaste, joka ei ole ihan triviaali, mutta tehtävissä jokseenkin kaikilla kielillä.
Osaatko sinä kirjoittaa ohjelman, joka tulostaa tasan tarkkaan oman lähdekoodinsa lukematta sitä mistään tiedostosta? Eli osaatko tehdä ohjelman, joka käyttää vain ja ainoastaan tulostusta ja ohjelman sisäisiä tietorakenteita hyväkseen?
"käytännössä tämä vaatii suoraan koodisegmentiltä lukemista eikä onnistu kuin matalan tason operaatioilla."
Se, mitä pyysin, onnistuu helposti kun vähän jaksaa miettiä.
no siis, totta kai se onnistuu jos kopsaa koko lähdekoodin johonkin vakiomerkkijonomuuttujaan ja tulostaa tämän sitten ohjelman ajon aikana, mutta tämä ei varmaan ole se haaste mitä ajat takaa.
http://www.nyx.net/~gthompso/self_c.txt
http://www.nyx.net/~gthompso/self_c .txt
http://www.nyx.net/~gthompso/quine.htm
"totta kai se onnistuu jos kopsaa koko lähdekoodin johonkin vakiomerkkijonomuuttujaan ja tulostaa tämän sitten ohjelman ajon aikana"
Kokeilitko? Ei onnistu noin suoraviivaisesti.
Ennenkuin katsot vinkkiä toisesta vastauksesta, niin koita ratkaista tehtävä itse. Se on ihan mielenkiintoinen haaste ohjelmoinnista pitäville.
#include
int main(void)
{
printf("#include \n\nint main(void)\n{\nprintf(\"TÄSTÄ TULIS LOPUTON TUNNELI!\");\n}");
}
elikkä unohtui
"...printf(\"TÄSTÄ TULIS LOPUTON TUNNELI!\");\n}"); ..."
Mutta tuon ongelman kiertäminen tässä juuri onkin se "pihvi".
ohjelmalistauksen kuvaputkelta A4-lehtiölle lyijykynällä ja TOISELLA KÄDELLÄ.
Sain väännettyä tollaisen:
http://netsonic.fi/~unioni31/tulosta-oma.c
(saanko papukaijamerkin (tai jotain))
Näyttää toimivan!
Menikö kauan tekemisessä? Koitin päivällä kikkailla C :lla hieman eri tekniikalla, mutta en saanut toimimaan. Pitää yrittää perjantaina uusiksi, kun on paremmin aikaa.
Meniköhän muilta luu kurkkuun :)
Menihän siinä ainakin tunti (ellei toinenkin) sählätessä, olisi pitänyt heti tajuta käyttää "risuaitaa". Linkeissä näköjään muitakin "tekniikoita". Pitänee kokeilla vielä ainakin Lispillä ja Pythonilla.
löyty tommonen:
http://netsonic.fi/~unioni31/tulosta-oma.lisp
Lyhin mahdollinen Python-ohjelma, joka tulostaa itsensä on seuraavien lainausmerkkien välissä: "".
Tehtävä on mielenkiintoisempi, jos halutaan sellainen ohjelma, joka sisältää ainakin yhden merkin. Minulla on 92 merkin pituinen ratkaisu, ja olisi hauskaa nähdä lyhyempi. Sellainen voi hyvinkin löytyä...
Tämä on vähän huijausta, mutta komentoriviltä, eri tarkemmin REPListä onnistuu tämä
(IDENTITY -)
Koita vaan. Kun käyttää REPLiä, tuo - on nykyinen syöte. Jos käännät tai ajat muuten ohjelman, se ei kuitenkaan toimi. Vain suoraan syötettynä siis.