tło
Świętujemy wydanie Dyalog APL 16.0 , w którym rozwiązaniem tego problemu jest {⊢⌺(≢⍵)⊢⍵}
wyjaśnienie
Zadanie
Biorąc pod uwagę drukowalny ciąg ASCII o nieparzystej długości n , utwórz kwadrat n × n ze sznurkiem wyśrodkowanym poziomo, zduplikowanym, aby wyśrodkować go w pionie, oraz z akrostykami tego samego ciągu w każdym rzędzie i kolumnie. Zauważ, że wszystkie oprócz wyśrodkowanych łańcuchów zostaną odcięte, aby zachować rozmiar kwadratu n × n .
Wyjaśnienie twojego kodu będzie mile widziane.
Zasady
- Możesz mieć końcowe białe znaki i znaki nowej linii (dotyczy to również trójkąta w prawym dolnym rogu)
- Możesz zwrócić listę ciągów znaków
Przykład przy użyciu ciągu ABXCD
:
n wynosi 5. Najpierw narysujemy dwa wyśrodkowane ciągi, jeden poziomy i jeden pionowy:
┌─────┐ │ A │ │ B │ │ABXCD│ │ C │ │ D │ └─────┘
(Dodano ramkę ograniczającą 5 × 5 dla przejrzystości)
Następnie umieszczamy wszystkie możliwe akrostyki, poziomo i pionowo:
ZA AB ┌─────┐ │ ABX│CD │ ABXC│D │ABXCD│ A│BXCD │ AB│XCD │ └─────┘ Płyta CD re
Na koniec zwracamy tylko to, co znajduje się w obwiedni:
ABX ABXC ABXCD BXCD XCD
Przypadki testowe
World
:
Wor
Worl
World
orld
rld
mississippi
:
missis
mississ
mississi
mississip
mississipp
mississippi
ississippi
ssissippi
sissippi
issippi
ssippi
Pneumonoultramicroscopicsilicovolcanoconiosis
:
Pneumonoultramicroscopi
Pneumonoultramicroscopic
Pneumonoultramicroscopics
Pneumonoultramicroscopicsi
Pneumonoultramicroscopicsil
Pneumonoultramicroscopicsili
Pneumonoultramicroscopicsilic
Pneumonoultramicroscopicsilico
Pneumonoultramicroscopicsilicov
Pneumonoultramicroscopicsilicovo
Pneumonoultramicroscopicsilicovol
Pneumonoultramicroscopicsilicovolc
Pneumonoultramicroscopicsilicovolca
Pneumonoultramicroscopicsilicovolcan
Pneumonoultramicroscopicsilicovolcano
Pneumonoultramicroscopicsilicovolcanoc
Pneumonoultramicroscopicsilicovolcanoco
Pneumonoultramicroscopicsilicovolcanocon
Pneumonoultramicroscopicsilicovolcanoconi
Pneumonoultramicroscopicsilicovolcanoconio
Pneumonoultramicroscopicsilicovolcanoconios
Pneumonoultramicroscopicsilicovolcanoconiosi
Pneumonoultramicroscopicsilicovolcanoconiosis
neumonoultramicroscopicsilicovolcanoconiosis
eumonoultramicroscopicsilicovolcanoconiosis
umonoultramicroscopicsilicovolcanoconiosis
monoultramicroscopicsilicovolcanoconiosis
onoultramicroscopicsilicovolcanoconiosis
noultramicroscopicsilicovolcanoconiosis
oultramicroscopicsilicovolcanoconiosis
ultramicroscopicsilicovolcanoconiosis
ltramicroscopicsilicovolcanoconiosis
tramicroscopicsilicovolcanoconiosis
ramicroscopicsilicovolcanoconiosis
amicroscopicsilicovolcanoconiosis
microscopicsilicovolcanoconiosis
icroscopicsilicovolcanoconiosis
croscopicsilicovolcanoconiosis
roscopicsilicovolcanoconiosis
oscopicsilicovolcanoconiosis
scopicsilicovolcanoconiosis
copicsilicovolcanoconiosis
opicsilicovolcanoconiosis
picsilicovolcanoconiosis
icsilicovolcanoconiosis
Podziękowanie
Dzięki dzaima , Leaky Nun , Mr. Xcoder za wszystko oprócz samej idei tego wyzwania.
Odpowiedzi:
Python 2 , 60 bajtów
Wypróbuj online!
źródło
MATL , 8 bajtów
Wypróbuj online!
Wyjaśnienie
źródło
Siatkówka ,
7059 bajtówWypróbuj online! Edycja: Zapisano 11 bajtów przy pewnej pomocy @MartinEnder. Objaśnienie: Pierwszy etap powtarza dane wejściowe dla każdego znaku, wypełniając je odpowiednio w każdej linii, aby uzyskać ścinanie. Ostatni etap usuwa następnie 25% z każdej strony, aby uzyskać pożądany rezultat.
źródło
n/2
spacjami po lewej i prawej stronie (używając czegoś w rodzaju(..)+.
->$#1$* $&$#1$*
ze spacją końcową), a następnie po prostu zrobiłem miejsce, w!&`...
którym dokładnie...
pasują znaki.n
n
$*sp
?Java 8,
120103 bajtów-17 bajtów dzięki @ OlivierGrégoire .
Wyjaśnienie:
Wypróbuj tutaj.
źródło
i=l/2+1
ii-->1
ifor(;i<l
zapisać bajt.s->{int l=s.length(),i=l/2;while(i-->0)s=" "+s+" ";while(++i<l)System.out.println(s.substring(i,l+i));}
(103 bajty). Jedyną znaczącą zmianą jest to, że ciąg ze spacjami jest generowany raz na zawsze zamiast „w locie” (i oczywiście wydruk zamiast powrotu).Haskell,
6462 bajtówWypróbuj online! Jak to działa:
źródło
SWI Prolog, 234 bajty
Może spróbuj online tutaj: http://swish.swi-prolog.org/p/hEKigfEl.pl
NB.
_
tutaj, ponieważ pokazuje, że działa i nie wpływa na liczbę bajtów.Przykłady uruchomione w Swish:
Podejdź, w zasadzie pierwszą rzeczą, którą w ogóle mógłbym zrobić, a niewątpliwie wykwalifikowany użytkownik Prologu mógłby go znacznie skrócić:
Wyjaśniony i skomentowany kod (może się nie uruchomić), odczytany z
superacrostic()
dołu, następniehelper()
główny korpus, a następniehelper()
przypadek podstawowy:źródło
05AB1E , 11 bajtów
Wypróbuj online!
Wyjaśnienie
źródło
JavaScript (ES6), 75 bajtów
źródło
APL (Dyalog Unicode) , 10 znaków = 22 bajty
Wypróbuj online!
{
…}
Anonimowa funkcja, w której argument jest reprezentowany przez ⍵⊢
podać objęty obszar, kiedy⌺(
…)
Przesuwając szablon wielkości≢
długość⍵
argument⊢
na⍵
argumentDziała to tak, że każdy znak tworzy środek łańcucha o tej samej długości co dane wejściowe, dopełniając w lewo lub w prawo w razie potrzeby. Weź np .
ABXCD
:Ciąg ma pięć znaków, więc szablon będzie miał „otwór” o szerokości pięciu znaków.
┌──↓──┐
Wzornik z otworu środkowego znacznika│ ABX│CD
puszczeniuA
się w środku│ ABXC│D
, a następnieB
│ABXCD|
itpA|BXCD |
AB|XCD |
└──↑──┘
pozycji końcowej wzornikźródło
PHP , 98 bajtów
Wypróbuj online!
źródło
JavaScript (ES8),
666362 bajtówZwraca tablicę.
Spróbuj
Wyjaśnienie
Anonimowa funkcja przyjmująca ciąg jako argument za pomocą parametru
s
.Podziel ciąg na tablicę pojedynczych znaków.
Uzyskaj długość ciągu i przypisz go do zmiennej
l
.Odwzoruj tablicę, przepuszczając każdy element przez funkcję, gdzie
x
jest indeks bieżącego elementu.Dla każdego elementu zwróć oryginalny ciąg znaków z odstępami poprzedzonymi, aż jego długość będzie 1,5 raza większa niż jego pierwotna długość.
Uzyskaj podciąg długości
l
zaczynający się od indeksu bieżącego elementu.źródło
V ,
14, 11 bajtówWypróbuj online!
3 bajty zapisane dzięki @nmjmcman!
Hexdump:
Oryginalne podejście (18 bajtów):
Wyjaśnienie:
źródło
ê
. Dzięki :)PowerShell Core , 68 bajtów
Wypróbuj online!
Wyjaśnienie bez golfa
źródło
[($_..($_+$L))]
?(
nie pasuje do sprzężenia, robi to,-join ($Padding + $Text)[0,1,2,3,4]
aby wybrać kilka znaków z wypełnionego łańcucha dla linii wyjściowej i połączyć je w łańcuch, aby być krótszym sposobem.SubString()
. i generuje padding w miejscu i zakres znaków w miejscu. Do mojej odpowiedzi dodano pełne wyjaśnienie niemiłosiernego.Japt ,
191714 bajtówZaoszczędź 5 bajtów dzięki @ETHproductions i @Shaggy
Przetestuj online!
-R
dodano flagę, aby dołączyć do nowej linii (cele widoczności)Wyjaśnienie
źródło
Sp½*Ul
, ale nie sądzę, aby istniał jeden bankomat ... BTW, zwykle możesz zmienićsXX+Y
natXY
(s == .slice
,t == .substr
)Węgiel drzewny , 26 bajtów
Wypróbuj online! Link jest do pełnej wersji kodu.
źródło
Galaretka , 11 bajtów
Wypróbuj online!
Jak to działa
źródło
QBIC , 32 bajty
Człowieku, nadszedł czas, abym dodał
space$
do QBIC ...Wyjaśnienie
Przykładowy przebieg
źródło
Mathematica, 88 bajtów
źródło
Haskell ,
8670 bajtówTo (wciąż) jest o wiele za długie, ale dziękuję @bartavelle za przypomnienie mi, że generowanie listy ciągów jest również dopuszczalne!
Wypróbuj online!
źródło
Python 3 , 68 bajtów
Wypróbuj online!
źródło
PowerShell ,
133119 bajtówWypróbuj online!
Bez golfa
źródło
Python 2 ,
76 7473 bajty-1 dzięki @FelipeNardiBatista
Oczywiście nie tak krótki jak druga odpowiedź w Pythonie, ale warto wypróbować zupełnie inną metodę:
Wypróbuj online! (z wersją 74-bajtową)
Najpierw generuje pełny ciąg, a następnie kroi go tak, aby pasował do kwadratu.
Wyjaśnienie
źródło
(2*x+~i)
by uratować bajtJ , 19 bajtów
Wypróbuj online!
Wyjaśnienie
źródło
''
jako zamiennik.C # (.NET Core) , 101 bajtów
Zasadniczo odpowiedź @ KevinCruijssen. Zapisuje 2 bajty, ponieważ
string.Length
nie potrzebuje () i kolejne 2 bajty, ponieważ drugim argumentemstring.Substring()
jest długość zamiast końca indeksu, ale następnie traci 2 bajty, ponieważConsole.WriteLine()
jest dłuższy. Miałem bardziej naiwne wdrożenie, ale trwało to około dwa razy dłużej, więc ...źródło
Excel VBA, 68 bajtów
Grał w golfa
Anonimowa funkcja bezpośredniego okna VBE, która przenosi dane wejściowe z komórki
[A1]
i dane wyjściowe do bezpośredniego okna VBEBez golfa
źródło
Perl 5 , 53 + 1 (
-n
) = 54 bajtówWypróbuj online!
źródło