Siedziałeś więc przy biurku i grałeś w program, aby obliczyć pierwsze 20 cyfr pi, a następnie podszedł twój szef i wyrzucił twoje jabłko IIe przez okno. Pracujesz teraz nad nowym projektem, a ten komputer nie ma jeszcze możliwości obsługi tekstu. Żaden. Brak czcionek. Nic.
Teraz zakończmy ten program. Oblicz i wyświetl pierwsze 20 znaków liczby pi bez użycia czcionek, które nie są częścią twojego programu. Twoje dane wyjściowe mogą być wyświetlane lub zapisywane w postaci standardowej jako plik obrazu (jpeg, png, gif, svg (o ile nie używasz żadnych znaków), bmp, xpm). Możesz używać dowolnego języka, ale nie możesz korzystać z funkcji czcionek, wyświetlania tekstu itp.
mały bonus (10 znaków) Jeśli zadziała na Lirze.
Edycja: dla tych, którzy tego nie zrozumieli, moją inspiracją był pierwszy Mac, a tytuł to gra słów. Wielkie uznanie dla @Sukmindera, którego animowany gif jest po prostu fajny. Konkurs się nie kończy, jeśli pojawi się lepsza odpowiedź.
źródło
Odpowiedzi:
Python, 222 znaki
Pierwszy wiersz oblicza cyfry pi przy użyciu przybliżenia
pi-3 ~= 277991633/1963319607
. Następne trzy wiersze generują 20 znaków liczby pi przy użyciu sztuki ASCII Nemeth Braille.Przesuwam tutaj granice w dwóch kierunkach, zarówno w sensie „obliczania Pi”, jak i „czytelności ludzkiej”.
źródło
*
znaki i spacje bez czcionki?*
jak o czarnym pikselu 1x1 i `` jak o białym pikselu 1x1.*
bez użycia czcionek, myślę, że jesteś zdyskwalifikowanyPython, 217 bajtów
Wymaga biblioteki obrazów Python
Liczba bajtów zakłada, że znak ucieczki
\177
jest zastępowany jego dosłownym odpowiednikiem (char 127 ).Dane wyjściowe będą wyglądać następująco (otworzą się w domyślnej przeglądarce * .bmp):
Pamiętaj, że można to łatwo sparametryzować, aby wydrukować dowolną liczbę cyfr, które lubisz. Poniższe zaakceptuje liczbę całkowitą ze standardowego wejścia i wyświetli tyle cyfr:
Wyjście dla n = 80 :
Obliczanie Pi
Tak, to wszystko. Zastosowana formuła jest wynikiem zastosowania transformacji Eulera do serii Leibniza , a następnie uwzględnienia każdego terminu z pozostałej części sumy. Formuła jest zbieżna liniowo; każda cyfra wymaga dziennika 2 (10) ≈ 3,32 iteracji. Dla osób zainteresowanych pochodną, patrz załącznik A.
Pokaz
PIL służy do generowania obrazów, ponieważ jest to najwygodniejsza biblioteka, jaką znam. Tworzona jest pusta czarno-biała bitmapa 141 × 11 , a następnie narysowane są na niej białe linie w sposób siedmiosegmentowy, jeden piksel na raz. Pozycje wymagane do narysowania każdego segmentu są przechowywane w łańcuchu maski bitowej, z bitami odpowiadającymi następującym pozycjom:
Trochę magii
(j%7/5*4-~j%7/4*~j/7+p,j%7*3%14%8+j%14/10+2)
wytwarza każdy piksel w następującej kolejności (podstawa-18):załącznik A
Transformacja Eulera to technika przyspieszania zbieżności, która działa dla dowolnej serii, która wykazuje absolutną zbieżność monotoniczną. Powstała seria będzie zbiegać się liniowo, zwykle z szybkością jednego bitu na termin (zauważ, że jeśli pierwotna seria była już superliniowa, to uzyskana seria faktycznie zbiegnie się wolniej). Opis czysto matematyczny jest nieco trudne do naśladowania, więc będę biorąc podejścia proceduralnego.
Zaczniemy od serii Leibniz:
Następnie podziel każdy termin na pół, łącząc sąsiednie wyrażenia:
Uproszczony:
Uogólnione:
Zauważ, że wiodący ½ nie miał terminu partnera, a zatem został wykluczony z reszty sumy. To jest pierwszy termin serii przekształconej. Aby znaleźć następny termin, powtarzamy ten proces ponownie:
I ponownie:
I ponownie:
I jeszcze raz na wszelki wypadek:
W tym momencie mamy pięć pierwszych terminów, a szósty termin jest oczywisty. To powinno wystarczyć do uogólnienia, więc zatrzymamy się tutaj. Zaczniemy od faktorów liczników i mianowników:
Mianowniki ewidentnie zawierają podwójne silnia z 2n + 1 , więc będziemy łatać, że:
Wszystko pasuje, z wyjątkiem dwóch pierwszych warunków, które mają nierozliczony 2 w mianowniku. Możemy to naprawić, mnożąc całe wyrażenie przez 2 :
2 3 = 2,4 , więc:
Licznik można teraz łatwo zidentyfikować jako n! .
Zauważ, że współczynnik dodawany do każdego kolejnego składnika, n / (2n + 1) , zbliża się do ½, gdy n staje się duży, co sugeruje liniową zbieżność w tempie jednego bitu na termin - jest to w rzeczywistości z założenia. Dobry wynik, ale byłby jeszcze ładniejszy, gdyby nie istniały czynniki. Możemy tutaj odjąć każdy kolejny termin od reszty sumy, co wygeneruje zagnieżdżone wyrażenie:
Można to przepisać jako relację powtarzalności:
Gdzie n liczy się wstecz od ⌈ log 2 (10) · d ⌉ .. 0 , gdzie d jest liczbą wymaganych cyfr.
Ciekawe może być to, że stabilny punkt tego nawrotu wynosi dokładnie 2 (lub 4, jeśli podwoiłeś go, jak mam to w powyższym opisie), więc możesz zapisać kilka iteracji, poprawnie inicjując. Jednak inicjowanie do losowej wartości, której potrzebujesz gdzie indziej, i rzucenie kilku dodatkowych iteracji na górę jest ogólnie tańsze bajtowo.
źródło
p
sięp/2 * x/p + ...
robi .. AIUI Python obsługuje automatyczny awans do BigInteger-owski typu danych, więc nie powinno być precyzyjne rzeczy, ale jakoś tep
s sprawa i nie znoszą się jak mogę sobie wyobrazić je do ... czego tu brakuje?p
zainicjował nieparzyste, więcp/2/p
jest to odpowiednik - w ramach podziału liczb całkowitych - na((p-1)/2)/p
. To produkuje1/3
,2/5
,3/7
, itd terminy pochodzące powyżej.#C - 777 znakówC - 731 znaków
Drukuje GIF do
stdout
.3
.Łączenie GIF-a ze wstępnie skonfigurowanego nagłówka + każda cyfra reprezentowana przez domową (osadzoną) czcionkę 5x5 pikseli.
Pamiętaj, że GIF czasami znika w Chrome po jednym uruchomieniu.
Krótkie wprowadzenie:
Obliczanie PI
Pi jest obliczane przy użyciu nieco zmodyfikowanej wersji implementacji Rabinowitza i algorytmu Wagona do obliczania cyfr π przez Dika Wintera i Achima Flammenkampa.
Generowanie GIF
Obrazy GIF mają
canvas
właściwość w nagłówku. Możemy użyć tego w połączeniu z wyświetlaniem wielu obrazów, ustawiając odpowiednioleft
właściwość dla każdej cyfry - gdzie każda cyfra jest (osadzonym) obrazem samym w sobie.Dokumentacja.
Przykład:
Rozszerzony kod (z mnóstwem komentarzy)
Bałagan, ale to część minimalizacji :
Chciałbym użyć krótszego / innego algorytmu do obliczania π.
źródło
JavaScript, 680 znaków
Można to wyświetlić w przeglądarce internetowej; liczby są wyprowadzane jako ścieżki SVG.
Nie oblicza pi w ciekawy sposób, a JS nie ma typu liczbowego z dokładnością do wyświetlania 20 cyfr.
Aby zapisać znaki, pominąłem dane ścieżki dla „0”, ponieważ nie pojawia się ona w sekwencji.
źródło
Java -
866860857853 znaków, a także oszustwo z 574 znakamiKorzystając ze wzoru Simona Plouffe z 1996 roku, wyświetla
x.png
plik z białymi cyframi cyfrowymi na czarnym tle:To jest skompresowany kod:
To z identyfikacją i niektórymi białymi znakami byłoby:
Oszukując reguły i biorąc pod uwagę, że obliczenia PI można dokonać jako „reprezentację liczbową ciągu 3.1415926535897934384”, można to zmniejszyć do 574 znaków:
źródło
Java -
642622 znakówKopiowanie z mojej poprzedniej odpowiedzi, używając formuły Simona Plouffe z 1996 roku. Zamiast tego generuje ASCII-art:
Wszystko to, z pewnymi identyfikatorami i spacjami oraz odrobiną pomocy czytelnikowi w zrozumieniu znaczenia magicznych liczb:
Wynik:
źródło
C,
253250 znakówPrzybliża liczbę pi przy użyciu algorytmu zawartego w kodzie @ Sukmindera (bezwstydnie pożycza i refaktoryzuje swój kod). Wysyła binarny obraz PBM , który można następnie np. Przekonwertować za pomocą ImageMagick.
Oto, jak wygląda wyjście z moim rendererem PPM opartym na alfabecie Braille'a:
Ma to samo dziwactwo, co odpowiedź @ Sukmindera, ponieważ nie ma separatora dziesiętnego. Ponadto mój wynik jest pionowy, a kwestia, czy jest on czytelny dla człowieka, jest dyskusyjna ...
Edycja: zastosowano sugestie @ ugoren.
źródło
puts
dofor
inicjalizacji, zdefiniujL[5]
i pomiń,0
. Ustawd
parametr namain
(zapisz przecinek).PHP 380
wymaga włączenia gd dla wyjścia obrazu
obliczenia pi: ponieważ podstawowy php ma domyślną precyzję 14 i nie chciałem ponownie kompilować serwera z włączonymi dowolnymi rozszerzeniami dokładności, nie mogłem nawet oszacować PI z wymaganymi miejscami dziesiętnymi, więc zamiast tego oblicza tau / 2, a następnie reszta miejsc po przecinku
ponieważ grafika składa się z zer i jedynek, mogę spróbować użyć WBMP jako formatu, aby sprawdzić, czy mogę usunąć gd
źródło
3x5 with 1 px between chars
. kolor jest czerwony, aby zmniejszyć 4 znaki, ale biorąc pod uwagę, że nie wygram, zmienię go na biały dla czytelnościimagecreate
), pierwsze wywołanieimagecolorallocate
ustawia kolor tła, a drugie jest potrzebne, aby ustawić kolor pisania. więc kończy się dłużejDrukarka C + LaserWriter 599–10 = 589
Przesyłaj dane wyjściowe do LaserWriter! :) To powinno działać na Lisa (z kompilatorem C).
Oblicza
pi
w drukarce, obliczając sumę długości odcinków linii, które przybliżają sekwencję krzywej Beziera, która przybliża półkole podzielone przez średnicę, razy 2.Ungolfed Level-1 (kompatybilny z 1985) PostScript:
Wynik:
źródło
Java,
157426431934 znakówSkompresowane 1934 znaki:
Rozszerzone 2643 znaki:
Metoda Pi zebrana z: /programming/8343977/calculate-pi-on-an-android-phone?rq=1
źródło
throws Exception
wmain
i wyjmowania blok try-catch. Ponadto, można zmienić nazwępi
isqrt
metod orazloc
,args
,SCALE
,x0
ix1
zmienne do 1 identyfikatorów Char. Nawiasem mówiąc , musisz dodać pełną klasę, w tymclass Foo{
deklarację i import.