Normalerweise wird gesagt, dass "X ohne Y machen" Anfängern, die Herausforderungen schreiben, eine Falle sein kann ( Quelle ). Ich bin jedoch übermütig und denke, dass ich definitiv ein X ohne Ys machen kann. Nach dem Zufallsprinzip. Oh ja, das wird gut.
Herausforderung: Geben Sie bei einer ungeraden Ganzzahl n
größer oder gleich 1 ein Ex der Seitenlänge n
aus, die aus zufälligen druckbaren ASCII-Zeichen ohne "y" und "Y" und dem Leerzeichen besteht. Alle zulässigen Zeichen müssen eine Wahrscheinlichkeit ungleich Null aufweisen, jedoch nicht unbedingt einheitlich. Dies ist ein Code-Golf, so dass der kürzeste Code in Bytes gewinnt. Sie sollten jedoch jedes Zeichen nach dem Zufallsprinzip sortieren - das heißt, die Streben des Ex sollten nicht gleich sein, es sei denn, es ist ein Zufall.
Die anzuzeigenden Zeichen
!#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXZ[\]^_`abcdefghijklmnopqrstuvwxz{|}~"
Aufbau des Ex
Seitenlänge 1:
x
Seitenlänge 3:
x x
x
x x
Seitenlänge 5:
x x
x x
x
x x
x x
usw.
Beispielausgaben
input
output
empty line
3
h 2
^
9 5
1
:
5
D 1
W z
W
q j
W 1
Beispielimplementierung
Sie müssen keine ungültigen Eingaben verarbeiten.
!
bis~
ohney
undY
y
und enthalten然
.Antworten:
Pyth,
28272625 BytesTestsuite.
quelle
~
Charakter hervorbringen wird , da der Bereich ihn nicht enthält. Sie können dies beheben, indem Sie~
im Code das Zeichen DEL als Literal eingeben.Ruby, 102 Bytes
Array#sample
Es werden keine Wiederholungen für das Abtasten aus dem Zeichensatz durchgeführt, aber das ist in Ordnung, da die Zeichenverteilung nicht perfekt gleichmäßig sein muss! Rekursive Funktion, gibt ein Array von Zeilen zurück.Probieren Sie es online!
quelle
Eigentlich 62 Bytes
Dies ist eines der längsten Actually-Programme, die ich je geschrieben habe.
Probieren Sie es online!
Erläuterung:
Teil 1 : Einrichten der Charakterliste
Probieren Sie es online!
Teil 2 : Konstruieren des Booleschen Arrays für ein X
Probieren Sie es online!
Teil 3 : Zufällige Zeichen auswählen
Probieren Sie es online!
quelle
Mathematica, 146 Bytes
Anonyme Funktion. Nimmt eine Zahl als Eingabe und gibt eine Zeichenfolge als Ausgabe zurück.
quelle
Python 2, 171 Bytes
Garantiert zufällige Zeichen mit einheitlicher Wahrscheinlichkeit zu wählen.
Probieren Sie es hier aus: ideone link
EDIT: Danke an Morgan Thrapp für die Korrekturen.
quelle
from random import*
Spart 2 Bytes. Sie können auch die ersten beiden Zeilen derj
Schleife mit einem Semikolon verbinden, um einige Bytes zu sparen. (Auch ich glaubeZ
und{
habe eine höhere Chance als einige andere Buchstaben auftreten, nicht, dass es für die Frage von Bedeutung ist)bool(i^j and i^-j)
->i not in(j,-j)
Python,
142139135 BytesDies ist eine einfache Implementierung, um das Quadrat Zeichen für Zeichen zu erstellen. Befindet sich das Zeichen in einer Diagonale : Verwenden Sie ein zufälliges Zeichen , ansonsten : Verwenden Sie ein Leerzeichen. Dies verwendet auch eine Regex-Ersetzung und ein zufälliges int, um Nicht- YZeichen zu generieren :
Erklärung [alt]
Aktualisieren
import*
- Danke an @KevinLauquelle
randint
ist wahrscheinlich kürzer für Ihre Zwecke, plusfrom random import*
. Entfernen Sie auch einen Teil dieses unnötigen Leerraums.[i,33][i in(89,121)]
funktioniert stattdessen und braucht einen langwierigen Dreiklang in deinerf
Funktion! Sehen Sie auch nach, ob Sie das Leerzeichen entfernen können, das direkt nach Ihrenprint
Anweisungen stehtre.sub("y|Y","t",chr(random.randint(33,126))+' ')[j!=i!=x-j-1]
Spart 6 Bytes über das... if ... else ...
Konstrukt.Dyalog APL , 35 Bytes
⎕
Eingabeaufforderung für die Zahl⍳
1 durch diese∘.=⍨
Zahlengleichheitstabelle (dh die Diagonale hat 1s)(⊢∨⌽)
selbst ODER ihr Spiegelbild (gibt beide Diagonalen an)95×
multiplizieren Sie mit 95?
Rand Int zwischen 1 und 95 für die Diagonalen, Rand Float zwischen 0 und 1 für die Restetage⌊
zu loszuwerden der Schwimmer(⊢+∊∘57 89)
fügen Sie ein zu den Elementen , die ein Mitglied von {57,89} sind (yy - 32)32+
hinzufügen , 32 , um die 0er in Räume und andere Zahlen in den richtigen Bereich zu machen⎕UCS
in Text umwandelnTryAPL !
quelle
Python 2.7, 205 Bytes:
Probieren Sie es online! (Ideone)
quelle
MATL , 28 Bytes
Probieren Sie es online!
Alle zulässigen Zeichen haben die gleiche Wahrscheinlichkeit des Auftretens. Funktioniert auch für gleichmäßige Eingaben.
quelle
C, 154 Bytes (oder 119 ohne Kesselplatte)
Oder 119 Bytes als eine Funktion
X(h)
mitsrand(time(0))
betreut an anderer Stelle:Nervenzusammenbruch:
quelle
x86-Maschinencode, 70 Byte
Mein ausführbarer Code, zerlegt:
Es ist eine Funktion, die in ecx die Größe des X und in edx einen Zeiger auf den Ausgabepuffer erhält.
Es füllt den Ausgabepuffer sequentiell mit Bytes. Es gibt
2 * n - 1
Iterationen (gleich der Anzahl der auszugebenden Nicht-Leerzeichen). Bei jeder Iteration wird Folgendes ausgeführt:Die Umwandlung einer Zufallszahl in ein zufälliges Zeichen ist nicht bemerkenswert:
Der interessante Teil ist die Berechnung der Anzahl der Räume. Es muss die folgenden Zahlen erzeugen (Beispiel für N = 9):
Die Zahlen werden abwechselnd von zwei arithmetischen Folgen genommen. Der erste geht mit Schritt -2 runter und der zweite geht mit Schritt 1 rauf. Wenn der erste Fortschritt bei -1 (in der Mitte des X) ankommt, gibt es einen Fehler (-1 wird entfernt), und dann Die Progressionen ändern ihre Richtung.
Die Progressionen werden in Registern
ebx
undedx
- den oberen Teilen gespeichertbh
unddh
speichern die aktuelle Nummer und die unteren Teilebl
unddl
speichern den Schritt. Um zwischen den Fortschritten zu wechseln, tauscht der Code die Register mitxchg
.Wenn der Fortschritt -1 (um das
mylab
Etikett herum ) erreicht, werden beide Register vergrößert und die Schritte von-2, 1
auf umgeschaltet-1, 2
. Dies ändert auch die Rollen der Register, so dass dann die oberen Teile der Register vertauscht werden.Am Ende der Funktion wird ein Null-Byte gespeichert, um ein Ende der Zeichenfolge anzuzeigen.
quelle
Lua, 277 Bytes
Nun ... Lua ist soooo gut darin, Saiten zu manipulieren: D. Zum ersten Mal musste ich
local
in einer Aussage verwenden! Ich konnte mit Lua 5.1 anstelle von 5.3 einige Bytes einsparen, weil sie die globale Funktionunpack
in das Objekttable
von Lua 5.2 verschoben haben . Aber ich bleibe lieber bei der neuesten Version :).Definiert eine Funktion, die mit einem einzelnen Parameter aufgerufen werden soll (der zweite wird für Rekursionszwecke verwendet) und gibt eine Zeichenfolge zurück.
Ungolfed
quelle
JavaScript (ES6),
137131125 ByteWobei
\n
das wörtliche Zeilenumbruchzeichen darstellt. Bearbeiten: 1 Byte durch Verschieben' '
desString.fromCharCode
Ausdrucks gespeichert . 5 Bytes gespart, indem ich meine zufällige Zeichengenerierung ungleichmäßig gemacht habe; Der Ausdruckr+72&95
ist Null für die Werte, die zugeordnet sind,Y
undy
und!
wird an ihrer Stelle generiert. 4 Bytes gespart, als mir klar wurde, dass es nicht nötig ist, sich überString.fromCharCode
mehrere Bytes zu verbreitenjoin
. 2 Bytes gespart, indem ein Trick von @ edc65 gestohlen wurde.quelle
PowerShell v2 +, 112 Byte
Liest Eingaben von der Kommandozeile.
Für jede Zeile wird ein Array von Leerzeichen erstellt, die korrekten Indizes werden mit Zeichen gefüllt, die aus der Funktion
f
abgerufen wurden. Anschließend wird das Zeichen- Array verbunden, um als eine Zeile ausgegeben zu werden.quelle
[char]
Besetzung nach außen verschiebenRandom
und den-join
Operator "Param($i)function f{[char](Random(33..126-ne121-ne89))};1..$i|%{$a=,' '*$i;$a[$_-1]=f;$a[$i-$_]=f;-join$a}
function
durch das PowerShell-Äquivalent eines Lambdas ersetzen und den Aufrufoperator verwenden&
, um es aufzurufen. Das Folgende ist 103 Bytes -Param($i)$z={[char](Random(33..126-ne121-ne89))};1..$i|%{$a=,' '*$i;$a[$_-1]=&$z;$a[$i-$_]=&$z;-join$a}
-ne
, Bewegen die[char]
Besetzung eine seine[char[]]
Besetzung auf$a
(Swapping' '
für32
im Prozess), und bewegt$z
es heißt ‚s Definition in eine Pars zum ersten Mal. Bis 99 (woo! Sub-100!) -Param($i)1..$i|%{$a=,32*$i;$a[$_-1]=&($z={Random(33..126-ne121,89)});$a[$i-$_]=&$z;-join[char[]]$a}
$a
die Definition bei der ersten Verwendung in eine parens verschieben. Runter auf 98 jetzt -Param($i)1..$i|%{($a=,32*$i)[$_-1]=&($z={Random(33..126-ne121,89)});$a[$i-$_]=&$z;-join[char[]]$a}
ich denke ich höre hier auf ;-) heheMATLAB, 86 Bytes
Einige Beispiele:
quelle
changem
! Toller Name!Pip , 33 Bytes
32 Byte Code, +1 für
-l
Flag. Seltsamerweise beginnt der Code mitY
und endet mity
...Übernimmt die Eingabe als Befehlszeilenargument. Probieren Sie es online!
Erläuterung
Konstruiert ein Raster der entsprechenden Größe. Ersetzt Elemente auf den Diagonalen durch ein zufälliges Nicht-Y-Zeichen und alle anderen Elemente durch Leerzeichen.
quelle
PHP, 135 Bytes
Ziemlich unkomplizierter Ansatz verwendet str_pad, um eine Zeichenfolge mit der erforderlichen Länge zu erstellen, ersetzt die erforderlichen Zeichen durch zufällige und ersetzt alle Ys (ohne Berücksichtigung der Groß- und Kleinschreibung) durch Xs und gibt die Zeile als Echo aus.
Erzeugt 2n + 3 Notices, aber wie immer ist das in Ordnung.
quelle
Emacs Lisp, 269 Bytes
Ungolfed und leicht modifiziert:
quelle
JavaScript (ES6), 128
131Bearbeite 3 Bytes, die dank @Neil gespeichert wurden
So sperrig, wahrscheinlich nicht der beste Ansatz. Bonus - es funktioniert mit ungeraden oder geraden Eingaben.
quelle
r+7&31
gibt das gleiche Ergebnis wie(r&31)-25
.C 268 Bytes
Rufen Sie
f()
mit der Größe derx
zu zeichnen.quelle
srand
Ihre Funktionen aufrufen , sie können sich nicht auf den globalen Status verlassen. Sie können jedoch mit zwei verschachtelten Schleifen und dem Backspace-Zeichen ein viel kürzeres Programm erzielen. Eine allgemeine Lösung aussehen könnte dies , aber ich denke , eine Windows - spezifische Variante mitclock
wäre gültig.gcc version 4.8.1
für Windows undgcc version 5.3.0
für Cygwin ist es nicht funktioniert ... (auf IdeOne Works)Matricks , 79 Bytes (nicht konkurrierend)
Matricks zeichnet sich als der Beginn der x machen und alle Zufallswerte, aber Flops , wenn es um conditionals kommt ...
Ich habe dies als nicht konkurrierend markiert, weil ich einige Fehler beheben und alle neuen Funktionen zum Laufen bringen musste, nachdem diese Herausforderung veröffentlicht wurde.
Laufen Sie mit
python matricks.py x.txt [[]] <input> --asciiprint
Erläuterung:
Dies unterstützt auch gerade Zahlen.
quelle
Python 2,
204191183 BytesOkay, der Python-Wettbewerb hier wird heftig. Hier ist mein Versuch, so viele Bytes wie möglich zu rasieren.
Inzwischen stecke ich fest(Ok, stecke wieder fest).Dank an @NonlinearFruit für die Art und Weise, wie zufällige Zeichen ausgewählt werden.
183-Byte-Version:
Probieren Sie es online! (Ideone)
Hauptänderung ist, die Bedingung neu zu schreiben
wie
Das spart 7 Bytes.
191-Byte-Version:
Probieren Sie es online! (Ideone)
Die wichtigsten Änderungen betreffen die Art und Weise, wie zufällige Zeichen ausgewählt werden, und einige Code-Neuanordnungen, z. B.
s=input();i=s;
werdens=i=input();
, dier=range
Zuordnung entfernen, da sie nicht mehr benötigt wird, undabs
direkt aufrufen, da dies zu weniger Code-Bytes führt.Die kürzeste Antwort in Python um 1 Byte übertreffen!@R. Kaps Ansatz wird zur Erzeugung der Zufallszeichen verwendet. Bei jeder Iteration der while-Schleife wird eine Zeile des ex gedruckt.204-Byte-Version :
Probieren Sie es online! (Ideone)
Ungolfed-Version, um eine Vorstellung davon zu bekommen, wie es funktioniert:
Es war schwer, mit dem 1-Zeichen-Fall umzugehen!
quelle
SmileBASIC, 97 Bytes
Anstatt die Anzahl der Leerzeichen zwischen den einzelnen Zeichen oder etwas zu berechnen, habe ich mich dazu entschieden, nur an allen Stellen zu drucken, an denen
X==Y
oderX+Y==Size+1
.Der Zufallszeichengenerator addiert nur 1, wenn er
y
oder generiertY
,z
undZ
ist etwas häufiger als üblich.quelle
PHP, 100 Bytes
Nimmt Eingaben vom Kommandozeilenargument entgegen; renn mit
-nr
.Kombinierte Schleife druckt Zeichen je nach Position
Nervenzusammenbruch
quelle