Explodierende Katzen!

17

Herausforderung

Sie erstellen ein Programm / eine Funktion, die eine Zeichenfolge mit der Länge eingibt n, und:

  1. Stellt den kthSaibling in die Mitte des Feldes, wo k = (n+1)/2. Dies ist der Ort Ihres Ground Zero.
  2. Setzt den Rest der Nicht-Whitespace-Zeichen in zufälliger Reihenfolge um Ground Zero. Der pythagoreische Abstand zum Saibling darf nicht überschritten werden n.
  3. Gibt das Ergebnis aus.

Wenn Sie Erläuterungen benötigen, sehen Sie sich das folgende Beispiel an.


Regeln

  • Es gelten Standardlücken!
  • I / O muss in Form eines Strings vorliegen.
  • Die Eingabe ist immer ungerade, um sicherzustellen, dass Sie ein zentrales Zeichen auf Null setzen können.
  • Jede gültige Ausgabe sollte mit einer Wahrscheinlichkeit ungleich Null erfolgen.

Das ist ; kürzester Code in Bytes gewinnt!


Beispiel

Eingang: qwert

Die Grenzen der Explosion, die vom Nullpunkt ausgehen (x markiert gültige Stellen für den Rest der Zeichen):

     x
  xxxxxxx
 xxxxxxxxx
 xxxxxxxxx
 xxxxxxxxx
xxxxxexxxxx
 xxxxxxxxx
 xxxxxxxxx
 xxxxxxxxx
  xxxxxxx
     x

Beispielausgabe:

       t
     r

q    e


      w
Mama Fun Roll
quelle
Wenn Sie die Position zufällig auswählen, kann sich ein Zeichen an der gleichen Position wie ein anderes befinden und diese überschreiben. Ist das erlaubt? (Mein Vorschlag: nein)
edc65
Sie haben Recht: Nein.
Mama Fun Roll
1
Was um alles in der Welt hat das damit zu tun, mich in die Luft zu jagen? (Ich verstehe die Relevanz des Titels wirklich nicht ...)
Katze
1
@cat Dies ist eine Modifikation eines Cat-Programms, mit der Ausnahme, dass Sie die Eingabe auflösen.
Mama Fun Roll

Antworten:

0

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

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

Probieren Sie es online!

{ } anonyme Funktion mit Argument

n←≢⍵Variable nist die Länge

s←2⍴1+2×nVariable sist die Form des Ergebnisses: 2n + 1 mal 2n + 1

''⍴⍨s schaffen Sie ein Quadrat von Räumen mit dieser Form

A@I⊢BSetzt Elemente Aan (Indexpaaren) Iin die MatrixB

+.ר⍨n-⍳s Quadratische Abstände von der Mitte der Matrix

(××n≥*∘.5) Boolesche Matrix, die angibt, wo diese Abstände ungleich Null sind und ≤n

Koordinatenpaare für die Einsen in der Booleschen Matrix

i[n?≢i← ... ] wähle n von ihnen zufällig aus (keine Duplikate)

n⊣¨¨@(⊢≡¨⌽) ändere den zentralen auf n n

⍵@( ... )⊢ ... Setzen Sie die Zeichen aus dem Argument an die angegebenen Indizes in die Matrix der Leerzeichen

ngn
quelle
3

JavaScript (ES6), 211 216 220

Editiere 1 Byte gespeichert dank @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`
`

Prüfung

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
quelle
Sie haben einen zusätzlichen Platz vorg.map(r=>r.join``)...
usandfriends
@ usandfriends thx Ich weiß nicht, wie ich es verpasst habe
edc65
Verwenden Sie new Date()%h-lanstelle von Math.random()*h-l|0. Das spart Bytes.
ericw31415
1
@ ericw31415 benutze nur 0. Das spart auch Bytes. Aber beide werden nicht funktionieren
edc65
2

Rubin, 211 207 203 196 Zeichen

Danke an edc65 für 4 Zeichen

->(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 $/}

Erläuterung:

->(x){...} Definieren Sie eine anonyme Funktion, die ein Argument aufnimmt x

x=x.charsUmwandlung xvon einer Zeichenfolge in ein Array von Zeichenfolgen mit einem Zeichen

o,b,c=x.sizeSpeichern Sie die Länge der Eingabe ofür eine spätere Verwendung. bund ceinfach müssen initialisiert werden , etwas , so speichern 2 Zeichen von einer früheren Zuordnung zu befestigen.

l=o*2+1 Dies ist die Länge / Breite des Feldes, in das alle Zeichen gelangen können, sowie der Durchmesser des Explosionskreises.

