Herausforderung
Sie erstellen ein Programm / eine Funktion, die eine Zeichenfolge mit der Länge eingibt n
, und:
- Stellt den
kth
Saibling in die Mitte des Feldes, wok = (n+1)/2
. Dies ist der Ort Ihres Ground Zero. - Setzt den Rest der Nicht-Whitespace-Zeichen in zufälliger Reihenfolge um Ground Zero. Der pythagoreische Abstand zum Saibling darf nicht überschritten werden
n
. - 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 Code-Golf ; 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
Antworten:
APL (Dyalog Classic) ,
6866656362 BytesProbieren Sie es online!
{ }
anonyme Funktion mit Argument⍵
n←≢⍵
Variablen
ist die Länges←2⍴1+2×n
Variables
ist die Form des Ergebnisses: 2n + 1 mal 2n + 1''⍴⍨s
schaffen Sie ein Quadrat von Räumen mit dieser FormA@I⊢B
Setzt ElementeA
an (Indexpaaren)I
in 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 Matrixi[n?≢i← ... ]
wähle n von ihnen zufällig aus (keine Duplikate)n⊣¨¨@(⊢≡¨⌽)
ändere den zentralen aufn n
⍵@( ... )⊢ ...
Setzen Sie die Zeichen aus dem Argument an die angegebenen Indizes in die Matrix der Leerzeichenquelle
JavaScript (ES6), 211
216 220Editiere 1 Byte gespeichert dank @usandfriends
Prüfung
quelle
g.map(r=>r.join``)...
new Date()%h-l
anstelle vonMath.random()*h-l|0
. Das spart Bytes.Rubin,
211207203196 ZeichenDanke an edc65 für 4 Zeichen
Erläuterung:
->(x){...}
Definieren Sie eine anonyme Funktion, die ein Argument aufnimmtx
x=x.chars
Umwandlungx
von einer Zeichenfolge in ein Array von Zeichenfolgen mit einem Zeicheno,b,c=x.size
Speichern Sie die Länge der Eingabeo
für eine spätere Verwendung.b
undc
einfach 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 einl
x-l
großes 2D-Array mit Leerzeichen.a[o][o]=x.delete_at o/2
Legt den Mittelpunkt des Arrays auf den Mittelpunkt der Werte vonx
(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,while
weil er inline ist) immer wieder aus, bis erx
leer ist. In Ruby gibt der Zugriff auf einen nicht vorhandenen Indexnil
einen falschen Wert zurück.a[b=rand(l)][c=rand(l)]==' '
Ordnen Sieb
undc
zufälligen Werten zu, wobei 0 <= n <l
. Dann prüfen Sie, ob der Spot anb
,c
leer ist (auch bekannt als Set Leerzeichen ist)(b-o)**2+(c-o)**2<=o*o
Pythagoreische Distanzprüfung.o
ist die Länge der Eingabe.**
ist der Potenzierungsoperator von Ruby undval<=o*o
ist kürzer alsval**0.5<=o
.a[b][c]=x.pop
lösche den letzten Wert vonx
. Stellen Sie die Positiona
,b
auf 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 Arraysa
einer einzelnen String-Version zu (z . B.['a','b','c']
->'abc'
). Nimm das neue Array und verbinde es mit Zeilenumbrüchen. Implizite Rückkehr.quelle
Python 3 , 286 Bytes
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ürlichl=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. Diecenter()
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 hinzuo
. 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.quelle