To była zabawa! Jednak z trzema cyframi zabawa skończyła się zbyt wcześnie. To wyzwanie jest podobne, ale będziemy kontynuować zabawę.
Wyzwanie
Wydrukuj jak najwięcej cyfr Golden Ratio φ. Złoty współczynnik jest definiowany jako liczba, która spełnia φ = (φ + 1) / φ, a pierwszych 100 cyfr podaje:
1.6180339887498948482045868343656381177203091798057628621354486227052604628189024497072072041893911375 ...
Wyzwanie to nie dotyczy komputerów φ! Chodzi o wydrukowanie jak największej liczby cyfr bez użycia metody podwójnego wykonania tej czynności. Znajdź więc tyle kreatywnych sposobów na zdobycie swoich cyfr, ile możesz!
Ograniczenia
Samo drukowanie cyfr φ byłoby nieco zbyt proste, więc oto zasady:
- Musisz konstruować liczbę w kolejności od lewej do prawej , drukując ją kawałek po kawałku lub konstruując ciąg znaków od lewej do prawej i drukując go na końcu - możesz nawet wygenerować tablicę cyfr, a następnie połączyć wydrukuj, o ile zrobisz to po kolei. W poniższych regułach „print” i „output” mogą odnosić się do dowolnego z tych procesów (np. Jeśli budujesz ciąg, a ciąg zawiera
1.6
to, co1.6
już zostało wydrukowane). - W przypadku kodu otrzymujesz budżet 15 znaków na cyfrę . Okres ten nie wlicza się do tego budżetu, ale również musi zostać wydrukowany. Pamiętaj, że ograniczenie dotyczy tylko całkowitego rozmiaru kodu: możesz użyć więcej niż 15 znaków na dowolną cyfrę, o ile średnio nie używasz więcej. W rzeczywistości możesz narastać „dług” w postaciach i „spłacać” później. Np. Do wydrukowania
1.618
masz 60 znaków. - Biblioteka standardowa zawiera / importy nie liczą się do rozmiaru kodu. Ale nie możesz za darmo podać tych skrótów!
- Nie wolno używać cyfr, które obecnie generujesz, ani cyfr, które już wydrukowałeś. Np.
1
Może pojawić się nigdzie w kodzie źródłowym, ponieważ jest to pierwsza cyfra. Kod, który wyprowadza8
in1.618
może stosować dowolne lub wszystkie cyfry[0234579]
, ale żadna[168]
. W tym celu wszystkie literały, które są równoważne pojedynczej cyfrze, są traktowane jak ta cyfra . Więc jeśli twój język może reprezentować,9
ponieważ'\t'
nie możesz go używać nigdzie, gdzie nie możesz go użyć9
. - Nie wolno tworzyć wielu cyfr jednocześnie. Powinno być możliwe wyraźne podzielenie kodu na części generujące jedną cyfrę na raz.
Nie wolno odwoływać się do żadnej wbudowanej funkcji, operatora matematycznego / logicznego / bitowego / łańcucha, zmiennej lub stałej, które zostały użyte w kodzie, który wygenerował wcześniejszą cyfrę. Wyjątek stanowią funkcje konwersji liczb całkowitych na ciąg, konkatenacja ciągów i funkcje drukowania, które mogą być potrzebne dla każdej cyfry. Zauważ, że nie ma znaczenia, jaką nazwą odwołujesz się do jakiejkolwiek wbudowanej: tylko dlatego, że masz alias wbudowanej
PI
do obup
iq
nie oznacza, że możesz użyćp
raz iq
raz. Podobnie, są dopuszczone do używania nazwy dwukrotnie, jeśli odnosi się do dwóch różnych wbudowanych wtyczek, jak strunylength
i tablicylength
.Jeśli twój język programowania nie ma funkcji, dokonaj najlepszego osądu co do jego odpowiednika - np. W przypadku skryptów bash, wywoływanie innych programów powinno być zgodne z regułami nałożonymi na funkcje
- Twoje zgłoszenie musi być napisane w jednym języku. Więc nie trzeba wykonywać interpretera innego języka, aby uzyskać dostęp do wbudowanych również w tym języku.
Implikacje
Powyższe zasady implikują następujące punkty, ale dodaję je tutaj, aby uniknąć pytań, które już pojawiły się w piaskownicy:
- Nie wolno nadpisywać części danych wyjściowych, drukując niektóre odstępy (zwykle
'\b'
) pomiędzy nimi. - Pętle generujące / wysyłające wiele cyfr są zabronione. (Pętle obliczające jedną cyfrę są jednak w porządku.)
- Używanie zaciemnionej wersji
(1 + √5)/2
lub dzielenie liczb Fibonacciego w celu uzyskania więcej niż jednej cyfry jest zabronione. - Nie można wstępnie obliczyć 10 cyfr i zapisać ich w 10 zmiennych, a następnie po prostu odwołać się do nich, ponieważ odniesienia do zmiennych nie generują cyfry - robi to kod wypełniający zmienną, więc jest to naruszenie reguły 6.
- W rzeczywistości nie można ponownie użyć żadnych poprzednich (lub wyników pośrednich), ponieważ oznaczałoby to, że dwie cyfry współużytkują kod do wygenerowania .
- W przeciwnym razie możesz użyć dowolnych środków (które nie muszą być czysto matematyczne), aby wygenerować cyfry. (I powinieneś!)
- W rzeczywistości nie trzeba niczego obliczać, jeśli można wyciągnąć prawidłowe cyfry z wielu różnych miejsc przy użyciu standardowej biblioteki.
- Państwo może użyć odpowiedniego operatora wielokrotnie podczas generowania pojedynczej cyfry, więc
2+2+2
jest uczciwa gra wygenerować pierwszy6
(choć to mało prawdopodobne, najkrótsza). - Państwo może użyć dowolnego dosłownym tak często, jak chcesz, ponieważ nie są one wbudowane w stałych. Tak długo, jak nie musisz drukować
5
, możesz tyle5
s w swoim kodzie, ile chcesz. - Nie można na stałe zakodować wyniku, ponieważ wymagałoby to użycia cyfr, które są wyprowadzane.
W skrócie: nie używaj żadnej metody generowania cyfr dwa razy i nie używaj cyfry, którą obecnie wyprowadzasz lub któraś już wydrukowała.
Jeśli zauważysz lukę, która pozwala uzyskać (quasi-) nieskończony wynik, nie rujnuj wyzwania, wykorzystując go, ale daj mi znać, żebym mógł sprawdzić, czy luki można naprawić bez zerwania czegokolwiek.
Punktacja
Program, który poprawnie drukuje największą liczbę cyfr, wygrywa. W przypadku remisu krótszy kod zrywa remis.
Dodaj nieskomentowaną wersję, która określa, która część kodu generuje którą cyfrę.
PS: Jeśli ktoś przekroczy 100 cyfr powyżej, oto kilka innych .
źródło
x = (x+1)/x
(lubx^2 = x+1
) (lubx^2-x+1
).Odpowiedzi:
PHP, 100 cyfr
Prawdopodobnie tutaj trochę naginam reguły, ale PHP ma dziesiątki stałych do wyboru:
To prawdopodobnie nie jest zbyt przenośny kod, ale działa dobrze w moim systemie. Oto kod, który go wygenerował:
źródło
<?for(;;);
zużywa 9 MB pamięci. Teraz wiem, dlaczego ... Podoba mi się narzucone przez @ kernigh ograniczenie # 7, które zamyka tego rodzaju lukę. Ponadto, ile jest warte, dane wyjściowe w moim systemie są następujące: codepad.org/wSrtJBcoPerl - 37 cyfr
Obecnie 392 bajty (10,6 na cyfrę).
Wydajność:
Narzucone ograniczenia
Dodałem kilka dodatkowych ograniczeń, aby ograniczyć korzystanie z funkcji językowych, które trywializowałyby problem. Na przykład dereferencja tablicy
@{...}
i indeks końcowy tablicy$#{...}
są używane tylko raz. Każda macierz używana jest wytwarzana w różny sposób (porównaj[c,c,c,c]
,[b..j]
,split('',$~)
,map(glob,"{,,,}{,}")
). Ponadto żaden symbol ani słowo nie jest używane więcej niż jeden raz, chociaż jest to wyraźnie dozwolone w opisie wyzwania. Myślę, że to dobry pomysł dla Perla (lub dowolnego języka ze specjalnymi zmiennymi typu int-only (czy są jeszcze jakieś inne?)), Ponieważ ogranicza liczbę niejawnych konwersji int.Kawałki
źródło
Python 2.7, 19 cyfr, 231 odpowiednich znaków
źródło
Ruby 2.1 dla 54 cyfr, 808 znaków
Ten program działa z
ruby 2.1.0p0 (2013-12-25 revision 44422) [x86_64-openbsd]
. Systemy inne niż OpenBSD 5.5 mogą mieć różne wartości dla kilku cyfr.Interpretacje
Ograniczenia tego wyzwania, szczególnie ograniczenie 6, nie są precyzyjne dla Ruby. Dodaję więc własne interpretacje:
$<.fileno
, a podwójny dwukropek otrzymuje stałe, jak wIO::LOCK_NB
. Nazwa metody lub stałej jest częścią operacji. Ponieważ()
.
::
nie są operatorami, nie stosuję wobec nich ograniczenia 6. Mogę ich ponownie użyć do wygenerowania większej liczby cyfr.Array#count
iEnumerable#count
nie są tą samą funkcją dla ograniczenia 6. Obie metody działają tak samo, aleArray#count
zastępująEnumerable#count
inną implementacją. Jeśli użyjęArray#count
do wygenerowania jednej cyfry, mogę użyćEnumerable#count
do wygenerowania innej cyfry.Mutex.new
,Random.new
,Time.new
i tak dalej odnoszą się do tej samej metodyClass#new
. UżywamSignalException.new
do generowania jednej cyfry. Z powodu ograniczenia 6 nigdy więcej nie mogę użyćClass#new
.Float
iIO
są stałymi! UżywamIO::LOCK_NB
do generowania jednej cyfry. Z powodu ograniczenia 6 nigdy więcej nie mogę użyćIO
. Ta interpretacja wiąże tylko Ruby, a nie inne języki, w których nazwy pakietów nie są stałymi.[]
{}
//
''
. Zawsze mogę używać takich literałów do generowania większej liczby cyfr.File::APPEND
iIPSocket::LOCK_UN
są to dwie nazwy dla tego samego numeru 8. Ograniczenie 6 mówi: „nie ma znaczenia, jaką nazwą odwołujesz się do żadnego wbudowanego”. PonieważFile::APPEND
iIPSocket::LOCK_UN
różnią się tylko nazwą, muszą być tej samej stałej, więc nie mogę ich używać dla dwóch cyfr.$SAFE
jest wbudowaną zmienną globalną, a nie funkcją, operatorem, stałą ani literałem.$SAFE
ma wartość 0. Dzięki luce mogę ponownie użyć$SAFE
do wygenerowania każdej cyfry 0 w programie. Zamykam lukę, interpretując ograniczenie 6, aby również ograniczyć zmienne globalne.Komentarze
Pierwsza linia to
#!ruby -rdate -rdigest -ropenssl -rprime -rset -rsocket
. Ruby analizuje tę linię i ładuje sześć części swojej standardowej biblioteki, jakby przezrequire 'date'
,require 'digest'
i tak dalej. Nie liczę tych 56 znaków, ponieważ ograniczenie 3 zwalnia „standardowe importowanie / dołączanie bibliotek”.Reszta programu wywołuje
print
długą listę argumentów, aby przekonwertować je na ciągi znaków i wydrukować je w kolejności. Argumenty są następujące:1
from2/2
: Division Fixnum # /.
from?.
: dosłowny ciąg jednoznakowy6
from9-3
: odejmowanie Fixnum # -1
from3&5
: bitwise i Fixnum # &3
ponownie.8
z2*4
: mnożenie Fixnum # *0
from2^2
: bitwise exclusive-or Fixnum # ^3
od7%4
: moduł Fixnum #%3
od55>>4
: prawy shift Fixnum # >>9
od5+4
: dodatek Fixnum # +8
od2<<2
: lewy shift Fixnum # <<8
z-~7
: negacja uzupełnienia Fixnum # - @ Fixnum # ~7
from5|2
: bitwise lub Fixnum # |4
from2**2
: potęgowanie Fixnum # **9
from(2r+2+5).to_i
: wymierne dodanie Rational # + Rational # to_i2r
są nowe w Ruby 2.1.2r+2
wywołuje Rational # + i zwraca inny wymierny;2r+2+5
wywołuje ponownie Rational # + .2/1
i unosi się jak2.0
. Aby to naprawić, przeliczam na liczbę całkowitą: to_i zaokrągla w kierunku zera, sufit zaokrągla w górę, podłoga zaokrągla w dół.8
from(2.2+5).ceil
: float add Float # + Float # ceil()
i kropki.
ponownie.9
from(55r/5-2).floor
: racjonalny podział i odejmowanie Rational # / Rational # - Rational # floor4
from(2.2*2).to_i
: float mnożenie Float # * Float # to_i8
from(2r*2*2).ceil
: wymierne mnożenie Rational # * Rational # ceil4
from(2.2**2).floor
: racjonalne potęgowanie Rational # **8
od2.to_bn<<2
: lewy shift z dużą liczbą OpenSSL Fixnum # do_bn OpenSSL :: BN # <<2
from__LINE__
: stała magiczna dla bieżącego numeru linii0
from$<.to_i
: deskryptor pliku standardowego wejścia IO # to_i4
fromIO::LOCK_NB
: flaga blokady pliku nie blokującejIO
. Zgodnie z interpretacją 7 nie mogę już używać żadnej stałej o wartości 4.5
odErrno::EIO::Errno
: numer błędu wejścia / wyjścia8
fromFile::APPEND
: flaga, aby dołączyć do plikuIO
, aleFile
dziedziczy stałeIO
, więcFile::APPEND
jest inny sposób na uzyskanieIO::APPEND
.6
from'aaaaaa'.size
: długość ciągu String # size8
from?a.encoding.name.sub(/\D+/,'')
: część nazwy kodowania Ciąg # kodowania Kodowanie # nazwa Ciąg # sub3
from%w[a a a].size
: długość tablicy Array # size4
from%w[a b c d].to_set.size
: liczba elementów w zestawie Array # to_set Set # size3
from%w[a a a].count
: count all elements Array # count6
odSocket::AF_NS
: numer dla rodziny adresów NS5
odDate.jd(Date::ITALY).wday
: numer dnia tygodnia w piątek 15 października 1582 r., kiedy Włochy przeszły na kalendarz gregoriański Data :: jd Data # wday6
od*Digest::MD5.digest(?j).scan(/\d/)
: pierwsza cyfra ASCII w binarnym skrócie MD5 podsumowania „j” Digest :: MD5 :: digest String # scan*
Przechodzi elementy tablicy jako argumentyprint
. Ta tablica to [„6”].3
fromSet[?a,?b,?c].count
: count all elements Set :: [] Enumerable # count8
fromSignalException.new('FPE').signo
: numer SIGFPE Class # new SignalException # signo1
zFloat::ROUNDS
: tryb zaokrąglania, tutaj 1 dla zaokrąglania do najbliższego1
frombegin
(nowa linia)exit false
(nowa linia)rescue Object
(nowa linia)$!.status
(nowa linia)end
: status wyjścia w przypadku niepowodzeniaSystemExit.new(false).status
, ale zgodnie z interpretacją 3 nie mogę już nazywać klasy # nowa . Zamiast tego podnoszę i ratuję SystemExit.7
fromProcess::RLIMIT_NPROC
: numer limitu zasobów dla liczby procesów dla jednego użytkownika7
od:aaaaaaa.size
: długość symbolu Symbol # rozmiar2
odPrime.first
: pierwsza liczba pierwsza Wyliczalna # pierwsza0
from?/.next
: następny ciąg po „?” Ciąg # następny3
from{a:p,b:p,c:p}.size
: długość skrótu Hash # rozmiar String # p0
fromSTDIN.lineno
: aktualny numer linii dla standardowego wejścia IO # lineno$<
. UżywamSTDIN
. Różnica polega na tym, że$<
jest to zmienna globalna iSTDIN
jest stała. Program może$<
mieć inne wejście, aleSTDIN
zawsze ma oryginalną wartość$<
.3
od?a.crypt('at')[/\d/]
: pierwsza cyfra ASCII w zaszyfrowanym haśle String # crypt String # []0
from{a: :a}.find_index([:a,:a])
: indeks pierwszego klucza: a, wartość: a w haszu Enumerable # find_index9
from/b/=~'aaaaaaaaab'
: indeks, gdzie ciąg pasuje / b / Regexp # = ~1
from[?a,?b].index(?b)
: indeks pierwszego „b” w tablicy Array # index7
from:aaaaaaab=~/b/
: indeks, w którym symbol pasuje / b / Symbol # = ~9
from?\t.ord
: wartość ASCII karty „\ t” String # ord8
from'aaaaaaaab'=~/b/
: indeks, gdzie ciąg pasuje / b / String # = ~0
fromopen(?/).pos
: pozycja w pliku po otwarciu katalogu głównego „/” jako plik Jądro # otwórz IO # pos5
from'aaaaab'.index(?b)
: indeks pierwszego „b” w ciągu String # index7
from?\a.bytes{|b|break b}
: wartość ASCII alertu „\ a” Ciąg # bajtów6
from'aaaaaaa'.rindex(?a)
: indeks ostatniego „a” w ciągu String # rindex2
from%w[a a].map.size
: rozmiar modułu wyliczającego, który odwzorowuje z tablicy Array # map Enumerator # sizeźródło
new
naprawdę zawsze nazywa to samo wdrożenie, czy też jest nadpisywane w podklasach? [ctd.]Java, 21 cyfr, 276 znaków
źródło
7-4
i-4+7
, to sprytne! :)7
nie jest stałe, ale dosłowneRubinowy, 74 znaki, 10 cyfr
To tylko początek; Muszę iść, więc poprawię to później.
Mam 76 znaków zapisanych na później, kiedy będzie trudniej!
źródło
Rubinowy, 17 cyfr, 168 bajtów
Nie golfowany:
Nie byłem jeszcze zmuszony do robienia czegokolwiek szczególnie sprytnego, mogę wrócić i dodać cyfry.
źródło
succ
inext
są pseudonimami.$.
dwukrotnie. Chociaż muszę kochać$....
: DGolfscript , 17 cyfr
Prosta próba. Golfscript może mieć wiele niealfanumerycznych wbudowanych jednoliterowych znaków, ale nie ma wielu wbudowanych jako całości!
źródło
5,)\; # range, right uncons, flip, and pop
.Bash, 5 cyfr w 65 znakach
Niedługo to zaktualizuję! Na razie po prostu drukuje
1.6180
i nie zawiera żadnych cyfr.Wyjaśnienie
Do wygenerowania cyfr stosuje się następujące metody:
1: status wyjścia z
false
6: długość sznurka
1:
nl
nadużycie8:
kill
numery sygnałów0: wartość liczbowa pustego wyrażenia
źródło
Mathematica
98 cyfr, w868378 znaków.Wydajność:
źródło
#
z dozwolonego cyfry i upuszczając jeden z myślnikami.Julia - 23 cyfry po 345 znaków (dokładnie 15 na cyfrę)
Wyjście: 1,6180339887498948482045
Zinterpretowałem znaki i łańcuchy jako użyteczne, o ile nie użyłem ponownie określonego znaku lub łańcucha (znaki w łańcuchu mogą być ponownie użyte, o ile łańcuch nie był); nie pozwoliłem sobie jednak na bezpośrednie użycie wartości int postaci. Jest jeden znak spoza ASCII (©).
W bardziej czytelny sposób (nie rzeczywisty kod):
źródło
C ++ 12,4 znaków na linię, po 14 znaków na każdą cyfrę
Naprawiono mój błąd ponownego wykorzystywania operatorów.
Nie jesteś pewien, czy używanie takich znaków jest takie jak literały char, czy nie? Jeśli ten kod jest akceptowalny, może być kontynuowany na zawsze, a dług char zostanie spłacony.
źródło
-
operatora. Podoba mi się również sposób liczenia komentarza dla długości linii. : D1
do produkcji0
(który jest niedozwolony, ponieważ1
pojawił się wcześniej w złotym stosunku). Musisz także policzyć#define S
(nie ten drugi), ponieważ nie jest to dołączenie, ale po prostu zdefiniowanie skrótu alias.