Podczas zawodów sportowych często zdarza się, że zwycięzcy są prezentowani na podium, z osobą zajmującą pierwsze miejsce na najwyższym środku, drugą osobę na średnim wzroście po lewej stronie, a trzecią osobę na najniższym i w prawo. Tutaj odtworzymy to za pomocą specjalnych poprawek.
Podium są przedstawione poniżej:
@---@
| @ |
@---@| | |
| @ || | |
| | || | |@---@
| | || | || @ |
Będzie to stanowić podstawę tego wyzwania. Następnym krokiem jest, aby podium były wystarczająco szerokie, aby pasowały do ludzi (drukowane ciągi ASCII), które są na nich. Chcemy jednak zapewnić estetyczne piękno (ponieważ jest to fantastyczna okazja do zrobienia zdjęcia), dlatego każde podium musi mieć tę samą szerokość, a szerokość musi być nieparzysta. Dodatkowo ludzie (oczywiście) będą chcieli stać na środku podium, więc struny muszą być wyśrodkowane tak dobrze, jak to możliwe. (Można wyrównać do lewej lub prawej strony i nie musi być spójna.) Powyższe podium mają minimalny rozmiar i są uważane za3
szerokie.
Na przykład, biorąc pod uwagę dane wejściowe ["Tom", "Ann", "Sue"]
reprezentujące odpowiednio pierwsze, drugie i trzecie miejsce, wypisz następujące podium:
Tom
@---@
Ann | @ |
@---@| | |
| @ || | | Sue
| | || | |@---@
| | || | || @ |
Jeśli jednak Anne
zamiast tego Ann
będziemy musieli przejść do następnego rozmiaru 5
i wyśrodkować łańcuchy najlepiej jak to możliwe. Tutaj wyrównuję, więc „dodatkowa” litera Anne
znajduje się po lewej stronie środka, ale możesz wybrać, do której strony chcesz wyrównać.
Tom
@-----@
Anne | @ |
@-----@| | |
| @ || | | Sue
| | || | |@-----@
| | || | || @ |
Poszukajmy dłuższych nazw. Co powiesz na ["William", "Brad", "Eugene"]
:
William
@-------@
Brad | @ |
@-------@| | |
| @ || | | Eugene
| | || | |@-------@
| | || | || @ |
Tutaj widzimy, że Brad
ma dużo białych znaków, Eugene
mniej, i William
pasuje dokładnie.
W przypadku dłuższego przypadku testowego, co powiesz na ["A", "BC", "DEFGHIJKLMNOPQRSTUVWXYZ"]
:
A
@-----------------------@
BC | @ |
@-----------------------@| | |
| @ || | | DEFGHIJKLMNOPQRSTUVWXYZ
| | || | |@-----------------------@
| | || | || @ |
Wreszcie mamy najmniejszy możliwy wkład, taki jak ["A", "B", "C"]
:
A
@---@
B | @ |
@---@| | |
| @ || | | C
| | || | |@---@
| | || | || @ |
- Dane wejściowe i wyjściowe można podać dowolną dogodną metodą .
- Dane wejściowe są gwarantowane jako niepuste (tzn. Nigdy nie otrzymasz
""
nazwy). - Możesz wydrukować go do STDOUT lub zwrócić jako wynik funkcji.
- Dopuszczalny jest pełny program lub funkcja.
- Dopuszczalna jest dowolna ilość obcych białych znaków, o ile znaki są odpowiednio ustawione w jednej linii.
- Standardowe luki są zabronione.
- To jest golf golfowy, więc obowiązują wszystkie zwykłe zasady gry w golfa, a wygrywa najkrótszy kod (w bajtach).
Odpowiedzi:
JavaScript (ES8), 196 bajtów
Wypróbuj online!
źródło
Groovy ,
187,176,156, 150 bajtówWypróbuj online!
(uwaga: interpreter tio groovy nie był w stanie obsłużyć indeksowania list przy użyciu wartości Long, mimo że groovy 2.5.6 potrafi. Zatem odpowiedź tio
*.toShort()
zamiast tego*.toLong()
dodaje bajt)Definiuje zamknięcie,
f
które można wywołać za pomocą:gdzie
f
zwraca ciąg.Wyjaśnienie:
Przestrzegamy kodu, mamy:
f={n->
- zdefiniować zamknięcie f za pomocą jednego parametrun
m=n*.size().max()|1
- znajdź maksymalną nazwę len, binarną lub nieparzystą liczbęh=' '*(m/2)
- h będzie zawierać przestrzenie podłogowe (m / 2), wykorzystane późnieja=...
- tworzy listę kodowania z elementami:@---@
wzór wyściełany do len| @ |
wzór wyściełany do len| | |
wzór wyściełany do len'307...'*.toLong().sum{a[it]}
- użyj wskaźników na liście kodowania, aby zbudować wynik..sum
wykorzystuje fakt, że ciąg + ciąg w groovy jest poprawny.'3073...'*.toLong()
używa*.
operatora rozkładaniatoLong()
każdego znaku, zwracając listę liczb.a
wstawiono, usunięto linie zerowe itp.źródło
Płótno , 45 bajtów
Wypróbuj tutaj!
Wyjaśnienie:
Nadużycia „i nie muszą być konsekwentne”, co czyni go dość niezrozumiałym.
źródło
Python 2 ,
197190 bajtówWypróbuj online!
-6 bajtów, dzięki Andrew Dunai
źródło
x,y,p='@| '
i używającp
zamiast' '
Python 2 , 157 bajtów
Wypróbuj online!
źródło
Węgiel drzewny , 63 bajty
Wypróbuj online! Link jest do pełnej wersji kodu. Wyjaśnienie:
Oblicz liczbę miejsc w każdej połowie podium.
Pętla nad każdym miejscem. Należy pamiętać, że dane wejściowe powinny być w kolejności 2, 1, 3.
Ustaw na początku linii, która będzie zawierać tekst.
Wydrukuj tekst z wystarczającą ilością lewej dopełnienia, aby go wyśrodkować.
Uzyskaj wysokość podium.
Narysuj podium.
Alternatywne podejście, również 63 bajty:
Wypróbuj online! Link jest do pełnej wersji kodu. Wyjaśnienie:
Oblicz liczbę miejsc w każdej połowie podium.
Pętla nad każdym miejscem. Należy pamiętać, że dane wejściowe powinny być w kolejności 2, 1, 3.
Ustaw na początku linii, która będzie zawierać tekst.
Wydrukuj tekst z wystarczającą ilością lewej dopełnienia, aby go wyśrodkować.
Wyjmij także szczyt podium, wstawiając
-
s między znakami łańcucha,@-@
aby osiągnąć odpowiednią szerokość.Wydrukuj pozostałą część podium, odpowiednio rozmieszczając
|
litery s, z wyjątkiem tego, że środkowy znak znajduje się@
w pierwszym rzędzie.źródło
R
308302299-6 bajtów dzięki @JAD
-3 bajtów dzięki @Guiseppe, teraz mam mniej niż 300
Prawdopodobnie istnieje lepszy sposób na utworzenie układu; Powinienem spróbować, jakie opcje mam dla ramek danych.
Wypróbuj online
źródło
i=max(1,nchar(a)%/%2)
. Generowaniematrix
i używaniewrite
może być krótsze (a nie adata.frame
). Sugeruję użycie opcjiformat
zj="c"
do automatycznego uzasadniania rzeczy, istrrep
jest to również pomocne w tym przypadku. Może wypróbuj pokój na czacie golfR, aby odrzucić pomysły?strrep
; Będę musiał to sprawdzić.Czysty , 209 bajtów
Wypróbuj online!
źródło
Python 2 , 188 bajtów
Wypróbuj online!
-5 dzięki TFeld .
źródło
PHP, 147 bajtów
oderwałem 93 bajty od mojego początkowego pomysłu, wprost
<?=
:pobiera nazwy z argumentów wiersza poleceń. Uruchom
-nr
lub wypróbuj online .Wymaga PHP 7; wyświetla ostrzeżenia w PHP 7.2 (i prawdopodobnie później). Zobacz TiO dla poprawki +5 bajtów.
mapowanie:
awaria:
Wstępny przyrost dla
$i
ratuje mnie przed wszelkimi sztuczkami dla nowych linii.Puste dla
6
może również być puste; więc to zrobiłem.Ale użycie
$argv[0]
górnego łańcucha granicznego-
było najprzyjemniejszym golfem w historii. (i zapisano 9 bajtów!)źródło
Idź, 436 bajtów
Go jest okropny dla golfa. Ale:
Zepsuty:
źródło
Java 8,
399394373 bajtówTo rozwiązanie jest prawdopodobnie zbyt długie, ale jest rozwiązaniem :)
Zapisano 5 bajtów, bezpośrednio iterując w kolejności (a = 1,0,2 zamiast q = 0,1,2; a = f (q))Zapisano 21 bajtów dzięki @KevinCruijssen:Jak sugerował @KevinCruijssen, można także użyć
var
zamiastString
w Javie 10+ i zapisać dodatkowe bajty. Nie robię tego z tego prostego powodu, że nie mam jeszcze Java 10: D można również użyć lambd. Ale zmniejszyłoby to tylko liczbę bajtów, gdybyśmy pominęli przypisywanie jej doFunction<String[],String>
zmiennej.W rozszerzonej formie:
Dane wejściowe należy podać jako-
String
macierz długości 3. Przykład wygląda następująco:Wydajność:
źródło
var
zamiastString
; wypełnił tablicę długości pętlą dla każdego; zmienionoif(m%2==0)m++;if(m==3)m=5;
nam+=m%2<1?m==2?3:1:0
dla tego samego efektu; zmienił wszystko%nr==0
na%nr<1
; zmienił%(m-1)
się%~-m
; włóż wszystko do samej pętli, aby nawiasy{}
mogły zostać usunięte.m-l[a]>>1
zamiast(m-l[a])/2
ii<k+2?" ":j%~-m<1?"|":j==m/2?i==k+2?"@":"|"
zamiasti>=k+2?j%~-m<1?"|":j==m/2?i==k+2?"@":"|":" "
C (GCC)
302293292289287 bajtów-6 bajtów dzięki pułapce cat
Uruchom tutaj
Niegolfowane i wyjaśnione (technicznie nie możesz mieć komentarzy po ukośnikach w makrach, więc to nie będzie działać)
Oto kod wywołujący
i wyjście
źródło
for(;i--;memset(D+1,45,w))w=w<(L[i]=strlen(N[i]))?L[i]|1:w;
zamiastfor(;i--;)w=w<(L[i]=strlen(N[i]))?L[i]|1:w;memset(D+1,45,w);
PowerShell dla Windows,
231223 bajtówWypróbuj online!
Dane wejściowe to tablica
@('second','first','third')
. Wersja rozwinięta:źródło
Stax , 43 bajty
Uruchom i debuguj
źródło