Wyzwanie
Będziesz tworzyć program / funkcję, która pobiera ciąg znaków o długości n
i:
- Umieszcza
kth
znak na środku przestrzeni, gdziek = (n+1)/2
. To będzie lokalizacja twojego zerowego poziomu. - Reszta znaków niebiałych na znaki umieszcza losowo wokół zera. Odległość pitagorejska od znaku nie może przekraczać
n
. - Wysyła wynik.
Jeśli potrzebujesz wyjaśnień, zobacz poniższy przykład.
Zasady
- Obowiązują standardowe luki!
- I / O musi być w postaci ciągu.
- Dane wejściowe zawsze będą nieparzyste, aby upewnić się, że masz centralny znak do ustawienia na poziomie zerowym.
- Każde prawidłowe wyjście powinno wystąpić z niezerowym prawdopodobieństwem.
To jest golf golfowy ; najkrótszy kod w bajtach wygrywa!
Przykład
Wejście: qwert
Granice eksplozji wychodzące z zerowego punktu zerowego (x oznacza prawidłowe miejsca dla pozostałych znaków):
x
xxxxxxx
xxxxxxxxx
xxxxxxxxx
xxxxxxxxx
xxxxxexxxxx
xxxxxxxxx
xxxxxxxxx
xxxxxxxxx
xxxxxxx
x
Przykładowe dane wyjściowe:
t
r
q e
w
Odpowiedzi:
APL (Dyalog Classic) ,
6866656362 bajtyWypróbuj online!
{ }
funkcja anonimowa z argumentem⍵
n←≢⍵
zmiennan
jest długościąs←2⍴1+2×n
zmiennas
jest kształtem wyniku: 2n + 1 o 2n + 1''⍴⍨s
utwórz kwadrat przestrzeni o tym kształcieA@I⊢B
umieszcza elementyA
w (parach) indeksówI
w macierzyB
+.ר⍨n-⍳s
kwadratowe odległości od środka matrycy(××n≥*∘.5)
macierz boolowska wskazująca, gdzie odległości te są niezerowe i≤n
⍸
pary współrzędnych dla 1 w macierzy boolowskieji[n?≢i← ... ]
wybierz n z nich losowo (bez duplikatów)n⊣¨¨@(⊢≡¨⌽)
zmień środkową nan n
⍵@( ... )⊢ ...
wstaw znaki z argumentu przy danych indeksach w macierzy spacjiźródło
JavaScript (ES6), 211
216 220Edytuj 1 bajt zapisany thx @usandfriends
Test
źródło
g.map(r=>r.join``)...
new Date()%h-l
zamiastMath.random()*h-l|0
. Oszczędza bajty.Rubin,
211207203196 znakówDzięki edc65 za 4 znaki
Wyjaśnienie:
->(x){...}
zdefiniuj anonimową funkcję, która przyjmuje argumentx
x=x.chars
przekształcićx
z ciągu w tablicę ciągów jednoznakowycho,b,c=x.size
zapisz długość wejścia wo
do późniejszego wykorzystania.b
ic
po prostu trzeba coś zainicjować , więc zapisz 2 znaki, dołączając do poprzedniego zadania.l=o*2+1
jest to długość / szerokość pola, do którego mogłyby pójść wszystkie postacie, a także średnica koła wybuchu.Array.new(l){Array.new l,' '}
zrobićl
l
tablicę 2D o rozmiarze x .a[o][o]=x.delete_at o/2
ustawia środek tablicy na środek wartościx
(danych wejściowych), jednocześnie usuwając tę wartość zx
... while x[0]
uruchom blok (w tym przypadku kod wcześniejwhile
ponieważ jest on wbudowany) w kółko, ażx
będzie pusty. W Rubim dostęp do indeksu, który nie istnieje, zwracanil
wartość falsey.a[b=rand(l)][c=rand(l)]==' '
Przypiszb
ic
do wartości losowych, gdzie 0 <= n <l
. Następnie sprawdź, czy miejsce wb
,c
jest puste (aka jest ustawione na spację)(b-o)**2+(c-o)**2<=o*o
Pitagorejska kontrola odległości.o
jest długością wejścia.**
jest operatorem potęgowania Rubiego ival<=o*o
jest krótszy niżval**0.5<=o
.a[b][c]=x.pop
usuń ostatnią wartość zx
. Ustaw pozycjęa
,b
do tej wartości w tablicya
a[b][c]=x.pop if a[b=rand(l)][c=rand(l)]==' '&&(b-o)**2+(c-o)**2<=o*o while x[0]
Ustaw losową pozycję na ostatnią wartość, jeśli ta pozycja jest wolna i mieści się w promieniu wybuchu; rób to dalej, aż zabraknie postaci do umieszczenia.$/
jest ustawiony na nową linię systemu operacyjnego. Jest także krótszy niż"\n"
a.map(&:join).join $/
Odwzoruj wszystkie tablicea
na ich pojedynczą wersję (np.['a','b','c']
->'abc'
). Weź tę nową tablicę i dołącz do niej z nowymi liniami. Implikowany zwrot.źródło
Python 3 , 286 bajtów
Wypróbowanie go online jest opcją.
Ups, natknąłem się na to z powodu niedawnej działalności, nie zauważyłem, że ma ponad dwa lata, dopóki nie spędziłem nad tym czasu. Cóż, dwie odpowiedzi są trochę smutne, więc i tak jest to prawdopodobnie dobry pomysł na opublikowanie. Jestem pewien, że istnieją dziesiątki sposobów na poprawę tej sytuacji - do tej pory nie zauważyłem, że dane wejściowe są zawsze dziwne, co warto wiedzieć.
Wyjaśnienie
i=input()
jest oczywiście wkłademl=len(i)
oszczędza długość łańcucha, ponieważ jest używany kilka razy.a=range(-l,l+1)
- szybkie narzędzie do tworzenia iteratora, w którym dostępne odległości są oddalone od początku w obie strony w jednym wymiarze.g=[(y,x)for y in a for x in a]
tworzy listę współrzędnych krotkowych, które tworzą całą ostateczną siatkę.p=[(y,x)for y,x in g if abs(x+y*1j)<=l and x|y]
tworzy podzbiór listy zawierający tylko współrzędne, na których mogą znajdować się litery niecentralne.m=i[l//2]
ustanawia środkową postać.d=[*i.replace(m,"",1).center(len(p))]
- środkowa postać została zdjęta, pozostawiając nam resztki gruzu. Tacenter()
funkcja jest tutaj bardzo przyjemna, ponieważ pozwala nam wypisać linię (domyślnie spacją), aż będzie miała określoną liczbę znaków. Oto liczba spacji, na których mogą znajdować się litery, odzwierciedlając w ten sposób rozkład, którego potrzebujemy.r.shuffle(d)
naturalnie tasuje tę dystrybucję jako faktycznie ... dystrybuowaną.Pętla,
for c in g: o+=m if c==(0,0)else d.pop()if c in p else" "
patrzy na cały kwadrat wykonalnych kafelków, niezależnie od wszystkiego, co może na nim wylądować lub nie, i w razie potrzeby dodaje znak do naszego ciągu wyjściowegoo
. Znaki wyskakują z naszej próbki śmieci, dzięki czemu pojawiają się tylko raz.if c[1]==l:o+="\n"
- Dodaje również podział linii. Zwroty.źródło