Oto prosty, bite-sized (bajt wielkości?) Kod golf: podany niepusty lista liczb całkowitych dodatnich mniej niż 10, wydrukować blok-przekątna matrycy, gdzie wykazie określa wielkość bloków, w porządku. Bloki muszą składać się z dodatnich liczb całkowitych mniejszych niż 10. Więc jeśli podano jako dane wejściowe
[5 1 1 2 3 1]
Twój wynik może być na przykład
1 1 1 1 1 0 0 0 0 0 0 0 0
1 1 1 1 1 0 0 0 0 0 0 0 0
1 1 1 1 1 0 0 0 0 0 0 0 0
1 1 1 1 1 0 0 0 0 0 0 0 0
1 1 1 1 1 0 0 0 0 0 0 0 0
0 0 0 0 0 1 0 0 0 0 0 0 0
0 0 0 0 0 0 1 0 0 0 0 0 0
0 0 0 0 0 0 0 1 1 0 0 0 0
0 0 0 0 0 0 0 1 1 0 0 0 0
0 0 0 0 0 0 0 0 0 1 1 1 0
0 0 0 0 0 0 0 0 0 1 1 1 0
0 0 0 0 0 0 0 0 0 1 1 1 0
0 0 0 0 0 0 0 0 0 0 0 0 1
lub
1 2 3 4 5 0 0 0 0 0 0 0 0
6 7 8 9 1 0 0 0 0 0 0 0 0
2 3 4 5 6 0 0 0 0 0 0 0 0
7 8 9 1 2 0 0 0 0 0 0 0 0
3 4 5 6 7 0 0 0 0 0 0 0 0
0 0 0 0 0 8 0 0 0 0 0 0 0
0 0 0 0 0 0 9 0 0 0 0 0 0
0 0 0 0 0 0 0 1 2 0 0 0 0
0 0 0 0 0 0 0 3 4 0 0 0 0
0 0 0 0 0 0 0 0 0 5 6 7 0
0 0 0 0 0 0 0 0 0 8 9 1 0
0 0 0 0 0 0 0 0 0 2 3 4 0
0 0 0 0 0 0 0 0 0 0 0 0 5
czy jakoś tak. Elementy w macierzy muszą być oddzielone (pojedynczymi) spacjami, a wiersze oddzielone (pojedynczymi) znakami nowej linii. Na liniach nie mogą znajdować się spacje wiodące ani końcowe. Możesz wydrukować nowy znak końcowy lub nie.
Możesz napisać funkcję lub program, przyjmując dane wejściowe przez STDIN (lub najbliższą alternatywę), argument wiersza poleceń lub argument funkcji, w dowolnym dogodnym formacie łańcucha lub listy (o ile nie jest on wstępnie przetworzony). Jednak wynik musi być wydrukowany do STDOUT (lub najbliższej alternatywy), w przeciwieństwie do zwracanej z funkcji, powiedzmy.
Nie wolno używać żadnych wbudowanych funkcji zaprojektowanych do tworzenia macierzy blokowych.
To jest kod golfowy, więc wygrywa najkrótsze przesłanie (w bajtach).
Liderów
Oczekuję, że języki oparte na tablicach (takie jak J i APL) będą miały tutaj przewagę, ale nie chcę, aby zniechęcało to ludzi do robienia tego tak dobrze, jak potrafią w wybranym przez siebie języku. Oto fragment kodu, który pozwala wygenerować zarówno zwykłą tabelę wyników, jak i przegląd zwycięzców według języka. Dlaczego więc nie spróbować złapać tego drugiego?
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
function answersUrl(e){return"http://api.stackexchange.com/2.2/questions/"+QUESTION_ID+"/answers?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+ANSWER_FILTER}function getAnswers(){$.ajax({url:answersUrl(page++),method:"get",dataType:"jsonp",crossDomain:true,success:function(e){answers.push.apply(answers,e.items);if(e.has_more)getAnswers();else process()}})}function shouldHaveHeading(e){var t=false;var n=e.body_markdown.split("\n");try{t|=/^#/.test(e.body_markdown);t|=["-","="].indexOf(n[1][0])>-1;t&=LANGUAGE_REG.test(e.body_markdown)}catch(r){}return t}function shouldHaveScore(e){var t=false;try{t|=SIZE_REG.test(e.body_markdown.split("\n")[0])}catch(n){}return t}function getAuthorName(e){return e.owner.display_name}function process(){answers=answers.filter(shouldHaveScore).filter(shouldHaveHeading);answers.sort(function(e,t){var n=+(e.body_markdown.split("\n")[0].match(SIZE_REG)||[Infinity])[0],r=+(t.body_markdown.split("\n")[0].match(SIZE_REG)||[Infinity])[0];return n-r});var e={};var t=0,c=0,p=-1;answers.forEach(function(n){var r=n.body_markdown.split("\n")[0];var i=$("#answer-template").html();var s=r.match(NUMBER_REG)[0];var o=(r.match(SIZE_REG)||[0])[0];var u=r.match(LANGUAGE_REG)[1];var a=getAuthorName(n);t++;c=p==o?c:t;i=i.replace("{{PLACE}}",c+".").replace("{{NAME}}",a).replace("{{LANGUAGE}}",u).replace("{{SIZE}}",o).replace("{{LINK}}",n.share_link);i=$(i);p=o;$("#answers").append(i);e[u]=e[u]||{lang:u,user:a,size:o,link:n.share_link}});var n=[];for(var r in e)if(e.hasOwnProperty(r))n.push(e[r]);n.sort(function(e,t){if(e.lang>t.lang)return 1;if(e.lang<t.lang)return-1;return 0});for(var i=0;i<n.length;++i){var s=$("#language-template").html();var r=n[i];s=s.replace("{{LANGUAGE}}",r.lang).replace("{{NAME}}",r.user).replace("{{SIZE}}",r.size).replace("{{LINK}}",r.link);s=$(s);$("#languages").append(s)}}var QUESTION_ID=45550;var ANSWER_FILTER="!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe";var answers=[],page=1;getAnswers();var SIZE_REG=/\d+(?=[^\d&]*(?:<(?:s>[^&]*<\/s>|[^&]+>)[^\d&]*)*$)/;var NUMBER_REG=/\d+/;var LANGUAGE_REG=/^#*\s*([^,]+)/
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>Language<td>Size<tbody id=answers></table></div><div id=language-list><h2>Winners by Language</h2><table class=language-list><thead><tr><td>Language<td>User<td>Score<tbody id=languages></table></div><table style=display:none><tbody id=answer-template><tr><td>{{PLACE}}</td><td>{{NAME}}<td>{{LANGUAGE}}<td>{{SIZE}}<td><a href={{LINK}}>Link</a></table><table style=display:none><tbody id=language-template><tr><td>{{LANGUAGE}}<td>{{NAME}}<td>{{SIZE}}<td><a href={{LINK}}>Link</a></table>
[:=/~]#<\
liczyły do twojego wyniku. Również=/~@#<\
za dwa dodatkowe bajty zostały ogolone.(=/~@#<\)
jest tylko funkcją. Trzeba by rzeczywiście stosuje się go do czegoś, aby uzyskać ekspresję, tak że trzeba wyraźnej wejście (".1!:1[1
), lub jeśli chcesz złożyć funkcję, że funkcja powinna faktycznie wydrukować wartości, a nie tylko go zwrócić (jakecho@
lub coś ).=/~&I.
APL, 10
Przykład:
Wyjaśnienie:
∆←⎕
: wczytaj dane wejściowe, zapisz w∆
.⍋∆
: znajdź permutację, która sortuje∆
(daje to unikalną wartość dla każdej wartości na wejściu)∆/
: dla każdej z tych unikalnych wartości powtórz toN
razy, gdzieN
jest odpowiednią wartością na wejściu∘.=⍨
: utwórz macierz porównującą każdą wartość z tej listy z innymi wartościami.źródło
http://tryapl.org
, możesz użyć dfn{∘.=⍨⍵/⍋⍵}
, ponieważ witryna filtruje wszystkie zastosowania⎕
(z wyjątkiem⎕IO
i tego typu rzeczy).{∘.=⍨⍵/⍋⍵}
nie jest poprawny. Potrzebujesz{⎕←∘.=⍨⍵/⍋⍵}
, co kosztuje nie tylko dwie postacie, ale nadal nie działa na TryAPL. (I ogólnie, TryAPL jest zbyt ograniczony, aby był użyteczny.)⎕←
tak nie byłbyś potrzebny , nawet bez dfn?R
6963Przypadek testowy:
Funkcja zewnętrzna wykonuje większość pracy tutaj, to jest tylko przypadek, aby uzyskać odpowiedni wygląd wyjścia - Dzięki @Vlo za pomoc w tym
źródło
-/+
do wymuszenia logiki. Zaoszczędź kilka bajtówfunction(x)write(+outer(i<-rep(1:length(x),x),i,"=="),1,sum(x))
63Python 3,
10397827876 bajtówKorzystanie z ikony, aby skorzystać z rozdzielającej przestrzeń natury
print
, z odrobiną rekurencji.źródło
Rubin,
869083 bajtówMój pierwszy golf w historii!
Pobiera tablicę z liczbami całkowitymi, drukuje oczekiwany wynik:
Edytować:
Dzięki Martin Büttner za pomoc w skróceniu niektórych rzeczy!
źródło
->(l)
może być->l
.map
jest krótszy niżeach
..join(" ")
można skrócić do*" "
.Matlab,
6054 bajtówByłoby to specjalne pole Matlaba, JEŚLI moglibyśmy użyć wbudowanych funkcji ...
Dzięki @sanchises za naprawienie błędu, który przegapiłem.
źródło
Matlab, 53 bajty
Chociaż jest on tylko o jeden znak krótszy od drugiego fragmentu Matlaba, pomyślałem, że kod jest wystarczająco inny, aby uzasadnić nową odpowiedź:
Główna sztuczka polega oczywiście na indeksowaniu poza granicami, ale jest to połączone z użyciem
end
jako zmiennej, aby uczynić ją bardziej kompaktową.źródło
end+1:end+v
aby pozbyć się zmiennej „przeciwnej”, i nie myślałem o tym rozwiązaniu.blkdiag
naruszałoby wymagania. Dla porównania umieszczę tutaj jego rdzeń:blkdiag(A,ones(i))
CJam, 21 lat
Wypróbuj na http://cjam.aditsu.net/
Wyjaśnienie:
źródło
Python 3, 79
Śledzi lewy indeks bloku jako
s
i dokonujex
wpisów po nim1
, gdziex
jest bieżący rozmiar bloku. Ten wiersz jest następnie drukowanyx
razy. Do tego potrzebny jest Python 3print(*r)
.źródło
r
jako[0]*s+[1]*x+[0]*(sum(l)-s-x)
, ale wciąż szukam lepszego sposobu.Haskell,
118116 bajtówStosowanie:
f [2,1,1,3]
Wydajność:
Jak to działa:
źródło
(h,e:t)<-map(`splitAt`i)[0..length i-1]
, ponieważn
nie jest używany pozalet
wiązaniem.Pyth
2321 bajtówRepozytorium GitHub dla Pyth
Dane wejściowe to lista liczb całkowitych, takich jak
[3, 1, 1, 2]
. Wypróbuj online: Pyth Compiler / ExecutorUżywa dość podobnego pomysłu jak kod J randomry. Pierwsza część kodu
Ju+G*]GHQY
generujen
części podobnych rzeczy. Dla przykładowego wejścia[3, 1, 1, 2]
wynik wygląda następująco:Najpierw trzy identyczne elementy, niż jeden element, potem jeszcze jeden element, a na końcu dwa identyczne elementy.
Druga część kodu to porównanie elementów produktu kartezjańskiego i wydrukowanie go.
źródło
C ++, 294 bajty
Używany kompilator - GCC 4.9.2
Objaśnienie -:
źródło
K, 30 bajtów
Zasadniczo ukradł odpowiedź marinusa
źródło
Java, 163
Konsument, który akceptuje listę liczb całkowitych.
Wersja do odczytu z kodem na płycie głównej:
Wywołaj używając:
źródło
Python 2,
163114 bajtówgnibbler grał w golfa.
źródło
print" ".join("01"[i==j]for j in r(l(h))for x in r(h[j]))
?Python 3, 74
źródło
and
zwarcie.f([1,2,3]);print("Done")
, błąd zakończyłby działanie programu po wydrukowaniu macierzy bloków i nie przejdzie do drukowania „Gotowe”.JavaScript (ES6), 103
107103 bajty jako funkcja anonimowa, nie licząc
F=
(ale potrzebujesz tego do przetestowania)Przetestuj w konsoli Firefox / FireBug
Wydajność
źródło
Oktawa,
4941 bajtówźródło
Pyth,
3130Dość naiwny program pobiera dane wejściowe na standardowe wejście. Prawdopodobnie można to bardziej zagrać w golfa;)
Dzięki @Jakube za wskazanie zmarnowanego char
Wypróbuj tutaj
źródło
Perl, 69
Wykorzystuje standardowe wejście:
źródło
-e
zamiast z pliku (zobacz przykłady w tym meta postie). myślę też, że nie potrzebujeszn
flagi - według perldoca
ustawia sięn
domyślnie.perl -nl file.pl
”. Oryginalne reguły perlgolfa liczą łącznik, ale nie spację, więc 3 znaki w tym przypadku.-lna //,print join$",map$'==$_|0,@,for@,=map{(++$i)x$_}@F
. BTW moja wersja Perla nie ustawia-n
się-a
, musi to być najnowszy dodatek.R,
117144137133129123 123 bajtówW tej chwili rozsądnie gadatliwy. Powinien być w stanie ogolić jeszcze kilka. Zyskałem pewną liczbę bajtów poprawnie formatując, ale zaoszczędziłem trochę na zamianie macierzy na tablicę.
Podziękowania dla Alexa za wskazówkę dotyczącą zamiany sep na s i usunięcia nazwy funkcji.
Całkowicie porzucił tablicę i użył serii powtórzeń do zbudowania każdej linii.
Mimo że Miff został mocno pobity, jego rozwiązanie uświadomiło mi, że mogę całkowicie upuścić s = ''.
I test
źródło
cat()
zmieńsep=
na,s=
ponieważ żadne inne rozpoznane parametry dla tej funkcji nie zaczynają się od „s”.f=
. To daje ci obiekt funkcji. Jeśli to zrobisz, musisz po prostu zastrzec, że zostanie to przypisane przy użyciu czegoś takiego jakf=
przed uruchomieniem. Nie zdawałem sobie sprawy, że było to uzasadnione w takich konkursach, dopóki nie zobaczyłem Martina Büttnera robiącego to z Ruby.Partia - 226 bajtów
Pobiera dane wejściowe ze stdin (
C:\>script.bat 5 1 1 2 3 1
) i dane wyjściowe echa. Niestety nie mogłem uzyskać tego ostatniego echa na tej samej linii, w przeciwnym razie prawdopodobnie mógłbym wywołać całą linię wewnątrzcmd/von/c
aby uniknąć konieczności opóźnionego rozszerzania na dłuższą metę.Ładnie i schludnie - tylko chrząknięcie:
źródło
Haskell, 124
Daje efekt poprzez połączenie działań IO poprzez
mapM_
ifoldr
. Funkcjad
powinna otrzymać listę ints.źródło
K (ngn / k) , 10 bajtów
Wypróbuj online!
-19 dzięki ngn ... trzymanie mojego poddania poniżej haha
K (ngn / k) , 29 bajtów
Wypróbuj online!
edycja: łamie dla 1-elementowego przypadku wejściowego, wymaga pracy
edit1: teraz naprawiony. +4 bajty. gwizd
źródło
{x=\:x:&x}
&
w k lubI.
in) działa z wektorami int, podczas gdy apl⍸
działa tylko z booleanami .APL (Dyalog Extended) , 5 bajtów
Wypróbuj online!
APL wygrywa z J i K z rozszerzoną domeną dla
⍸
.Jak to działa
źródło
STATA, 155 bajtów
źródło
Galaretka , 7 bajtów
Wypróbuj online!
Takie samo podejście jak odpowiedź J.
źródło