(Zainspirowany wczesnym szkicem wyzwania fraktalnej linii PhiNotPi .)
Otrzymujesz szerokość W > 1
, wysokość H > 1
i ciąg znaków składający się z 2(W+H-2)
drukowalnych znaków ASCII. Zadanie polega na wydrukowaniu tego ciągu owiniętego wokół prostokąta o określonej szerokości i wysokości, zaczynając od lewego górnego rogu, zgodnie z ruchem wskazówek zegara. Wnętrze prostokąta jest wypełnione spacjami. Mamy nadzieję, że przypadki testowe wyjaśnią to bardzo wyraźnie.
Możesz napisać program lub funkcję, pobierając dane wejściowe przez STDIN (lub najbliższą alternatywę), argument wiersza poleceń lub argument funkcji i albo drukując wynik do STDOUT (lub najbliższej alternatywy), albo zwracając go jako ciąg znaków.
Nie może być spacji wiodących ani końcowych (oprócz tych, które mogą znajdować się w ciągu wejściowym). Opcjonalnie możesz wypisać jeden końcowy znak nowej linii.
To jest kod golfowy, więc wygrywa najkrótsze przesłanie (w bajtach).
Przypadki testowe
Po każdym przypadku testowym "String" W H
następuje oczekiwany wynik.
"Hello, World! "
5 4
Hello
,
!
dlroW
"+--+|||+--+|||"
4 5
+--+
| |
| |
| |
+--+
">v<^"
2 2
>v
^<
"rock beats scissors beats paper beats "
11 10
rock beats
s
s c
t i
a s
e s
b o
r
r s
epap staeb
Note that the following string contains an escaped '"'.
"!\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~"
46 3
!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMN
~ O
}|{zyxwvutsrqponmlkjihgfedcba`_^]\[ZYXWVUTSRQP
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
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=47710;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>
Odpowiedzi:
CJam, 27 bajtów
Naprawdę nie CJam, ale myślę, że to bije Martina. Główną różnicą jest to, że wciskamy nowy wiersz przed odczytem danych wejściowych i natychmiast drukujemy pierwszy wiersz, co eliminuje potrzebę przechowywania wysokości.
Pobiera dane wejściowe w kolejności
Wypróbuj online.
źródło
Python 2, 95 bajtów
Drukuje pierwszą linię, następnie dwie pionowe linie, a następnie ostatnią linię.
Musi być coś krótszego niż
print
trzykrotne pisanie , ale wszystko, co do tej pory próbowałem z zapisaniem do zmiennej i'\n'.join
było dłuższe.źródło
eval
na wejściu i nawiasować instrukcje print.eval
pod uwagę! Nawias nie powinien stanowić większego problemu, ponieważprint
w Pythonie 2 wymaga spacji po nim. Przejście odprint blah
dop(blah)
nadal oszczędza 3 postacie.CJam,
3130 bajtówPod naciskiem Optimizera, oto moja własna próba. Nie jestem fanem wygrywania własnych wyzwań, dlatego liczę rodzinę APL (lub kogoś lepszego w CJam), aby to pokonać. ;)
Pobiera dane wejściowe w tej samej kolejności, jak podano w pytaniu:
Sprawdź to tutaj.
Jeden bajt zapisany dzięki Optymalizatorowi.
Wyjaśnienie
Początkowo miałem naprawdę fajny pomysł, aby zacząć od prostokąta odstępów, a następnie dosłownie owinąć wokół niego sznurek, obracając jednocześnie całą siatkę cztery razy. Jednak nie wydaje mi się, aby działało to w przypadku, gdy szerokość lub wysokość lub oba są
2
. Wypróbowałem więc naiwne podejście (drukuj górę, pętla na bokach, drukuj dół) i, co zaskakujące, okazało się, że jest naprawdę krótkie.źródło
l~;:V/(N@s{)V2-S*@(N@_,V-}gW%
oszczędza 1 znakPyth,
474645403736 bajtówJest to oczywiste podejście zastosowane w Pyth. Drukuje pierwszą linię, indeksując,
0:width
a następnie środek, a następnie koniec.Dzięki @Jakube za wskazówkę przy użyciu
z
iQ
za dwa wejścia i przy użyciup
.Pobiera dane wejściowe ze stdin jako ciąg znaków i jako krotkę wymiarów, separator nowej linii:
i pisze na standardowe wyjście.
Wypróbuj tutaj .
źródło
z
do odczytu łańcucha oszczędza sporo znaków.t_N
Jest to również to samo, co-_N1
.++
używaćp
i przełączać zazt_N
pomocą*d-k2
.J, 61 bajtów
Metoda:
Zaczynając od
(height-2)*(width-2)
bloku spacji, bierzemy niezbędną liczbę znaków z końca łańcucha i dodajemy go do bieżącego bloku. Powtarzamy to 4 razy. Łącznie 5 stanów zilustrowanych'Hello, World! ' 5 4
przykładem (spacje zastąpionoX
literami s dla czytelności):Kod:
Jawna definicja funkcji. Funkcja dwóch argumentów przyjmuje ciąg jako lewy argument, a listę dwóch liczb całkowitych jako prawy argument.
Przykładowe użycie:
Wypróbuj online tutaj.
źródło
Pyth,
3837Początkowo miałem inne rozwiązanie 38, ale było to w zasadzie golfowe rozwiązanie odpowiedzi Maltysena. Postanowiłem więc pójść trochę inaczej.
Wypróbuj online .
źródło
_>z_ttH
jest równoważne z<_zttH
.JavaScript (ES6), 110
115Funkcja z 3 parametrami, zwracająca ciąg znaków
Wersja Chrome 119 : brak krótkiego formatu dla funkcji, brak domyślnych parametrów. Nie ma powodu, aby używać,
for(of)
nawet jeśli jest obsługiwanyES5 wersja 126 : nie dla (of), bez string.repeat
Bez golfa
Przetestuj w konsoli Firefox / FireBug
Wydajność
źródło
Python 2, 97 bajtów
Podejście bezpośrednie.
źródło
Haskell,
164156 bajtówFunkcja
p
nie drukuje wyniku, ale zwraca go jako ciąg, np.p 4 5 "+--+|||+--+|||"
->"+--+\n| |\n| |\n| |\n+--+\n"
. Dla lepszego wykorzystania wyświetlaczaputStr
:Jak to działa: tworzę
w
xh
blok spacji i zastępuję pierwszy wiersz początkiem ciągu wejściowego. Następnie obracam blok przeciwnie do ruchu wskazówek zegara i powtarzam zastępując pierwszą linię jeszcze trzy razy.Aby zapobiec wycinaniu pierwszego znaku po zakończeniu tury # 4, dołączam go do ciągu wejściowego przed rozpoczęciem.
Edycja: znalazłem lepszy sposób rozwiązania problemu odcięcia pierwszego znaku po skręcie # 4.
źródło
Postscript, 62 bajty
To oczywiście używa tokenów binarnych, ale jest to równoważne z:
Oto zrzut pliku (
xxd round.ps
):Uruchom jako:
Wyjście jest naprawdę małe (w wyniku braku skalowania czcionki), więc musisz trochę powiększyć, aby go zobaczyć.
Dzięki temu
xyshow
operator może napisać ciąg przy użyciu niestandardowych odstępów między znakami. W tym przypadku używam ujemnych odstępów pionowych, aby zapisać, następnie ujemnych odstępów poziomych, aby pisać do tyłu, a następnie dodatnich odstępów pionowych, aby pisać do góry. Z tego powodu nie muszę używać żadnych manipulacji ciągami.źródło
> <>,
8280 + 3 = 83 bajtyStrona Esolang dla> <> (Ryba)
To okazało się krótsze niż się spodziewałem. Wykorzystuje proste podejście do drukowania pierwszej linii, następnie kolumn wypełnionych środkowymi spacjami, a następnie ostatniej linii.
Wprowadź ciąg znaków za pomocą STDIN, a wysokość i szerokość za pomocą wiersza polecenia z
-v
flagą, tak jak poniżej:Wyjaśnienie
źródło
Bash + coreutils, 124
Skrypt powłoki na początek:
Przekaż dane wejściowe jako argumenty wiersza poleceń:
źródło
JavaScript,
161160158 bajtówMetoda, którą wymyśliłem, okazała się zbyt długa, ale no cóż, to była praktyka. (Poza tym mam to przeliterować
r+o[u]+'\n':d
.)Dla danych wejściowych, które nie mają sensu, dane wyjściowe są niezdefiniowane (dosłownie i kilka razy), ale działa we wszystkich przypadkach testowych.
źródło
slice
jest krótszy niżsubstr
, nie jest dokładnie taki sam, ale w tym przypadku możesz go użyćGroovy, 140
połączenie:
wydajność:
źródło
K,
5554 bajtówStosując to samo podejście, co implementację J randomry; Zacznij od bloku spacji i dodaj od ogona sznurka do krawędzi, obracając cztery razy:
I kilka przykładów:
Trochę go rozbijając dla czytelności,
Wygeneruj blok NxM:
Obróć o 90 stopni za pomocą transpozycji (
+
) i odwrotnie (|:'
):Jeśli więc mamy blok spacji
t
i ciąg znakóws
, możemy dołączyć kawałek ogonas
dot
:Używamy formularza,
4 {[x] ... }/( ... )
aby wielokrotnie stosować funkcję do krotki składającej się z łańcucha i budowanej macierzy. Za każdym razem, gdy wykonujemy ten krok rotacji i konkatenacji, również odcinamy sznurek.edytować:
Innym pomysłem jest próba podzielenia łańcucha wejściowego na fragmenty, które chcemy przy każdym obrocie, co upraszcza główną część programu. Niestety okazuje się, że jest nieco dłuższy przy 56 bajtach:
Jeśli istnieje lepszy sposób na obliczenie tych punktów podziału, jestem otwarty na sugestie.
edycja2:
Lekkie przestawienie pozwala mi usunąć parę nawiasów. 54 bajty!
źródło
K,
8068 bajtówSkrócono z 80 dzięki @JohnE.
Oryginalny:
Ledwo wiem, jak to działa.
Przykładowe użycie:
Istnieje kilka możliwych optymalizacji, ale ciągle robię Kona segfault ...
źródło
f:{[s;y;n]`0:(,n#s),({s[(#s)-x+2],((n-2)#" "),s@n+x}'!y-2),,n#|-4!s}
. 68 znaków według mojej liczby.R 178
Jest to nienazwana funkcja przyjmująca
s, w, h
jako parametry. Chciałbym, żeby był lepszy sposób na rozerwanie struny.Bez golfa
Testowe uruchomienie
źródło
T-SQL, 307
Choć wciąż strasznie długie, okazało się to o wiele łatwiejsze (i krótsze) niż myślałem w zapytaniu. Zaimplementowano jako funkcję cenioną w tabeli wbudowanej dla T-SQL.
Powtarza się to przez ciąg @h razy. Pierwsza rekurencja przycina znaki @W z ciągu. Środkowe rekurencje zajmują ostatnią i pierwszą pozostałą strunę z dopełnieniem struny pomiędzy. Ostatnia rekurencja odwraca to, co zostało. Istnieje kilka zagubionych znaków, które dotyczą sposobu, w jaki SQL Server traktuje końcowe spacje na VARCHARS.
Testowe uruchomienie
źródło
Pyth, 33 bajty
Demonstracja.
źródło
MATLAB, 101
źródło
C ++, 398 bajtów
Używany kompilator - GCC 4.9.2 z
-std=c++14
flagąSprawdź to tutaj.
Wyjaśnienie
źródło
char[][]
zamiast tego?vector<vector<char>> M;M.resize(h,vector<char>(w,0));
jest nieco krótszy niżchar** M;M=new char*[h];while(i<h)M[i++]=new char[w]();
Perl, 193
195bajtówJestem pewien, że można to znacznie poprawić. Jestem nowicjuszem. >, <
źródło
Java 11, 180 bajtów
Wypróbuj online (UWAGA:
String.repeat(int)
jest emulowany jakrepeat(String,int)
dla tej samej liczby bajtów, ponieważ Java 11 nie jest jeszcze w TIO).Wyjaśnienie:
źródło
Węgiel drzewny , 4 bajty
Wypróbuj online (pełne) lub wypróbuj online (czyste) .
Wyjaśnienie:
Zasadniczo wbudowane do tego wyzwania. Weź pierwsze dwie liczby całkowite jako szerokość i wysokość, i wydrukuje pole z trzecim łańcuchem wejściowym jako ramką:
źródło