Podobne liczby
Dwa prostokąty są podobne, jeśli proporcje ich boków są takie same.
Rozważ te dwa prostokąty; prostokąt o wysokości 5 linii i szerokości 11 znaków:
===========
===========
===========
===========
===========
i prostokąt o wysokości 10 linii i szerokości 22 znaków:
======================
======================
======================
======================
======================
======================
======================
======================
======================
======================
Te kształty są podobne, ponieważ proporcje ich boków są takie same. Ujmując to formalnie (gdzie jest najkrótszym bokiem, a najdłuższym bokiem):
Możesz także:
Wyzwanie
Napisz program lub funkcję, która pobiera „główny” prostokąt oraz niektóre „inne” prostokąty i drukuje, które z „innych” są podobne do „głównych”.
Dane wejściowe
Kształt i lista kształtów. Każdy kształt składa się z 2 niezerowych dodatnich liczb całkowitych, które oznaczają szerokość i wysokość prostokąta. Na przykład:
(4,2), (3,9)
oznacza dwa prostokąty, 4x2 i 3x9. Dokładny format danych wejściowych może być dowolny.
Wyjście
Wskaźniki „innych” kształtów podobnych do „głównych”. Możesz wybrać, czy indeksy będą oparte na 0 czy 1, a także dokładny format i kolejność danych wyjściowych.
Przykładowy program
W Pythonie:
main = eval(raw_input()) # The main rectangle.
rects = eval(raw_input()) # The list of rectangles.
similar = set()
for i, rect in enumerate(rects):
if max(main)*min(rect) == min(main)*max(rect): # Cross-multiply
# They are similar.
similar.add(i)
print similar
Przykładowe wejście i wyjście
Wkład:
(1, 2)
[(1, 2), (2, 4)]
Wydajność:
set([0, 1])
Wkład:
(1, 2)
[(1, 9), (2, 5), (16, 8)]
Wydajność:
set([2])
Zwycięski
To jest golf golfowy, więc wygrywa najkrótsza przesyłka.
Notatki
- Powinno to być oczywiste, ale standardowe luki są zabronione .
- Nie można używać wbudowanych do lokalizowania podobnych liczb. (Nawet nie wiem, czy to istnieje, ale nie byłbym zaskoczony!)
źródło
[1.0 2.0]
akceptowalny format wejściowy?[(1,2), (2,4), (1,9), (2,5), (16,8)]
jest tylko[0,1,4]
i[1,2,5]
dozwolone”, czy możemy również generować dane wyjściowe[1,1,0,0,1]
lub[(1,2), (2,4), (16,8)]
?Odpowiedzi:
Pyth, 15 bajtów
źródło
Python, 61 bajtów
Tak, używam do wydania 9 znaków
enumerate
. Przyjmuje dane wejściowe jak1, 2, [(1, 9), (3,6), (2, 5), (16, 8)]
. W Pythonie 2 wartości wejściowe należy zapisać jako zmiennoprzecinkowe.O jeden znak dłużej (62) w Pythonie 3:
źródło
i
jako indeks i(x,y)
jako punkt. Następnie sprawdza, czy wartośćx/y
jest albo równa ilorazowi pierwszych dwóch liczb (a/b
), czy jego odwrotności (b/a
). Jeśli jest równa jednej z tych wartości, wartość tai
jest dodawana do listy, w przeciwnym razie jest odrzucana.CJam,
222019 bajtówPowyżej jest anonimowa funkcja, która wyrzuca pojedynczą tablicę par zmiennoprzecinkowych (pierwsza para to igła) ze stosu i wypycha w zamian tablicę indeksów 1.
Wypróbuj online w interpretatorze CJam .
Jak to działa
źródło
Haskell , 48 bajtów
Wypróbuj online!
Nazwij to tak
(!) 1 2 [(1, 9), (3,6), (2, 5), (16, 8)]
.Bliski port mojej odpowiedzi w języku Python . Wyrażenie
zip[0..]l
wylicza listę wraz z jej indeksami.Wyrażenie
x/y+y/x==a/b+b/a
sprawdza, czy stosunekx/y
jest albo,a/b
albob/a
, ponieważ funkcjaf(z) = z + 1/z
maf(z) = f(1/z)
i nie ma innych kolizji.źródło
h
operatora do wzięcia trzech argumentów? Pozwoliłoby to zaoszczędzić jeden bajt i myślę, że byłby zgodny z zasadami.Snowman 1.0.2 , 61 znaków
Czysty bełkot (chyba że znasz Bałwana), aka dokładnie zgodny z celem projektu, jakim jest bycie tak zagmatwanym, jak to możliwe.
Format wejściowy jest taki sam jak w poście, format wyjściowy jest również taki sam minus
set(
i)
.Niegolfowany (lub nieupoważniony, naprawdę):
Jestem bardzo dumny z niektórych sztuczek, których użyłem w tym:
Użyłem tego samego formatu wejściowego co w poście. Ale zamiast próbować go jakoś parsować, co stałoby się naprawdę nieuporządkowane, po prostu połączyłem dwie linie, a następnie użyłem wyrażenia regularnego, aby wyodrębnić wszystkie liczby w jedną dużą tablicę (przy pomocy której to zrobiłem
2aG
, tj. Otrzymałem każdą grupę 2).:nD;aF
jest dość fantazyjne. Po prostu bierze tablicę dwóch elementów i dzieli pierwszy przez drugi. Co wydaje się dość proste, ale robienie tego intuicyjnie (a[0]/a[1]
) byłoby znacznie dłużej w Snowman:0aa`NiN`aA|,nD
(i zakładając, że nie musimy się martwić o bałagan z innymi istniejącymi zmiennymi). Zamiast tego zastosowałem metodę „fold” z predykatem „divide”, która dla tablicy dwóch elementów osiąga to samo.0AAgaA
wygląda wystarczająco nieszkodliwie, ale tak naprawdę zapisuje a0
do zmiennych, a następnie bierze wszystkie zmienne o indeksie większym niż ten (a więc wszystkie zmienne oprócz pierwszej). Ale sztuczka polega na tym, że zamiastAaG
(który pozbyłby się oryginalnej tablicy i0
) użyłemAAg
, która zachowuje oba. Teraz używamaA
, at-index, używając tego samego,0
aby uzyskać pierwszy element tablicy - co więcej, jest to w trybie konsumpcji (aA
zamiastaa
), więc pozbywa się również0
oryginalnej tablicy, która jest teraz śmieciem dla nas.Niestety,
0AAgaA*|
nie w zasadzie to samo, co GolfScript robi w jednej postaci:(
. Jednak nadal uważam, że jest całkiem niezły, jak na standardy Snowmana. :)źródło
Mathematica, 41 bajtów
Stosowanie:
źródło
Pyth - 14 bajtów
Filtruje przez porównanie ilorazów, a następnie map
indexOf
.Pakiet testowy .
źródło
1,2
i[(1, 2), (2, 4), (1, 2)]
da[0, 1, 0]
raczej niż poprawne[0, 1, 2]
.APL (Dyalog Unicode) ,
1613 bajtów SBCSWypróbuj online!
-3 dzięki @ngn!
Wyjaśnienie:
Format wyjściowy jest wektorem binarnym,
1 1 0 0 1
którego „inny” prostokąt przypomina wyglądem.APL (Dyalog Extended) , 11 bajtów SBCS
Wypróbuj online!
Wyjaśnienie:
Format wyjściowy jest taki sam jak główna odpowiedź Dyalog.
Dzięki Adám za pomoc w grze w golfa + Extended.
źródło
(=.×∘⌽∨=.×)⍤1
Julia, 62 bajty
find
Funkcja lokalizuje prawdziwe elementy w logiczną wektorze..*
wykonuje elementowe mnożenie wektorów.Nie golfowany:
Stosowanie:
źródło
K5, 19 bajtów
Myślę, że to załatwi sprawę:
Pobiera listę par, w których pierwsza jest „główna”. Oblicza współczynnik, dzieląc posortowane wymiary każdej pary. Zwraca listę indeksowanych pozycji 0 pasujących par. (prawdopodobnie wybrany przeze mnie format wejściowy powoduje indeksowanie -1 - jeśli jest to uważane za nieprawidłowe tals
1+
na początku i dodaje dwa znaki do rozmiaru mojego programu).Przykład użycia:
Działa to w porządku - zauważ, że domyślnie polegam na podziale, który zawsze daje wyniki zmiennoprzecinkowe. To działałoby w Kona, jeśli dodałeś przecinek dziesiętny do wszystkich liczb na wejściu i dodałeś spację po
_
.źródło
Octave / Matlab, 44 bajty
Korzystanie z anonimowej funkcji:
Wynikiem jest indeksowanie 1.
Aby z niego skorzystać, zdefiniuj funkcję
i nazwij to w następującym formacie
Możesz spróbować online .
Jeśli wynik może być w logicznym indeksowaniu (
0
wskazuje nie podobny,1
oznacza podobny): 38 bajtów :Taki sam przykład jak powyżej:
źródło
Brachylog , 14 bajtów
Wypróbuj online!
Pobiera dane wejściowe jako listę zawierającą listę zawierającą główny prostokąt i listę innych prostokątów (tak jak w przypadku testowym 1
[[[1,2]],[[1,2],[2,4]]]
) i wysyła listę indeksów opartych na 0 poprzez zmienną wyjściową.Jeśli tego rodzaju dziwne i specyficzne formatowanie danych wejściowych oszukuje, jest to trochę dłużej ...
Brachylog , 18 bajtów
Wypróbuj online!
Pobiera dane wejściowe jako listę zawierającą główny prostokąt i listę innych prostokątów (więc przypadek testowy 1 jest bardziej oczywisty
[[1,2],[[1,2],[2,4]]]
) i wysyła listę wskaźników opartych na 0 poprzez zmienną wyjściową.Aby ustalić, czy dwie pary szerokość-wysokość reprezentują podobne prostokąty, wystarczy wziąć cztery bajty
pᵐ/ᵛ
(co daje wynik wspólnego współczynnika lub jego wzajemności). Cała reszta obsługuje wiele prostokątów do porównania, a dane wyjściowe są indeksami.źródło
dzaima / APL , 7 bajtów
Wypróbuj online!
8 bajtów wyprowadzających listę indeksów zamiast wektora boolowskiego
źródło
[0,1,4]
albo[1,2,5]
(nie wiem, czy Twój język jest 0- lub 1-indeksowane). Lepszym wyzwaniem byłoby imho, gdyby dozwolone były wszystkie trzy formaty wyjściowe: indeksy; filtruj, aby zachować prawdziwe wartości; lista wartości truey / falsey (jak teraz), zamiast tylko dozwolonych indeksów.[0,1,4]
,[1,2,5]
,4\n0\n1
,5 2 1
, itd. Itd., Ponieważ ciągle stwierdził indeksów . Ale poprosiłem OP o wyjaśnienie (jeśli odpowiedzą, ponieważ jest to 4-letnie wyzwanie). W mojej odpowiedzi 05AB1E oznaczałoby to 14 bajtów, jeśli indeksy są obowiązkowe w porównaniu z 8 bajtami, jeśli jedna z dwóch pozostałych opcji jest dozwolona. Niezależnie od tego, głosowałem za odpowiedzią. :)Haskell, 75 bajtów
źródło
PowerShell , 57 bajtów
Wypróbuj online!
Indeksy są oparte na 1.
źródło
PowerShell ,
5856 bajtów-2 bajty dzięki mazzy x2
Wypróbuj online!
To nieznacznie narusza
input may be however you desire
klauzulę, ponieważ komponenty pierwszego kształtu są dostarczane osobno, aby zaoszczędzić 3 bajty.PowerShell ,
6159 bajtówWypróbuj online!
Używa indeksowania warunkowego do przełączania między bieżącym indeksem zerowym a zerowym w zależności od tego, czy stosunki się zgadzają. Na szczęście w tym przypadku
$i
przyrosty są wykonywane niezależnie od tego, czy zostaną wydrukowane, czy nie.źródło
-
zamiast tego zaoszczędzić więcej-ne
.JavaScript (ES6), 75
Alternatywnie, również 75
Dane wejściowe są traktowane jako obiekt JSON i tablica obiektów JSON
źródło
05AB1E ,
1514 bajtówWypróbuj online lub sprawdź wszystkie przypadki testowe .
Wyjaśnienie:
Na
J
Monety są tam dlatego 05AB1E nie można określić indeksy na wielowymiarowe listy AFAIKJeśli wyprowadzasz pary szerokości / wysokości, które są prawdziwe, lub wypisujesz listę wartości prawdy / falseya na podstawie listy danych wejściowych, może to być 8zamiast bajtów :
Wypróbuj online lub sprawdź wszystkie przypadki testowe .
Wypróbuj online lub sprawdź wszystkie przypadki testowe .
źródło