Wprowadzenie
Chcę zbudować drabinę. W tym celu wyrzuciłem ze złomowiska dwie długie deski z dziurami i chcę w nich umieścić stopnie. Jednak dziury nie są równomiernie rozmieszczone, więc kroki będą trochę niepewne i trudno mi oszacować ilość potrzebnej mi wędki. Twoim zadaniem jest wykonanie dla mnie obliczeń.
Wkład
Twój wkład to dwa wektory bitowe, podane jako tablice liczb całkowitych, które reprezentują dwie tablice. A 0
reprezentuje segment jednego audu ( arbitralna jednostka odległości ) bez otworu, a a 1
reprezentuje segment jednego auda z pojedynczym otworem. Tablice mogą mieć różne długości i zawierać inną liczbę 1
s, ale nie będą puste.
Zbuduję moją drabinę w następujący sposób. Najpierw umieszczam dwie plansze dokładnie jeden dźwięk oddzielnie i wyrównuję ich lewe końce. Dla każdego indeksu i
mierzę odległość między i
th otworem pierwszej deski z i
th otworem drugiej deski, wycinam kawałek pręta i mocuję go między dwoma otworami. Zatrzymuję się, gdy skończą mi się dziury w jednej z plansz.
Wydajność
Twój wynik to łączna ilość pręta potrzebna do wykonania kroków, mierzona w audytach. Dane wyjściowe powinny być poprawne do co najmniej sześciu cyfr znaczących.
Przykład
Rozważ dane wejściowe [0,1,1,0,1,1,1,1,0,0]
i [1,0,0,1,1,1,0,0,1]
. Powstała drabina wygląda następująco:
Całkowita długość pręta w tej drabinie to 7.06449510224598
auds.
Zasady
Możesz napisać funkcję lub pełny program. Wygrywa najniższa liczba bajtów, a standardowe luki są niedozwolone.
Przypadki testowe
[0] [0] -> 0.0
[0] [1,0] -> 0.0
[1,0,0] [1,1,1,1,1] -> 1.0
[0,1,0,1] [1,0,0,1] -> 2.414213562373095
[0,1,1,0,1,1,1,1,0,0] [1,0,0,1,1,1,0,0,1] -> 7.06449510224598
[1,1,1,1,1] [0,0,1,1,0,1,0,0,1] -> 12.733433128760744
[0,0,0,1,0,1,1,0,0,0,1,1,1,0,0,1,0,1,1,0,0,0,1,0] [0,0,1,1,0,1,1,1,0,0,0,0,0,1,1,0,1,1,0,0,0,1] -> 20.38177416534678
Odpowiedzi:
J, 20 bajtów
Używa trick w odpowiedzi MickyT w R .
(<0 1)|:
daje przekątną macierzy. Wyjaśnienia innych części znajdują się w odpowiedzi FUZxxl .źródło
J, 22 znaki
Nie zainspirowany odpowiedzią randomra.
I.
Część jest równa jak to jest oczywiste sposobem znalezienia dziury.I. y
- wszystkie wskaźnikiy
powtórzone tak często, jak odpowiadająca im pozycjay
. Nawiasem mówiąc, jeśliy
jest wektorem wartości logicznych,I. y
zawiera wskaźniki, przy którychy
jest1
. Na przykładI. 1 0 0 1 1 1 0 0 1
daje0 3 4 5 8
.x u&v y
- to samo co(v x) u (v y)
. Stosowane jakox u&I. y
otrzymujemy(I. x) u (I. y)
. Kontynuujmy przekształcone dane wejściowe.x <.&# y
- mniejsza długośćx
iy
.x -/@,: y
- różnica pozycjix
iy
. Jeśli jeden wektor jest dłuższy, jest wypełniany zerami.x $ y
-y
przekształcony do kształtu określonego przezx
. W szczególności, jeślix
jest skalarem,x
elementy są pobierane zy
. W tym zastosowaniux (<.&# $ -/@,:) y
upewnij się, że końcowe dziury są ignorowane.4 o. y
- funkcja%: 1 + *: y
, to znaczy sqrt (1 + y ²). Nawiasem mówiąc, ta funkcja mapuje odległość otworów do długości prętów.+/ y
- suma elementówy
.źródło
Python, 85
Okazało się to podobne do rozwiązania dla komputerów Mac . Konwertuj listy zer i jedynek na uporządkowane listy wskaźników o jednym indeksie, a następnie zsumuj odległość między poszczególnymi elementami.
źródło
J,
3228 bajtówCzasownik
I.
zwraca pozycje1
s w ciągu binarnym, co jest ogromną pomocą.Aby uzyskać lepsze rozwiązanie J, sprawdź odpowiedź FUZxxl .
źródło
R, 67
Używa wartości zewnętrznej, aby zrobić różnicę dla indeksowanych otworów. Diag zwraca wymagane różnice. Następnie zsumuj obliczone odległości
Uruchomienie testowe w skrzypcach R. Owinąłem go nadrukiem, aby pokazać, że zwrot jest zgodny ze specyfikacją.
źródło
a==1
może byća>0
lub!!a
.Haskell,
7773 bajtówZastosowanie:
[0,1,0,1] # [1,0,0,1]
które wyjścia2.414213562373095
Jak to działa: funkcja
r
zwraca listę pozycji otworów w tablicy, np.r [0,1,0,1]
->[2,4]
.#
zamyka dwie z tych list i zamienia je w listę odległości między odpowiadającymi dziurami i na koniec sumuje.źródło
CJam,
3633 bajtówBardzo naiwne podejście ... oczekuje danych wejściowych jako tablic w stylu CJam na STDIN
Oto wiązka testowa dla wszystkich przykładowych danych wejściowych. Wyniki w polu wejściowym są używane przed wywołaniem rzeczywistego kodu. Możesz je usunąć, jeśli mi nie ufasz. ;)
Wyjaśnienie
źródło
Python, 86
Niskopoziomowe i naiwne rozwiązanie rekurencyjne bez przeszukiwania listy.
Listy wejściowe to
a
ib
. Jeśli któryś jest pusty, wróć0
.W przeciwnym razie pozwól
x
iy
bądź ich pierwszymi elementami (kod w rzeczywistości ich nie przypisuje, ponieważ nie możesz wykonywać przypisań wlambda
, ale ułatwi to wyjaśnianie). Jeśli oba mają wartość 1, tzn. Ich iloczyn wynosi 1, to mają wpływ na odległość pręta. Śledzimy odległość w liczbie zespoloneji
, aby odległość była wartością bezwzględną. W rzeczywistości obliczamy to niezależnie, a następnie mnożymy przezx*y
.Potem wracamy. Chodzi o przesunięcie obu list o jeden krok, chyba że jedna lista zaczyna się od 0, a druga od jednego, w którym to przypadku przesuwamy tylko listę 0. W ten sposób jedynki są zawsze konsumowane w parach. Możemy sprawdzić te warunki za pomocą
x<y
iy<x
, ale krócej skorzystać z porównania listy jakoa[:1]<=b
. Na koniec dostosowujemy złożone przesunięcie między bieżącymi elementami ox-y
.źródło
a>[]<b
naa>0<b
. Działa od obu[]
i0
jest fałszywy, więc są równoważne.a:
?([] > []) != ([] > 0)
a w python3 jest to błąd (typy nieuporządkowane).a:
Jest częścią segmentu[b[:1]<=a:]
.Python,
105102100 bajtówCałkiem proste, po prostu konwertuje listy danych wejściowych na listy indeksów otworów, a następnie oblicza odległość między każdą parą takich indeksów.
Przypadek testowy:
Podziękowania dla @FryAmTheEggman za kilka sugestii dotyczących oszczędzania bajtów. Okazuje się, że można to pograć w golfa, jak pokazano w odpowiedzi Xnora .
źródło
enumerate(l)
i0.5
(które może być po prostu .5).l=lambda*a:sum(((a-b)**2+1)**.5for a,b in zip(*map(i,a)))
Pyth, 30 bajtów
Wypróbuj online z danymi wejściowymi
[0,1,1,0,1,1,1,1,0,0], [1,0,0,1,1,1,0,0,1]
.Wyjaśnienie:
Przekonwertować list do listy indeksów
[2, 3, 5, 6, 7, 8]
i[1, 4, 5, 6, 9]
i zip je razem[(2,1), (3,4), (5,5), (6,6), (7,9)]
. Następnie odejmuję wartości, wyrównaj je, dodaję 1 i sumuję wszystkie pierwiastki kwadratowe.Szkoda, że
sum
nie działa na pustych listach.źródło
Python,
116115 bajtówTo jest rozwiązanie rekurencyjne.
Stało się dość irytujące, gdy odkryłem, że
index()
po prostu zgłasza błąd, gdy nie znaleziono żadnej wartości, ale sprawiłem, że zadziałała. Niestety nie mogę użyć lambda. Zirytowało mnie również to, żelist.remove()
nie zwraca listy, ale zamiast tego zwracaNone
.Uruchom online tutaj: http://repl.it/c5L/2
źródło
Klip 3 ,
55 4738W przypadku listy z mniejszą liczbą otworów program dokonuje iteracji przez nią i łączy każdy otwór z odpowiednim otworem drugiej listy. Rozmiary są obliczane i sumowane.
Wyjaśnienie
Jeśli jesteśmy bardzo liberalni w kwestii formatu wejściowego, możemy go zmniejszyć do 36 bajtów, usuwając każdy z nich
k
. Wymaga to wprowadzenia ciąg znaków znaków kontrolnych\0
i\1
.źródło
ECMAScript 6, 86 bajtów
To początkowo zaczęło się od redukcji (chciałem sprawdzić, czy można to zrobić w jednej pętli, w przeciwieństwie do odpowiedzi @ edc65).
Ale używając @ edc65 dla
map
i&&t
aby zwrócić wartość, byłem w stanie dość ją skrócić.źródło
reduce
ma sens bardziej semantyczny, ale poza tym jest to raczej niewygodne w użyciu. Oczywiście, od kiedy golfiści kodu martwili się semantyką.Java, 151
To po prostu idzie w
a
poszukiwaniu tych, a następnie idzie,b
gdy je znajdzie. Jeślifloat
dokładność jest akceptowalna, mogę zaoszczędzić kilka bajtów, ale poszedłemdouble
dopasować wynik testu.Z białymi znakami:
źródło
JavaScript (ES6) 108
Głównym punktem jest funkcja f, która odwzorowuje wejściowe tablice 0..1 w tablicach pozycji otworów. Następnie tablice są skanowane, obliczając całkowitą długość prętów za pomocą twierdzenia pitagorejskiego.
|0
Pod koniec jest potrzebny do Nans przekonwertować mogą wyniknąć, gdy kierowca array (pierwszy) jest dłuższa niż sekundę.Przetestuj w konsoli Firefox / FireBug
źródło
Oktawa,
605942źródło
Perl 98
Czytelny:
Testowanie:
źródło
APL,
3528 bajtówUżywa algorytmu podobnego do rozwiązania J, ale APL ma mniej wbudowanych funkcji.
Przykładowe dane wejściowe:
źródło