Ultra-krótki kod źródłowy :)

0

Witam, studiuję na informatyce i dość często mamy konkursy na najkrótszy kod źródłowy jakiegoś programu który by coś robił. Ja np piszać program osiągnąłem około 180 znaków (zajęło mi to pare godzin) i wydawało mi się, że już bardziej się tego nie da skompresować, ale teraz patrze i widzę, ze ktoś ma 117 znaków :) Dziwię się troche jak to możliwe. Oczywiście podałem tutaj jakieś liczby, ale wszystko zależy od programu jaki trzeba zrobić.
Znacie może jakieś przykłady różnych zadań informatycznych (wejście/wyjście) z ultra-krótkim kodem rozwiązania? Chciałbym zobaczyć mniej więcej na czym to polega... :)

Do tej pory wiem tylko że do tego celu używa się zmiennych jednoliterowych, sztuczek z tablicami, jednej linijki kodu itd

0

Sprecyzuj, co to ma robić oraz jaki to ma być język programowania?

0

zawody na najkrotszy kod źródłowy masz np. na OPSSie jeśli chcesz sobie poćwiczyć.
Jak powiedział jeden z biorących w nim udział:

Fred napisał(a)

Zasadniczą rolę w długości kodu odgrywa odpowiedni algorytm, a technika pisania(skracania) raczej drugorzędną!

0

Język programowania: C

Robić: odczytywać jakieś dane ze standardowego wejścia -> przetwarzać je -> przesłać na ekran
Problem dowolny, byleby nie był trywialny...

Chcę zobaczyć jakieś krótkie kody, bo nie chce mi się wierzyć że takowe istnieja :)

0

duzo zalezy tez od rodzaju jezyka, np w pscalu bloki tworzy sie za pomoca begind end;, to duzo znakow. a np w C tylko {}, wiec, jezeli masz wybor, to lepiej korzystac z jezykow ze skladnia podobna do C. zmienne jednoliterowe, ale jak jakos nie bedzie potrzebna juz, a nagle bedziesz potrzebowal drugiej, to wykorzystaj ta stara. najlepiej wszystkie zmienne zdefiniowac w jednym miescu. wtedy mozesz zaoczszedzic miejsce, bo wypisz nazwy zmiennych po przecinku. oczywiscie znaki nowej linii ida do wyrzucenia. zadnych wciec. zamiast standardowej instrukcji IF korzystaj z
x=c>1?"tak":"nie"

i duzo, duzo innych rzeczy. kombinuj :)

0

Co prawda, to nie C, ale polecam
http://www.256b.com

0

Pisz w assemblerze to po pierwsze a po drugie najlepiej pomieszaj asm z innym językiem. reszta przyjdzie sama. można też stosować własne biblioteki i np. jezeli piszesz w pascalu wszystko ładujesz do biblioteki a w programie tylko wywołujesz jakąś procedure i koniec. w ten sposób można nawet zejść do takiego poziomu:

(Pascal)

uses crt, xxx; // xxx to twoja biblioteka
begin
yyy; // yyy to procedura zawarta w bibliotece xxx
end.

(jak dobrze policzyłem to ten kod ma zaledwie 27 znaków włącznie ze spacjami) Bardziej to już tylko można nazwe biblioteki i procedury skrócić...
Istnieje jeszcze inna technika, polega ona na tym że w pierwszej fazie piszesz program normalnie (zwykły kod) później optymalizujesz go maksymalnie skracajac nazwy zmiennych, stałych itp. Przed tym wszystkim istotne jest to aby algorytm programu był jak najbardziej krótki i optymalny pod wzgledem wykonania. Pamiętaj że nawet bardzo krótki kod może wykonywać się dłużej niz ten dłuższy od niego nawet kilkakrotnie. Tak naprawde to nie wiem o co chodzi czy o krótki kod czy też o krótki kod i czas wykonania. Jak masz jakieś pytania to śmiało! Postaram się pomóc . pozdrawiam...

Ps. Istnieje pewna sztuczka która nawet kod przedstawiony powyżej może zoptymalizować do 17 znaków na pewno ! a jak się to sprawdzi to nawet bardziej czego już nie jestem pewien bo nie testowałem... :)

0
guruzjeb napisał(a)

(Pascal)

uses crt, xxx; // xxx to twoja biblioteka
begin
yyy; // yyy to procedura zawarta w bibliotece xxx
end.

co to ma być? sztuczka? 8-O myslisz ze takie cos by przeszło :>

lekki offtopic - mysle ze to jest ciekawsze niz skracanie programu http://www.ioccc.org/

takie dwa standardowe przykłady:

/*
 * HELLO WORLD program
 * by Jack Applin and Robert Heckendorn, 1985
 * (Note: depends on being able to modify elements of argv[],
 * which is not guaranteed by ANSI and often not possible.)
 */
main(v,c)char**c;{for(v[c++]="Hello, world!\n)";
(!!c)[*c]&&(v--||--c&&execlp(*c,*c,c[!!c]+!!c,!c));
**c=!c)write(!!*c,*c,!!**c);}
/*
 * Program to compute an approximation of pi
 * by Brian Westley, 1988
 * (requires pcc macro concatenation; try gcc -traditional-cpp)
 */

#define _ -F<00||--F-OO--;
int F=00,OO=00;
main(){F_OO();printf("%1.3f\n",4.*-F/OO/OO);}F_OO()
{
            _-_-_-_
       _-_-_-_-_-_-_-_-_
    _-_-_-_-_-_-_-_-_-_-_-_
  _-_-_-_-_-_-_-_-_-_-_-_-_-_
 _-_-_-_-_-_-_-_-_-_-_-_-_-_-_
 _-_-_-_-_-_-_-_-_-_-_-_-_-_-_
_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
 _-_-_-_-_-_-_-_-_-_-_-_-_-_-_
 _-_-_-_-_-_-_-_-_-_-_-_-_-_-_
  _-_-_-_-_-_-_-_-_-_-_-_-_-_
    _-_-_-_-_-_-_-_-_-_-_-_
        _-_-_-_-_-_-_-_
            _-_-_-_
}
</quote>
0

O właśnie o coś takiego mi chodziło :) Zależy mi na jak najmniejszej ilości znaków w kodzie źródłowym...

0
guruzjeb napisał(a)

(Pascal)

uses crt, xxx; // xxx to twoja biblioteka
begin
yyy; // yyy to procedura zawarta w bibliotece xxx
end.

Jak o to chodzi, to:

  1. Nie potrzebujesz tego crt (po jaką cholerę to tam w ogóle?)
  2. Nie musisz wywoływać procki yyy; (możesz użyć bloku begin end. w bibliotece)
  3. To żaden krótki program na dobrą sprawę.

Jeśli chodzi o ASM'a, którego ktoś wspominał - co jak co, ale KOD ŹRÓDŁOWY przeciętnego programu w ASM'ie jest o wiele dłuższy niż takiego samego w języku wysokiego poziomu.

0

przy pomocy putchar czasami mozna skrocic kod (w potyczkach algorytmicznych z zeszlego roku w zadaniu z potega wiele osob to zastosowalo - poszukaj :P).
w petli for mozna w piewrszej i trzeciej czesci uzywac przecinkow zamiast wpisywac instrukcje miedzy klamry (zawsze kilka znakow mniej).

1 użytkowników online, w tym zalogowanych: 0, gości: 1