Array.new(l){Array.new l,' '}Erstellen Sie ein lx- lgroßes 2D-Array mit Leerzeichen.

a[o][o]=x.delete_at o/2Legt den Mittelpunkt des Arrays auf den Mittelpunkt der Werte von x(der Eingabe) fest, während dieser Wert aus gelöscht wirdx

... while x[0]Führen Sie den Block (in diesem Fall den Code davor, whileweil er inline ist) immer wieder aus, bis er xleer ist. In Ruby gibt der Zugriff auf einen nicht vorhandenen Index nileinen falschen Wert zurück.

a[b=rand(l)][c=rand(l)]==' 'Ordnen Sie bund czufälligen Werten zu, wobei 0 <= n < l. Dann prüfen Sie, ob der Spot an b, cleer ist (auch bekannt als Set Leerzeichen ist)

(b-o)**2+(c-o)**2<=o*oPythagoreische Distanzprüfung. oist die Länge der Eingabe. **ist der Potenzierungsoperator von Ruby und val<=o*oist kürzer als val**0.5<=o.

a[b][c]=x.poplösche den letzten Wert von x. Stellen Sie die Position a, bauf diesen Wert in Arraya

a[b][c]=x.pop if a[b=rand(l)][c=rand(l)]==' '&&(b-o)**2+(c-o)**2<=o*o while x[0]Setzen Sie eine zufällige Position auf den letzten Wert, wenn diese Position frei ist und innerhalb des Explosionsradius liegt. Mach so weiter, bis wir keine Charaktere mehr haben.

$/ist auf die Newline des Betriebssystems eingestellt. Es ist auch kürzer als"\n"

a.map(&:join).join $/Ordnen Sie alle Arrays aeiner einzelnen String-Version zu (z . B. ['a','b','c']-> 'abc'). Nimm das neue Array und verbinde es mit Zeilenumbrüchen. Implizite Rückkehr.

Shelvacu
quelle
o * o ist kürzer als ** 0.5
edc65
0

Python 3 , 286 Bytes

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)

Es ist eine Option, es online zu versuchen.

Whoops, der aufgrund der jüngsten Aktivitäten darauf gestoßen war, bemerkte nicht, dass es irgendwie über zwei Jahre alt war, bis ich eine Weile damit verbracht hatte. Nun, zwei Antworten sind irgendwie traurig, daher ist es wahrscheinlich eine gute Idee, sie trotzdem zu posten. Ich bin mir sicher, dass es Dutzende von Möglichkeiten gibt, dies zu verbessern - bis jetzt ist mir noch nicht aufgefallen, dass Eingaben immer ungerade sind, was zu wissen hilfreich gewesen wäre.

Erläuterung

i=input()Bei der Eingabe wird natürlich l=len(i)die Länge der Zeichenfolge gespart, da sie einige Male verwendet wird.

a=range(-l,l+1) - Ein schnelles Werkzeug zum Erstellen eines Iterators, mit dem die verfügbaren Abstände vom Ursprung in beide Richtungen entlang einer Dimension berechnet werden können.

g=[(y,x)for y in a for x in a] Erstellt eine Liste mit Tupelkoordinaten, aus denen das gesamte endgültige Raster besteht.

p=[(y,x)for y,x in g if abs(x+y*1j)<=l and x|y] Erstellt eine Teilmenge der Liste, die nur die Koordinaten enthält, auf denen möglicherweise nicht zentrierte Buchstaben landen können.

m=i[l//2] Legt den Mittelcharakter fest.

d=[*i.replace(m,"",1).center(len(p))]- Der Mittelcharakter wird entfernt und wir bleiben mit den anderen Trümmern zurück. Die center()Funktion ist hier sehr schön, da wir die Zeile (standardmäßig mit einem Leerzeichen) auffüllen können, bis sie eine bestimmte Anzahl von Zeichen lang ist. Das ist hier die Anzahl der Leerzeichen, auf denen die Buchstaben landen können, was die Verteilung widerspiegelt, die wir benötigen.

r.shuffle(d) natürlich mischt besagte Verteilung, um wirklich… verteilt zu werden.

Die Schleife for c in g: o+=m if c==(0,0)else d.pop()if c in p else" "überblickt das gesamte Quadrat der möglichen Kacheln, unabhängig davon, ob irgendetwas darauf landet oder nicht, und fügt unserer Ausgabezeichenfolge nach Bedarf ein Zeichen hinzu o. Charaktere werden aus unserer Trümmerprobe herausgeschleudert, so dass sie nur einmal erscheinen.

if c[1]==l:o+="\n"- Fügt auch Zeilenumbrüche hinzu. Kehrt zurück.

Reecer6
quelle