Wybuchające koty!

17

Wyzwanie

Będziesz tworzyć program / funkcję, która pobiera ciąg znaków o długości ni:

  1. Umieszcza kthznak na środku przestrzeni, gdzie k = (n+1)/2. To będzie lokalizacja twojego zerowego poziomu.
  2. Reszta znaków niebiałych na znaki umieszcza losowo wokół zera. Odległość pitagorejska od znaku nie może przekraczać n.
  3. 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 ; 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
Mama Fun Roll
źródło
Wybierając pozycję losowo, jeden znak może przejść w tej samej pozycji drugiego i zastąpić go. Czy to jest dozwolone? (Moja sugestia: nie)
edc65
Masz rację: Nie.
Mama Fun Roll
1
Co to do cholery ma wspólnego z wysadzeniem mnie w powietrze? (Naprawdę nie rozumiem znaczenia tytułu ...)
cat
1
@cat To jest modyfikacja programu cat, z tym wyjątkiem, że rozbijasz dane wejściowe.
Mama Fun Roll

Odpowiedzi:

0

APL (Dyalog Classic) , 68 66 65 63 62 bajty

{⍵@(n⊣¨¨@(⊢≡¨⌽)i[n?≢i←⍸(××n≥*∘.5)+.ר⍨n-⍳s])⊢''⍴⍨s21+2×n←≢⍵}

Wypróbuj online!

{ } funkcja anonimowa z argumentem

n←≢⍵zmienna njest długością

s←2⍴1+2×nzmienna sjest kształtem wyniku: 2n + 1 o 2n + 1

''⍴⍨s utwórz kwadrat przestrzeni o tym kształcie

A@I⊢Bumieszcza elementy Aw (parach) indeksów Iw 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 boolowskiej

i[n?≢i← ... ] wybierz n z nich losowo (bez duplikatów)

n⊣¨¨@(⊢≡¨⌽) zmień środkową na n n

⍵@( ... )⊢ ... wstaw znaki z argumentu przy danych indeksach w macierzy spacji

ngn
źródło
3

JavaScript (ES6), 211 216 220

Edytuj 1 bajt zapisany thx @usandfriends

s=>[...s].map((c,i)=>{for(R=_=>Math.random()*h-l|0;x=R(y=R()),!(i-(l/2|0)?x|y&&x*x+y*y<=l*l&g[y+=l][x+=l]<'!':x=y=l););z=[...g[y]],z[x]=c,g[y]=z.join``},l=s.length,g=Array(h=l-~l).fill(' '.repeat(h)))&&g.join`
`

Test

f=s=>[...s].map((c,i)=>{for(R=_=>Math.random()*h-l|0;x=R(y=R()),!(i-(l/2|0)?x|y&&x*x+y*y<=l*l&g[y+=l][x+=l]<'!':x=y=l););z=[...g[y]],z[x]=c,g[y]=z.join``},l=s.length,g=Array(h=l-~l).fill(' '.repeat(h)))&&g.join`
`

// Less golfed
U=s=>(
  l=s.length,
  h=l-~l, // l+l+1
  g=Array(h).fill(' '.repeat(h)),
  [...s].map((c,i)=>{
    for(R=_=>Math.random()*h-l|0;
        x=R(y=R()), // set x,y to a random value in range -l ... l
        !(i - (l/2|0) // check if at mid point of input string
          ? x|y && // if not, check x and y must not be both 0
            x*x + y*y <= l*l &  // then check position inside the circle of ray L
            g[y+=l][x+=l] < '!' // then add offset L and check if position is not already used 
          : x=y=l // if at midpoint in input string, x and y have fixed value L
         );
       ); // loop until valid position found
    z = [...g[y]];  // modify string at current position: convert to array ...
    z[x] = c;       // ... set element ...
    g[y] = z.join`` // ... back to string
  }),
  g.join`\n`
)  

setInterval(_=>O.textContent=(f(I.value)),1000)
Word <input id=I value='qwert'><pre id=O></pre>

edc65
źródło
Masz wcześniej dodatkowe miejsceg.map(r=>r.join``)...
usandfriends
@usandfriends thx Nie wiem jak mi tego brakowało
edc65
Użyj new Date()%h-lzamiast Math.random()*h-l|0. Oszczędza bajty.
ericw31415
1
@ ericw31415 użyj tylko 0. To także oszczędza bajty. Ale oba nie będą działać
edc65
2

Rubin, 211 207 203 196 znaków

Dzięki edc65 za 4 znaki

->(x){x=x.chars
o,b,c=x.size
l=o*2+1
a=Array.new(l){Array.new l,' '}
a[o][o]=x.delete_at o/2
a[b][c]=x.pop if a[b=rand(l)][c=rand(l)]==' '&&(b-o)**2+(c-o)**2<=o*o while x[0]
a.map(&:join).join $/}

Wyjaśnienie:

->(x){...} zdefiniuj anonimową funkcję, która przyjmuje argument x

x=x.charsprzekształcić xz ciągu w tablicę ciągów jednoznakowych

o,b,c=x.size zapisz długość wejścia w o do późniejszego wykorzystania. bi cpo 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ć ll tablicę 2D o rozmiarze x .

a[o][o]=x.delete_at o/2 ustawia środek tablicy na środek wartości x (danych wejściowych), jednocześnie usuwając tę ​​wartość zx

... while x[0] uruchom blok (w tym przypadku kod wcześniej while ponieważ jest on wbudowany) w kółko, aż xbędzie pusty. W Rubim dostęp do indeksu, który nie istnieje, zwraca nilwartość falsey.

a[b=rand(l)][c=rand(l)]==' 'Przypisz bi cdo wartości losowych, gdzie 0 <= n <l . Następnie sprawdź, czy miejsce w b, cjest puste (aka jest ustawione na spację)

(b-o)**2+(c-o)**2<=o*oPitagorejska kontrola odległości. ojest długością wejścia.**jest operatorem potęgowania Rubiego i val<=o*ojest krótszy niż val**0.5<=o.

a[b][c]=x.popusuń ostatnią wartość z x. 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 tablice ana ich pojedynczą wersję (np. ['a','b','c']-> 'abc'). Weź tę nową tablicę i dołącz do niej z nowymi liniami. Implikowany zwrot.

Shelvacu
źródło
o * o jest krótszy niż ** 0,5
edc65
0

Python 3 , 286 bajtów

import random as r
i=input()
l=len(i)
a=range(-l,l+1)
g=[(y,x)for y in a for x in a]
p=[(y,x)for y,x in g if abs(x+y*1j)<=l and x|y]
m=i[l//2]
d=[*i.replace(m,"",1).center(len(p))]
r.shuffle(d)
o=""
for c in g:
	o+=m if c==(0,0)else d.pop()if c in p else" "
	if c[1]==l:o+="\n"
print(o)

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ładem l=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. Ta center()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ściowego o. 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.

Reecer6
źródło