Program dziewięćdziesiąt dziewięć butelek piwa bez znaków alfanumerycznych

1

hej,

Po około pięciu latach udało mi się ukończyć tytułowy program.
Nie że jakoś mocno się do niego przykładałem bo wychodzi średnio 2.5 linie kodu na miesiąc.
Chociaż bardziej to było z 15 linii na 6 miesięcy.

Nie pamiętam dokładnie ale na pomysł tego programu wpadłem jak coś robiłem w javaskrypcie
i połączyły mi się w głowie:

Więc wpadłem na pomysł aby zrobić "program dziewięćdziesiąt dziewięć butelek piwa w javascrypcie
bez używania znaków alfanumerycznych". (i tylko znaki ascii)

Czyli aby program zwracał tekst piosenki http://www.99-bottles-of-beer.net/lyrics.html

No i właśnie zrobiłem.

Za bardzo nie starałem się skracać kodu więc moje rozwiązanie ma teraz 15667 bajtów.
(razem ze spacjami i nowymi liniami które nie są potrzebne)
Czyli więcej niż zwracany wynik, który ma 12184 bajty. Ale myślę że spokojnie można zmieścić się w 8192 bajtach, a jakby się postarać to i 4k (aka mniej niż 4k zależności)
Dodatkowo kilka rzeczy mi się w moim kodzie nie podoba więc może za rok zrobię coś lepszego.

Zachęcam do spróbowania napisania takiego programu, może uda się komuś zrobić krótszy
lub mniej znaków specjalnych. Moje rozwiązanie opublikuje za tydzień.

(najlepiej nie szukać rozwiązania jak to zrobić w wyszukiwarkach tylko spróbować samemu do tego
dojść. Po zrobieniu tego programu wyszukałem i okazało się że wszystko jest opisane i nawet
są gotowe generatory kodu [też myślałem aby zrobić z mojego programu generator ale mi się nie chciało],
więc zachęcam najpierw samemu spróbować)

0

Widzę że nie urzekła was za bardzo moja historia. Ktoś coś próbował zrobić?
Zamieszam moje rozwiązanie. Nie jest idealne bo działa tylko w przeglądarkach (testowałem na chrome i firefox) ponieważ używa obiektów hosta. Dodatkowo jak pisałem wcześniej zajmuje dużo miejsca. Aby uruchomić wystarczy wkleić kod w konsole deweloperską przeglądarki i nacisnąć enter.

0

Odkryłeś JSFucka ?

0

Wersja bez używania brzydkich słów:
https://gist.github.com/vpiotr/f85fcf48b85f7208dd8ed0b12074b36a

1

@jarekr000000:
Tak odkryłem JSFuck ale dopiero po napisaniu całego programu. Wcześniej się z nim nie spotkałem. Ale prymitywy i typy bardzo podobnie są rozwiązane. Na większość rzeczy wpadłem przypadkiem jak znalazłem jakiś WTF w js to zapisywałem go sobie w pliku na później. Więc nie szukałem konkretnego rozwiązania.

-- spoiler --
Najdłużej to mi chyba zajęło odkrycie jak dostać się do window. Oni używali unecsape przy stringach a ja poszedłem w String.fromCharCode, ale nie mogłem znaleźć 'h' wiec ostatecznie użyłem String.fromCodePoint ale chyba bym lepiej wyszedł na tym unescape (dodatkowo toString(36) też jest ciekawe). Ale to jest gdzieś 15% mojego kody (szyjka butelki mojego rozwiązania) oprócz tego mój kod używa pętel, warunków itd i nie używa eval (oprócz konstruktora funkcji aby dostać się do window)
-- end spoiler --

Więc mój kod powinien być znacznie krótszy. Sprawdziłem moje wejściowe rozwiązanie w JSFuck wyszło: „516395 chars” więc na razie wygrywam. (a podobno generatory mają zastąpić programistów...)

@vpiotr
O bardzo ciekawe rozwiązanie,

Pierwszy feature to już 50% rozwiązanego problemu, co ciekawe całkiem inne podejście od mojego i tego z brzydkimi słowami. Ciekawe czy kolejne 50% też uda się bez brzydkich słów.

Drugi feature też bardzo dobry, jakbym go zastosował to może bym skrócił kod o ok 40% (środek butelki mojego kodu) Ciekawe gdzie jest granica między powtarzaniem a wielkością np. słowo „and” się powtarza, ale przy zmiennych bez liter to trudno zaoszczędzić.

Trzeci feature to zasługuje na oklaski na stojąco. Obyło się nawet bez vanillajs nie wspominając o jquery przy odejmowaniu. Trzeba panu pogratulować.

Co ciekawe jak wkleiłem Twój kod w firefox to wyświetlił się tylko jeden wiersz w konsoli, a chrome chciał wydrukować powieść na 100 stron. To pewnie przez funkcję print która robi co innego, w tych środowiskach, niż by się to mogło wydawać. Kto by mógł się tego spodziewać, a np w takim prostym języku jak basic ta funkcja po prostu pisze na ekranie. Jak podmieniłem na console.log to zadziałało.

Ale jak to mówią „podróż jest celem” więc opiszę swoje rozwiązanie w 3 prostych punktach.

--- spoilers ---

  1. Napisać prosty kod wyświetlający piosenkę
  2. pozbyć się liczb
  3. pozbyć się liter

pierwszy punkt napisałem miej więcej tak:

(function bottles() {
    var song = [];  
    for (var i = 99; i >= 0; --i) {
        if (i === 0) {
            song.push('No more bottles of beer on the wall, no more bottles of beer.\n'
                + 'Go to the store and buy some more, 99 bottles of beer on the wall.\n');
        } else if (i === 1) {
            song.push('1 bottle of beer on the wall, 1 bottle of beer.\n' 
                + 'Take one down and pass it around, no more bottles of beer on the wall.\n\n');
        } else {
            song.push(i + ' bottles of beer on the wall, ' + i + ' bottles of beer.\n' 
                + 'Take one down and pass it around, ' + (i - 1) + ' '
                + (i - 1 !== 1 ? 'bottles' : 'bottle') + ' of beer on the wall.\n\n');
        }
    }
    
    return song.join('');  
})();

Resztę może opisze później.

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