Skompresuj rzadką macierz za pomocą skompresowanego rzadkiego wiersza (format CSR, CRS lub Yale) .
Są to wszystkie te same formy kompresji (zignoruj nowe Yale).
Dane wejściowe mogą być dowolną strukturą danych 2d (lista list itp.): Np
[[0 0 0 0],
[5 8 0 0],
[0 0 3 0],
[0 6 0 0]]
I wyjście powinno być trzy 1d struktury danych (lista etc), które oznaczają wyjścia A
, IA
a JA
na przykład
[5, 8, 3, 6]
[0, 0, 2, 3, 4]
[0, 1, 2, 1,]
Proces jest opisany przez wikipedia:
Tablica A ma długość NNZ i przechowuje wszystkie niezerowe wpisy M w kolejności od lewej do prawej od góry do dołu („major-row”).
Tablica IA ma długość m + 1. Jest zdefiniowana przez tę rekurencyjną definicję:
IA [0] = 0 IA [i] = IA [i - 1] + (liczba niezerowych elementów w (i - 1) -tym rzędzie oryginalnej matrycy)
Zatem pierwsze m elementów IA przechowuje indeks w A pierwszego niezerowego elementu w każdym rzędzie M, a ostatni element IA [m] przechowuje NNZ, liczbę elementów w A, którą można również traktować jako indeks w A pierwszego elementu fantomowego rzędu tuż za końcem macierzy M. Wartości i-tego rzędu oryginalnej macierzy odczytywane są z elementów A [IA [i]] do A [IA [i + 1] - 1] (włącznie na obu końcach), tj. Od początku jednego wiersza do ostatniego indeksu tuż przed rozpoczęciem następnego. [5]
Trzecia tablica, JA, zawiera indeks kolumny w M każdego elementu A, a zatem ma również długość NNZ.
Jeśli Twój język nie obsługuje faktycznych struktur danych, dane wejściowe i wyjściowe mogą być tekstem.
Przypadki testowe
Wejście 1:
[[0 0 0 0],
[5 8 0 0],
[0 0 3 0],
[0 6 0 0]]
Wyjście 1:
[ 5, 8, 3, 6 ]
[ 0, 0, 2, 3, 4 ]
[ 0, 1, 2, 1, ]
Wejście 2
[[10 20 0 0 0 0],
[0 30 0 40 0 0],
[0 0 50 60 70 0],
[0 0 0 0 0 80]]
Wyjście 2:
[ 10 20 30 40 50 60 70 80 ]
[ 0 2 4 7 8 ]
[ 0 1 1 3 2 3 4 5 ]
Wejście 3:
[[0 0 0],
[0 0 0],
[0 0 0]]
Wyjście 3:
[ ]
[ 0 0 0 0 ]
[ ]
Wejście 4:
[[1 1 1],
[1 1 1],
[1 1 1]]
Wyjście 4:
[ 1 1 1 1 1 1 1 1 1 ]
[ 0 3 6 9 ]
[ 0 1 2 0 1 2 0 1 2 ]
Wejście 5:
[[0 0 0 0],
[5 -9 0 0],
[0 0 0.3 0],
[0 -400 0 0]]
Wyjście 5:
[ 5, -9, 0.3, -400 ]
[ 0, 0, 2, 3, 4 ]
[ 0, 1, 2, 1, ]
Załóżmy, że dane wejściowe mogą zawierać dowolną liczbę rzeczywistą, nie trzeba brać pod uwagę symboli matematycznych lub wykładniczej reprezentacji (np. 5000 nigdy nie zostanie wpisane jako 5e3). Nie trzeba będzie obsłużyć inf
, -inf
, NaN
lub jakieś inne „pseudo-numbers”. Możesz podać inną reprezentację liczby (5000 może być wyprowadzone jako 5e3, jeśli tak wybierzesz).
Punktacja:
Jest to kod-golf , najmniejsza bajty wygrywa.
Liderów
Oto fragment kodu, który pozwala wygenerować zarówno zwykłą tabelę wyników, jak i przegląd zwycięzców według języka.
Aby upewnić się, że twoja odpowiedź się pojawi, zacznij od nagłówka, korzystając z następującego szablonu Markdown:
# Language Name, N bytes
gdzie N
jest rozmiar twojego zgłoszenia. Jeśli poprawić swój wynik, to może zachować stare porachunki w nagłówku, uderzając je przez. Na przykład:
# Ruby, <s>104</s> <s>101</s> 96 bytes
Jeśli chcesz umieścić w nagłówku wiele liczb (np. Ponieważ twój wynik jest sumą dwóch plików lub chcesz osobno wymienić kary za flagi tłumacza), upewnij się, że rzeczywisty wynik jest ostatnią liczbą w nagłówku:
# Perl, 43 + 2 (-p flag) = 45 bytes
Możesz także ustawić nazwę języka jako link, który pojawi się we fragmencie tabeli wyników:
# [><>](http://esolangs.org/wiki/Fish), 121 bytes
var QUESTION_ID=129924,OVERRIDE_USER=8478;function answersUrl(e){return"https://api.stackexchange.com/2.2/questions/"+QUESTION_ID+"/answers?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+ANSWER_FILTER}function commentUrl(e,s){return"https://api.stackexchange.com/2.2/answers/"+s.join(";")+"/comments?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+COMMENT_FILTER}function getAnswers(){jQuery.ajax({url:answersUrl(answer_page++),method:"get",dataType:"jsonp",crossDomain:!0,success:function(e){answers.push.apply(answers,e.items),answers_hash=[],answer_ids=[],e.items.forEach(function(e){e.comments=[];var s=+e.share_link.match(/\d+/);answer_ids.push(s),answers_hash[s]=e}),e.has_more||(more_answers=!1),comment_page=1,getComments()}})}function getComments(){jQuery.ajax({url:commentUrl(comment_page++,answer_ids),method:"get",dataType:"jsonp",crossDomain:!0,success:function(e){e.items.forEach(function(e){e.owner.user_id===OVERRIDE_USER&&answers_hash[e.post_id].comments.push(e)}),e.has_more?getComments():more_answers?getAnswers():process()}})}function getAuthorName(e){return e.owner.display_name}function process(){var e=[];answers.forEach(function(s){var r=s.body;s.comments.forEach(function(e){OVERRIDE_REG.test(e.body)&&(r="<h1>"+e.body.replace(OVERRIDE_REG,"")+"</h1>")});var a=r.match(SCORE_REG);a&&e.push({user:getAuthorName(s),size:+a[2],language:a[1],link:s.share_link})}),e.sort(function(e,s){var r=e.size,a=s.size;return r-a});var s={},r=1,a=null,n=1;e.forEach(function(e){e.size!=a&&(n=r),a=e.size,++r;var t=jQuery("#answer-template").html();t=t.replace("{{PLACE}}",n+".").replace("{{NAME}}",e.user).replace("{{LANGUAGE}}",e.language).replace("{{SIZE}}",e.size).replace("{{LINK}}",e.link),t=jQuery(t),jQuery("#answers").append(t);var o=e.language;/<a/.test(o)&&(o=jQuery(o).text()),s[o]=s[o]||{lang:e.language,user:e.user,size:e.size,link:e.link}});var t=[];for(var o in s)s.hasOwnProperty(o)&&t.push(s[o]);t.sort(function(e,s){return e.lang>s.lang?1:e.lang<s.lang?-1:0});for(var c=0;c<t.length;++c){var i=jQuery("#language-template").html(),o=t[c];i=i.replace("{{LANGUAGE}}",o.lang).replace("{{NAME}}",o.user).replace("{{SIZE}}",o.size).replace("{{LINK}}",o.link),i=jQuery(i),jQuery("#languages").append(i)}}var ANSWER_FILTER="!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe",COMMENT_FILTER="!)Q2B_A2kjfAiU78X(md6BoYk",answers=[],answers_hash,answer_ids,answer_page=1,more_answers=!0,comment_page;getAnswers();var SCORE_REG=/<h\d>\s*([^\n,]*[^\s,]),.*?(\d+)(?=[^\n\d<>]*(?:<(?:s>[^\n<>]*<\/s>|[^\n<>]+>)[^\n\d<>]*)*<\/h\d>)/,OVERRIDE_REG=/^Override\s*header:\s*/i;
body{text-align:left!important}#answer-list,#language-list{padding:10px;width:290px;float:left}table thead{font-weight:700}table td{padding:5px}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <link rel="stylesheet" type="text/css" href="//cdn.sstatic.net/codegolf/all.css?v=83c949450c8b"> <div id="answer-list"> <h2>Leaderboard</h2> <table class="answer-list"> <thead> <tr><td></td><td>Author</td><td>Language</td><td>Size</td></tr></thead> <tbody id="answers"> </tbody> </table> </div><div id="language-list"> <h2>Winners by Language</h2> <table class="language-list"> <thead> <tr><td>Language</td><td>User</td><td>Score</td></tr></thead> <tbody id="languages"> </tbody> </table> </div><table style="display: none"> <tbody id="answer-template"> <tr><td>{{PLACE}}</td><td>{{NAME}}</td><td>{{LANGUAGE}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr></tbody> </table> <table style="display: none"> <tbody id="language-template"> <tr><td>{{LANGUAGE}}</td><td>{{NAME}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr></tbody> </table>
IA[0] = 0
całkowicie niepotrzebne? Trzeba tylko zdefiniowaćIA[i] = IA[i − 1]...
, ale moglibyśmy po prostu stwierdzić, że jeślii-1 < 0
użyjemy 0. Oznacza to, że IA [0] jest zawsze równe 0, dlatego można go skompresować (tak, zdaję sobie sprawę, że jest to krytyka algorytmu, nie to wyzwanie).Odpowiedzi:
MATL , 19 bajtów
Dane wejściowe są używane
;
jako separator wierszy.Wypróbuj online! Lub sprawdź wszystkie przypadki testowe: 1 , 2 , 3 , 4 , 5 .
Wyjaśnienie
źródło
Mathematica, 78 bajtów
Zobacz tę odpowiedź na mathematica.stackexchange.com .
źródło
Haskell, 87 bajtów
Wypróbuj online!
Jak to działa:
źródło
Galaretka , 24 bajty
Wypróbuj online!
źródło
APL (Dyalog) ,
3128 znaków lub3633 bajtów *Wymaga
⎕IO←0
indeksowania zerowego. I / O to lista list.Wypróbuj online!
{
…}
Anonimowa funkcja, w której argument jest reprezentowany przez ⍵(
...)(
...)(
...)
zwróci listę trzech rzeczy:⍵≠0
Boolean, w którym argument różni się od 0⍸¨
d ndices tych dla każdej podlisty∊
ϵ nlist (spłaszcz), aby połączyć w jedną listę⍵~¨0
usunięcie zera z każdego podmenu argumentud←
sklepie, a d≢¨
zgadzają każdy+\
skumulowana suma0,
przedrostek zera∊d
ε nlist (spłaszczyć) d połączyć w pojedynczej liście* Aby uruchomić w Dyalog Classic, po prostu zastąpić
⍸
z⎕U2378
.źródło
f 4 4⍴
a następnie wartości?f
. Wejście jest naprawdę REPL, który wywołujef
w wyniku4 4⍴…
której R eshapes danych do 4 x 4 matrycy.PHP , 107 bajtów
Wypróbuj online!
PHP , 109 bajtów
Wypróbuj online!
źródło
$x[]=$v
z$x[]=+$v
JavaScript (ES6), 117 bajtów
Dane wejściowe to tablica liczb 2D, a dane wyjściowe to tablica
[A, IA, JA]
.Wyjaśniono
Testy
Pokaż fragment kodu
źródło
Python 2 , 115 bajtów
Wypróbuj online!
Dane wyjściowe to
[A, JA, IA]
źródło
Perl 6 , 84 bajtów
Wypróbuj online!
Argument pojedynczej macierzy jest w
$_
..flatmap(*.grep(+*))
wybiera niezerowe elementy całej macierzy.[\+] .map(+*.grep(+*))
to trójkątna redukcja liczby elementów w każdym rzędzie (którą nazywają niektóre językiscan
).(0,|...)
wstawia zero na tę listę..flat.kv
tworzy indeksowaną listę wszystkich elementów macierzy..flatmap: { $^a % .[0] xx ?$^b }
płaskie mapy nad modułem każdego indeksu według liczby kolumn w tablicy (.[0]
liczba elementów w pierwszym rzędzie), zreplikowanych przez sam element, interpretowanych jako wartość logiczna. Oznacza to, że niezerowe elementy są replikowane jeden raz, a elementy zerowe są replikowane zero razy (tj. Usuwane).źródło
Python + SciPy, 79 bajtów
Myślę, że wbudowane nie były zabronione
Akceptuje dane wejściowe w formacie
[[0, 0, 0, 0],[5, 8, 0, 0],[0, 0, 3, 0],[0, 6, 0, 0]]
źródło
Japt ,
3127 bajtówPobiera dane wejściowe jako tablicę tablic i zwraca tablicę tablic.
Przetestuj (
-Q
flaga tylko do celów wizualizacji)Wyjaśnienie
Domniemane wejście tablicy
U
.[[1,1,1],[1,1,1],[1,1,1]]
Dla pierwszego sub = -array spłaszczamy (
c
),U
a następnie filtrujemy (f
), usuwając wszelkie elementy falsey (tj. 0s)[1,1,1,1,1,1,1,1,1]
Zamierzamy zbudować pozostałe 2 pod-tablice w tym samym czasie, odwzorowując
U
.Mapujemy każdy element (pod-tablicę) w
U
X
jest bieżącym elementem bieżącej podtablicy i©
jest logiczne AND (&&
), więc jeśliX
nie jest to prawda (nie zero), następna część nie zostanie wykonana.W Japt
N
jest tablica zawierająca wszystkie dane wejściowe, więc tutaj, jeśliX
to prawda, wypychamy (p
) indeks (Y
) bieżącego elementu doN
.[[[1,1,1],[1,1,1],[1,1,1]],0,1,2,0,1,2,0,1,2]
Wracając do mapy głównej tablicy i dla każdego elementu (
Z
) otrzymujemy liczbę elementów w tej pod-tablicy, które są prawdziwe (nie zero).[3,3,3]
Łącznie zmniejsz tę tablicę, sumując.
[3,6,9]
Wstaw (
i
) 0 o indeksie 0, aby uzupełnić drugą pod-macierz.[0,3,6,9]
W końcowej pod-macierzy po prostu wycinamy
N
pierwszy element.[0,1,2,0,1,2,0,1,2]
źródło