Inspirowany tym postem StackOverflow.
Wprowadzenie
Zadaniem Boba jest tworzenie arkuszy kalkulacyjnych i ich organizowanie. Sposób, w jaki je organizuje, jest znany nielicznym, z wyjątkiem Boba, ale tworzy listę każdego z arkuszy kalkulacyjnych należących do tej samej grupy. W utworzonym przez siebie arkuszu kalkulacyjnym jest mnóstwo danych, ale w tej chwili analizujemy tylko jeden fragment: liczba dni między dniem, w którym zaczął to zadanie, a dniem, w którym utworzył ten arkusz. Pierwszego dnia stworzył dwa arkusze kalkulacyjne, zanotował je 0
i posortował w odpowiednich miejscach.
Teraz jego szef prosi o sprawdzenie, jakie rodzaje arkuszy kalkulacyjnych zdarzały się każdego dnia, a Twoim zadaniem jest napisanie kodu, który to rozwiąże dla Boba; ma o wiele za dużo arkuszy kalkulacyjnych, aby zrobić to ręcznie.
Wejście
Informacje Boba, które ci podaje, mają postać postrzępionej tablicy (indeksowanej 0 lub 1), w której każdy układ odniesienia ma postać x = a[i][j]
. a
to, co nazywam samą postrzępioną tablicą, i
to rodzaj arkusza kalkulacyjnego i x
data utworzenia tablicy. j
jest nieważne.
Zadanie
Biorąc pod uwagę postrzępioną tablicę dni tworzenia arkuszy kalkulacyjnych uporządkowanych według ich typu, zwróć postrzępioną tablicę typów arkuszy kalkulacyjnych uporządkowanych według dnia utworzenia arkusza kalkulacyjnego.
Przykłady
Bob nie zamierza zostawić cię z tymi abstrakcyjnymi danymi. Dał mi podzbiór niektórych swoich arkuszy kalkulacyjnych, aby pomóc ci dowiedzieć się, co powinno być.
Przykładowe dane wejściowe (indeksowane 0):
a = [
[3,2,5,0], # Bob doesn't necessarily sort his lists
[1,3],
[2,1,0,4],
[4,5,3],
[6,6]
]
Przykładowe dane wyjściowe (z komentarzem, który oczywiście nie jest wymagany):
output = [
[0,2] # On day 0, Bob made one type 0 and one type 2 spreadsheet
[1,2] # On day 1, Bob made one type 1 and one type 2 spreadsheet
[0,2] # On day 2, Bob made one type 0 and one type 2 spreadsheet
[0,1,3] # On day 3, Bob made one type 0, one type 1, and one type 3 spreadsheet
[2,3] # On day 4, Bob made one type 2 and one type 3 spreadsheet
[0,3] # On day 5, Bob made one type 0 and one type 3 spreadsheet
[4,4] # On day 6, Bob made two type 4 spreadsheets
]
Pamiętaj, że Bob nie zawsze tworzy dwa arkusze kalkulacyjne każdego dnia, więc wyniki mogą być również postrzępione. Ale zawsze tworzy co najmniej jeden arkusz kalkulacyjny każdego dnia, więc dane wyjściowe nigdy nie będą musiały zawierać pustych tablic - chociaż jeśli dane wyjściowe mają puste tablice na końcu, nie trzeba ich usuwać.
Więcej przypadków testowych:
[[3,5,6,2],[0,0,0],[1,0,3,4]] -> [[1,1,1,2],[2],[0],[0,2],[2],[0],[0]]
[[-1]] -> Undefined behavior, as all input numbers will be non-negative integers.
[[0],[0],[],[0]] -> [[0,1,3]]
Wewnętrzne listy danych wyjściowych nie muszą być sortowane.
Jak zawsze nie wygrywa żadna standardowa luka i oczywiście najkrótszy kod.
(Ponieważ jest to moje pierwsze pytanie, daj mi znać, co mogę zrobić, aby to poprawić).
źródło
[[0 0]]
dać wynik[[0 0] []]
?Odpowiedzi:
Galaretka ,
1110 bajtówWejścia i wyjścia są oparte na 1.
Wypróbuj online! lub zweryfikuj wszystkie przypadki testowe (oparte na 0 dla łatwego porównania).
źródło
Pyth, 13 bajtów
Wypróbuj online
źródło
Pyth , 14 bajtów
Zestaw testowy.
źródło
Brachylog , 28 bajtów
Wyjaśnienie
Główny predykat, Input (
?
) = lista listPredykat 1:
Predykat 2:
źródło
Lua, 114 bajtów
Ideone to!
Zainspirowany odpowiedzią Dennisa w Pythonie 2 .
źródło
JavaScript (ES6), 58 bajtów
źródło
CJam (
3029 bajtów)Demo online
Co ciekawe, hackowanie jest krótsze
W
niż używanieee
, głównie dlatego, że i tak chcę, aby indeks skończył się w zmiennej.e]
zaoszczędzono dwa bajty przy pierwszym znalezieniu maksymalnego elementum
i zainicjowaniu tablicym+1
pustych tablic.Dzięki Martinowi za jednobajtową oszczędność poprzez zapisanie wartości w
X
zamiast żonglowania nią wokół stosu.NB: Jeśli dozwolone są końcowe puste tablice, istnieje alternatywne podejście 29-bajtowe, zamiast tego inicjuje tablicę tylu pustych dni, ile jest arkuszy kalkulacyjnych:
źródło
CJam, 20 bajtów
Dzięki Peter Taylor za pozwolenie mi oprzeć ten kod na swoim rozwiązaniu i zaoszczędzić 3 bajty.
Blok bez nazwy, który oczekuje danych wejściowych na szczycie stosu i zastępuje je danymi wyjściowymi.
Sprawdź to tutaj.
Wyjaśnienie
źródło
Python 2, 82 bajty
Przetestuj na Ideone .
źródło
Mathematica, 35 bajtów
Nienazwana funkcja, która przyjmuje i zwraca obdartą listę. Wykorzystuje wskaźniki oparte na 1.
Na szczęście
Max
automatycznie spłaszcza wszystkie dane wejściowe, dzięki czemu otrzymujemy indeks z ostatniego dnia, mimo że dane wejściowe są postrzępione. Następnie po prostu obliczamy listę#&@@@#~Position~i
indeksów całodniowychi
. To wyrażenie samo znajduje pozycjęi
wewnątrz listy obdartej (zwraca jako tablicę indeksów na kolejnych głębokościach), więc pożądane wartości są pierwszymi wartościami każdej z tych list.#&@@@
to standardowa sztuczka golfowa polegająca na pobieraniu pierwszego elementu z każdej#&
podlisty poprzez zastosowanie do każdej z tych podlist, która jest nienazwaną funkcją, która zwraca swój pierwszy argument.Alternatywnie możemy zdefiniować jednoargumentowy operator dla tej samej liczby bajtów (przy założeniu pliku źródłowego zakodowanego w standardzie ISO 8859-1):
źródło
Java, 314 bajtów
Szczegółowe
źródło
Map
?Perl 5, 48 bajtów
Podprogram:
Zobacz to w akcji w następujący sposób:
źródło