Aktualizacje: Usunięto limit czasu. Musisz umieć opisać wynik - patrz nowa reguła.
Pangram jest zdanie, że wykorzystuje każdą literę w alfabecie przynajmniej raz, takie jak:
Idealny pangram wykorzystuje każdą literę dokładnie raz.
Rozważ napisanie programu, który jest idealnym pangramem, używając 95 alfabetu znaków drukowalnych ASCII (kody szesnastkowe od 20 do 7E) jako alfabetu:
!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~
Taki program musi zawierać dokładnie 95 znaków, przy czym każdy znak ASCII do wydruku występuje dokładnie raz, ale w dowolnej kolejności. (Zatem istnieje 95! = 1,03 × 10 148 możliwości.)
Twoim zadaniem jest napisanie tego programu w taki sposób, aby liczba drukowalnych znaków ASCII drukowanych na standardowym wyjściu była jak najwyższa (tj. Płodna).
Twój wynik to liczba drukowalnych znaków ASCII, które program wypisuje ( łączna kwota, a nie liczba odrębna : AABC
wyniki 4, a ABC
wyniki 3) . Najwyższy wynik wygrywa.
Detale
- Wynik może zawierać dowolne znaki (w tym duplikaty), ale tylko wystąpienia 95 drukowanych znaków ASCII liczą się do wyniku.
- Za pomocą tego JSFiddle można policzyć liczbę drukowalnych znaków ASCII w dowolnym ciągu.
- Jeśli twój język nie ma standardowego, użyj najbardziej odpowiedniej alternatywy.
- Twój program ...
- musi mieć skończony czas wykonywania (limit czasu został usunięty)
- musi mieć skończoną wydajność
- może zawierać komentarze
- musi się kompilować i uruchamiać bez (nieprzechwyconych) błędów
- nie może pytać ani wymagać danych wejściowych
- muszą być niezmienne w czasie i deterministyczne
- nie wolno używać bibliotek zewnętrznych
- nie może wymagać połączenia sieciowego
- nie wolno wykorzystywać plików zewnętrznych
- (możesz użyć samego pliku programu, o ile zmiana nazwy pliku nie zmienia zachowania programu)
- Jeśli to zadanie jest niemożliwe, to jest jakiś zły język.
- Musisz podać dokładny wynik lub dokładnie go opisać, jeśli jest zbyt duży, aby zmieścił się w poście . W rzeczywistości nie musisz uruchamiać programu. Tak długo, jak będzie działał przez określony czas na komputerze z nieograniczoną ilością pamięci, jest poprawny.
Przykład
Ten uproszczony program w języku Python 2 jest możliwym rozwiązaniem:
print 9876543210#!"$%&'()*+,-./:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghjklmoqsuvwxyz{|}~
Wyprowadza, 9876543210
który zawiera 10 znaków ASCII do wydrukowania, co daje wynik 10.
źródło
a
sześć biliardów razy, w których nie jest nawet możliwe uzyskanie dokładnej górnej granicy liczba znaków. W każdym razie nadal jestem dumny z mojego 95, nawet jeśli jest trochę mały. Rozmiar to nie wszystko, wiesz.Odpowiedzi:
GolfScript, ponad 2 ↑↑↑ (9871 ↑↑ 2) znaki
Wyświetla liczbę całkowitą. Skorzystaj z nieograniczonej wielkości rejestru procesora (która określa maksymalną długość łańcucha w Rubim), pamięci i czasu działania. Kanał służy wyłącznie do odczytu.
Kod
Wynik
Zdefiniuj b = 9871 ↑↑ 2 (patrz notacja Knutha w górę ).
.? wykonuje f: x ↦ x ↑ x .
Blok wewnętrzny wykonuje g: x ↦ f x (x) .
Ponieważ f (x) = x ↑ x = x ↑↑ 2 , f 2 (x) = (x ↑ x) ↑ (x ↑ x)> x ↑ x ↑ x = x ↑↑ 3 ,
f 3 (x) = ((x ↑ x) ↑ (x ↑ x)) ↑ ((x ↑ x) ↑ (x ↑ x))> (x ↑ x ↑ x) ↑ (x ↑ x ↑ x)> x ↑ x ↑ x ↑ x = x ↑↑ 4 i tak dalej, mamy
g (x)> x ↑↑ (x + 1)> x ↑↑ x .
Blok zewnętrzny wykonuje h: x ↦ g b (x) .
Ponieważ g (x) = x ↑↑ x = x ↑↑↑ 2 , g 2 (x) = (x ↑↑ x) ↑↑ (x ↑↑ x)> x ↑↑ x ↑↑ x = x ↑↑↑ 3 ,
g 3 (x) = ((x ↑↑ x) ↑↑ (x ↑↑ x)) ↑↑ ((x ↑↑ x) ↑↑ (x ↑↑ x))> (x ↑↑ x ↑↑ x) ↑ (x ↑↑ x ↑↑ x)> x ↑↑ x ↑↑ x ↑↑ x = x ↑↑↑ 4 i tak dalej, mamy h (x)> x ↑↑↑ (b + 1) .
Zaczynamy od liczby całkowitej 2 na stosie, więc kod oblicza h (2)> 2 ↑↑↑ (b + 1).
Wynik to liczba cyfr dziesiętnych h (2) , czyli log (h (2)) + 1> log (2 ↑↑↑ (b + 1))> 2 ↑↑↑ b .
Zatem wynik jest większy niż 2 ↑↑↑ (9871 ↑↑ 2) .
2 ↑↑↑ n rośnie w absurdalnym tempie, gdy n rośnie . 2 ↑↑↑ 4: = 2 ↑↑ 2 ↑↑ 2 ↑↑ 2 = 2 ↑↑ 2 ↑↑ 4 = 2 ↑↑ 65536 , która jest prawostronną wieżą mocy 65536 kopii 2 :
Podobnie, 2 ↑↑↑ 5: = 2 ↑↑↑ (2 ↑↑↑ 4) , czyli wieża mocy 2 ↑↑↑ 4 kopie 2 .
Teraz wynik nie wynosi 2 ↑↑↑ 4 lub 2 ↑↑↑ 5 , jest większy niż 2 ↑↑↑ b , gdzie b> 2 × 10 39 428 . To duża liczba ...
źródło
in `*': bignum too big to convert into `long' (RangeError)
.Perl, 70 * 18446744073709551615 * 10 ^ 987654320
Wydajność:
powtórzone 18446744073709551615 * 10 ^ 987654320 razy.
$[
jest domyślnie0
, więc~$[
jest równoważne z18446744073709551615
.Na marginesie zabrakło mi pamięci, próbując utworzyć numer
10^987654320
.Stara odpowiedź (7703703696):
Dane wyjściowe to:
powtórzone 98765432 razy.
Uwaga: Uruchom wszystkie próbki za pomocą
perl -Mbignum -E
źródło
perl -E'say qw{m}x(9876543210*ord$")'
Bash + coreutils, 151 888 888 888 888 905 (1,5 * 10 ^ 17)
Wysyła liczby całkowite od 1 do 9x10 15 , po jednej w wierszu. Zabiera dużo czasu.
Dlaczego
9E15
? Okazuje się, że GNUseq
wydaje się używać 64-bitowych liczb zmiennoprzecinkowych (podwójnych) wewnętrznie. Największa liczba całkowita, jaką możemy reprezentować w tym typie, zanim przyrost o jeden przestanie działać z powodu braku precyzji, to 2 53 lub 9007199254740992. Najbliżej tego możemy uzyskać z notacją wykładniczą 9E15 lub 9000000000000000.Aby obliczyć wynik, używam sumowania wszystkich liczb z podaną liczbą cyfr i dodawania 9E15, ponieważ między każdą liczbą jest nowa linia:
Mógłbym przesłać dane wyjściowe
od
o dodatkowy rząd wielkości, ale to znacznie utrudnia obliczanie wyniku.Odpowiedź przed zmianą reguły:
Bash + coreutils, 18 926 221,380
Wyjścia 1 do 1592346780. Na moim MacBooku z połowy 2012 roku (który nie jest tak daleko od powiązanego testu porównawczego), zajmuje to około 9m45.
Nie mogłem się oprzeć zoptymalizowaniu go trochę bardziej, chociaż to chyba nie ma sensu.
Wydajność:
źródło
seq 9876543210;
?9876543210
. Możesz przeczytać nową ostatnią regułę.GolfScript, ≈ 3 * 10 ^ (2 * 10 ^ 7) tj. ≈ 3x10 20000000
Jak to działa
Oto
X
liczba znaków (długość) reprezentacji ciągu tablicy,[0, 1, 2..,(87^9654321) - 1]
która będzie podobna[0 1 2 3 4 ... (87^9654321) - 1]
PróbujęX
tu obliczyć , aby znaleźć swój wynik.(87^9654321) - 1
jest w przybliżeniu10^(10^7.272415829713899)
z18724742
cyfr dziesiętnych.X
jest mniej więcej3*10^(2*10^7)
takX*X
samo jest również tylko. Zauważ, że te wartości są na bardzo niższej stronie, ponieważ ze względu na ograniczenia obliczeniowe (nawet) wolframa , nie byłem w stanie obliczyć,sum (floor(log10(x)) + 1) for x = 1 to (87^9654321 - 1)
która jest prawdziwa wartośćX
źródło
87 9654321?
jest sprawiedliweInfinity
.2**(2**64)-1
dla 64-bitowego Ruby.MATLAB, 95
Kod
Wydajność
Dane wyjściowe zawierają wszystkie określone znaki ASCII, każdy dokładnie raz i w kolejności.
źródło
Ruby, 89
Wydajność:
Zawiera wszystkie znaki ASCII z wyjątkiem
p
,,
%
,q
,{
, i}
.źródło
GolfScript, 93
Wydajność:
Zawiera wszystkie znaki ASCII oprócz
"
i'
.źródło
"
ani'
jednego, ani drugiego.#
z jego aktualnej pozycji i dołączyć#"'
do końca. Wynik spadnie jednak o jeden.Golfscript - 27 * 2 6543 9870
To moje pierwsze zgłoszenie do Golfscript! :)
Wyjaśnienie:
Dane wyjściowe to ładunek list liczb. Rozważ następujący kod:
Dzięki
12,
niemu powstaje następująca tablica:Strzałka wsteczna zamienia to w ciąg, przekazując do bloku
{.+}
. To powiela ciąg, a następnie konkatenuje oba, tworząc:1*
Mówi interpreter do wykonania poprzedniego czasu jednego bloku (2 1 = 2).Opierając się na tym:
Wysyła wynik
12,`
2 n razy.źródło