Dzień dobry golfiści,
Nasze dzisiejsze wyzwanie jest inspirowane komiksami XKCD 356 i 370 . Napiszemy program do obliczania rezystancji grupy rezystorów. Ostrzeżenie, że jest to prawie wystarczająco trudne, aby uzasadnić wyzwanie kodowe, myślę jednak, że istnieje pewna sztuka pisania nieco bardziej złożonych programów w formacie golfowym. Najniższa liczba znaków wygrywa.
Obliczanie oporu opiera się na dwóch następujących wzorach:
- Jeśli rezystory są szeregowo, rezystancja jest sumą rezystancji każdego rezystora
- Jeśli rezystory są równoległe, rezystancja jest odwrotnością sumy odwrotności rezystancji każdego rezystora
Więc - na przykład:
Twoim zadaniem jest, w jak najmniejszej liczbie znaków, obliczyć opór grupy do 64 rezystorów. Przepraszam za złożoność, szczególnie zasad wprowadzania danych. Próbowałem zdefiniować je w taki sposób, aby każdy język był użyteczny.
Każdy rezystor zostanie podłączony do 2 lub więcej innych rezystorów.
Dane wejściowe są gwarantowane, z jednym wejściem i jednym punktem wyjścia, które się połączą
Sieć będzie szeregowo równoległa, aby nie wymagać więcej matematyki niż to, co jest prezentowane
Dane wejściowe będą dokonywane za pomocą pliku, argumentu lub standardowego wejścia, w zależności od tego, co jest odpowiednie dla twojego języka.
Dane wejściowe będą składały się z szeregu oddzielnych instrukcji nowej linii lub przecinanych do przodu, zawierających liczbę całkowitą rezystancji rezystora oraz spacje oddzielające identyfikatory rezystorów, do których podłączona jest jedna strona rezystora.
Identyfikator pierwszego rezystora będzie wynosił 1, zwiększając się o jeden dla każdego kolejnego rezystora
Początek zawsze będzie miał identyfikator 0
Rezystor końcowy zawsze będzie miał rezystancję 0 omów, a połączenia będą mieć tylko zdefiniowane na swojej linii
Na przykład:
Może być reprezentowany jako
3 0
6 1
1 0
5 0
0 2 3 4
- Wyjściem może być wyjście standardowe lub plik. Może być reprezentowany na jeden z następujących sposobów:
- Liczba z minimum 2 miejscami po przecinku, po której następuje nowa linia
- Ułamek składający się z liczby całkowitej (licznika), ukośnika i innej liczby całkowitej (mianownika), po której następuje nowa linia. Frakcja nie musi być w najniższej formie - na przykład dopuszczalne są 4/4 lub 10/8. Ułamek musi być dokładny w granicach 1/100. Nie ma żadnej premii za bycie idealnie dokładnym - jest to podstawa umożliwiająca konkurowanie językach bez operacji stałych lub zmiennoprzecinkowych.
Mam nadzieję, że obejmuje to wszystkie punkty. Powodzenia!
/
nie jest odwrotnym ukośnikiem. Miałeś na myśli `\ 'lub ukośnik?1 2/1 0/0 1
ważny?Odpowiedzi:
APL 190
Indeks początku 1. Pierwsza pętla (pętle) łączy wszystkie rezystory połączone szeregowo, druga (p) połączona równolegle i powtórzenie do pierwszej pętli, aby połączyć wszystkie równoległe rezystory połączone szeregowo. Specyfikacja końcowego rezystora zerowego wydaje się zbędna.
Przetestowano na przykładach w pytaniu plus nieco bardziej skomplikowany:
źródło
o←⊃↑¨r←¯1↓⍎¨(c≠'/')⊂c
. Ten wzór ma zastosowanie w kilku miejscach.Python, 329 znaków
Oblicza rezystancję, wykonując relaksację napięcia w obwodzie. Najpierw mocuje opornik 1 omów do początku i zmienia ostatni opornik z 0 omów na 1 omów. Następnie ustawia napięcie wejściowe na 0, a napięcie wyjściowe na 1 wolt. Po symulacji przepływu prądu przez sieć rezystancję sieci oblicza się na podstawie spadku napięcia na pierwszym rezystorze 1 om.
Każdemu opornikowi przypisane są dwie liczby: numer lewego zacisku i numer prawego zacisku. Lewy zacisk rezystora r ma wartość 2 * r, a prawy zacisk 2 * r + 1. Dane wejściowe służą do obliczania
S
zestawów zacisków, które są ze sobą połączone. Każdy zacisk otrzymuje napięcie,V[t]
a relaksacja odbywa się poprzez podniesienie napięcia, jeśli prąd płynie do zestawu zacisków, i obniżenie napięcia, jeśli prąd wypływa z sieci.źródło
(To jest komentarz, ale nie mogę robić sztuki ascii w prawdziwym komentarzu ...)
Jak wprowadzono coś takiego?
W szczególności z czym są połączone 3 i 4? 1 lub 2, czy zarówno 1, jak i 2?
źródło