Herausforderung
Zeichnen Sie mit einem ASCII- Operator aus der folgenden Liste und einer Zahl n eine ASCII-Darstellung des Operators, wobei dieser Operator als Zeichen mit den Liniensegmenten des Operators der Länge n verwendet wird .
Eingang
Ein ASCII-Zeichen aus der Liste = + - x /
und eine Ganzzahl, n
bei der n >= 1
. (Ich benutze x
anstelle von *
und /
anstelle von ÷
, aber Sie können auch eines verwenden, je nachdem, was einfacher ist.) Für +
und x
müssen Sie nur ungerade Zahlen verarbeiten, um Probleme mit der Ausrichtung zu vermeiden.
Ausgabe
Eine ASCII-Zeichnung des Operators, die aus dem Zeichen mit Segmenten der Länge n besteht. Horizontale Abschnitte sollten Leerzeichen zwischen den Zeichen enthalten, um vertikale / horizontale Abstandsunterschiede auszugleichen.
Regeln
Das ist Code-Golf , also gewinnt der kürzeste Code in Bytes. Standardlücken sind verboten.
Beispiele
Eingang: + 3
+
+ + +
+
Eingang: = 4
= = = =
= = = =
Eingang: = 10
= = = = = = = = = =
= = = = = = = = = =
Eingang: - 2
- -
Eingang: / 10
/
/
/
/
/
/
/
/
/
/
Eingang: x 7
x x
x x
x x
x
x x
x x
x x
= 10
?Antworten:
Pip ,
625956 Bytes55 Byte Code, +1 für
-S
Flag.Beachten Sie, dass diese Lösung funktioniert mit Eingang
÷
für die Division und*
für die Multiplikation, obwohl es diese Zeichen verwendet ASCII-Kunst zu ziehen/
undx
jeweils. OP hat klargestellt, dass dies in Ordnung ist. Probieren Sie es online!Wie?
Hier ist eine teilweise beabstandete und kommentierte Version . Beachten Sie, dass
a
undb
die Befehlszeilenargumente sind, dh der Operator bzw. die Größe. Das-S
Flag steuert, wie Listen ausgegeben werden: Es verbindet sich zuerst in Zeilenumbrüchen, verbindet sich jedoch mit verschachtelten Listen in Leerzeichen.Und hier sind die einzelnen Abschnitte:
Multiplikation
Für jede Zeile in der Figur erzeugen wir eine Folge von Leerzeichen und ersetzen dann zwei durch das Eingabezeichen. Für row
i
möchten wir die Leerzeichen bei indexi
und ersetzenb-1-i
. Beachten Sie jedoch, dass dieser den negativen Index verwenden kann-1-i
. (Es ist sogar noch kürzer , da die Variablev
zu negati vorinitialisiert ist v e 1.)Zusatz
Mit Hilfe der Strategie von meiner Zeichnen Sie eine leere Quadrat Antwort definieren wir eine Funktion , die eine Wraps
+
inb/2
Kopien ihres Arguments und gibt das Ergebnis als eine Liste von Zeichen. (Eine Ganzzahldivision//
ist nicht erforderlich, da der Operator für die ZeichenfolgenwiederholungX
automatisch auf eine Ganzzahl abschneidet.) Zuerst rufen wir diese Funktion für ein Leerzeichen auf und geben[" ";" ";"+";" ";" "]
; dann ordnen wir diesem Ergebnis die gleiche Funktion zu, wobei wir[" ";" ";"+";" ";" "]
auf den meisten Linien aber["+";"+";"+";"+";"+"]
auf der Mittellinie angeben. Diese verschachtelte Liste wird dann aufgrund des-S
Flags mit Leerzeichen zwischen allen Zeichen in einer Zeile und Zeilenumbrüchen zwischen den Zeilen ausgegeben.Teilung
Jede Zeile enthält zwischen
b-1
und0
Leerzeichen, gefolgt vom Eingabezeichena
.Subtraktion
Erstellen Sie eine durch Leerzeichen getrennte Zeile des Eingabezeichens. Speichern Sie eine Kopie für später.
Gleich
Der Subtraktionsschritt speicherte die Hälfte dessen, was wir brauchen
y
- verdoppeln Sie ihn einfach.Die Dummy-
x
Werte dienen zum Auffüllen der Hauptliste, sodass die modulare Indizierung einen eindeutigen Index für jedes eingegebene Zeichen in ergibt+-*÷=
.quelle
V ,
78, 72, 71, 68, 65, 63, 62, 61 BytesProbieren Sie es online!
Wie immer macht der Zweikampf mit 05AB1E richtig Spaß!
Da dies nicht-ASCII-Zeichen enthält, ist hier ein Hexdump:
Dadurch werden führende Leerzeichen in der Ausgabe für
=
und erstellt-
, dies scheint jedoch zulässig zu sein . Wenn dies nicht erlaubt ist, können Sie dies gerne kommentieren und ich werde es zurücksetzen.Erläuterung
Der "globale Befehl"
ç
wendet (z. B. ) einen bestimmten Satz von Befehlen auf jede Zeile an, die einem bestimmten regulären Ausdruck entspricht. Die Syntax lautetDies ist die einfachste Möglichkeit, eine Bedingungs- / switch-Anweisung zu simulieren. In meiner ursprünglichen Antwort habe ich einfach die gesamte ASCII-Grafik auf der rechten Seite für jedes Zeichen erstellt, nach dem wir suchen müssen. Viele dieser Ausgaben erfordern jedoch ähnliche Befehle. Also habe ich sie kombiniert. Der erste Befehl ('Ç') ist eigentlich die Umkehrung des globalen Befehls. Er wendet den Befehl auf jede Zeile an, die nicht mit dem regulären Ausdruck übereinstimmt. Der erste Befehl lautet also:
Der folgende Befehl gilt für die Eingänge '=' und '-'. Diese zwei sind bequem einfach und ähnlich. Nach diesem Befehl brauchen wir keine Bearbeitung mehr für
-
.Von hier aus führen wir nur einige zusätzliche Befehle für jede einzelne mögliche Eingabe aus. Für
+
:Der Befehl für gleich ist sehr einfach. Wir duplizieren es einfach mit
Ä
. Für/
:Der letzte ist der komplizierteste. Es ist im Grunde ein Hafen dieser Antwort .
quelle
ç
Befehl (sowie das Suchen und Ersetzen/
und?
) simulieren alle Teile der Befehlszeile von vim, in der Sie die Eingabetaste05AB1E ,
8176747370696865646260595756 ByteDerzeit im Krieg mit der V-Antwort . Ich komme für Sie Dr. McMoylex: p.
Auch im Krieg mit der Pip-Antwort . Ich werde Sie Mr. DLosc beobachten.
Code:
Oder in besser lesbarer Form:
Verwendet die CP-1252- Codierung. Probieren Sie es online!
quelle
Python 3,
304283278 BytesEinfach genug, erstellt nur eine Zeichenmatrix und wendet die verschiedenen Operationen an, je nachdem, um welche es sich handelt. Die
=
und-
haben nachgestellte Leerzeichen, wenn das nicht so schlimm ist.EDIT: Danke an @Shebang und @Rod für ihre Vorschläge, die am Ende 21 Bytes einsparen!
EDIT2: Danke an @Artyer für das Speichern von 5 Bytes!
quelle
if'-'==t
Bedingungszeile entfernen und die darüberliegende durchif t in'=-':b=[[t+' ']*s]*(2*(t>'-'))
(glaube ich) ersetzen .exec(['+ block','/ block','x block','= block','- block']['+/x=-'.find(t)])
, um ~ 18 Bytes zu sparen.split()
Führen Sie für die erste Zeile Folgendes aus (Keine Argumente werden in Leerzeichen aufgeteilt). In Zeile 6 haben Sie ein Leerzeichen verpasst (b=[[x+' 'for
). Sie können die letzte Zeileprint(*map(''.join,b),sep='\n')
für 1 Byte weniger machen.JavaScript (ES6),
238225215202196 BytesKönnte wahrscheinlich Golf spielen, aber es ist ein Anfang.
quelle
Scala, 275 Bytes
Verwendung:
Erläuterung:
Der Code prüft den ASCII-Wert des Zeichens, um die richtige Art der Image-Generierung auszuwählen. Die ASCII-Werte der betreffenden Bediener sind:
('+' -> 43), ('-' ->45), ('/' -> 47), ('=' -> 61), ('x' -> 120)
quelle
JavaScript (ES6), 156 Byte
Wobei
\n
das wörtliche Zeilenumbruchzeichen darstellt.quelle
SyntaxError: invalid property id
verstehe ich, wie es derzeit geschrieben ist, aber das Ändern der Backticks um den Schrägstrich in Apostrophe behebt das. (Warum haben Sie Backticks anstelle von Apostrophen?)+
,-
und=
anders aussehen als die Herausforderung fordert: „Horizontale Teile sollten Räume zwischen den Zeichen vertikal / horizontal Abstand Unterschiede zu kompensieren.“Dyalog APL ,
9186 BytesNeeds
⎕IO←0
, was bei vielen Systemen Standard ist. Nimmt n als linkes Argument und eines von + - × ÷ = als rechtes Argument.Erläuterung
quelle
Mathematica, 191 Bytes
Anonyme Funktion. Nimmt eine Zeichenfolge und eine Zahl als Eingabe und gibt eine Zeichenfolge als Ausgabe zurück. Bei weitem nicht die kürzeste, aber es macht trotzdem Spaß zu schreiben.
quelle
C 396 Bytes
Rufen Sie an mit:
quelle
SOML ,
104100 Bytes (nicht konkurrierend)Dies ist eine Art Konkurrenz, da ich mir ziemlich sicher bin, dass alles, was ich hier verwendet habe, Dokumente auf github vor dem Veröffentlichungsdatum dieser Frage enthält, der Parser jedoch einige Funktionen, die ich so idk verwendet habe, nicht unterstützt.
quelle
PHP,
306292281282281275270 BytesOh, das ist sperrig ... braucht weiteres Golfen.
Ich könnte 4 Bytes mit physischen Zeilenumbrüchen oder ein Byte mit "\ n" in eine Variable speichern.
quelle
C #, 744 Bytes
Es ist ungefähr 1 Million Zeichen lang, denke ich, aber es ist mir egal, ich bin nur so froh, dass ich das gelöst habe ...
Golf gespielt:
Ungolfed:
Testen:
Zu viel zum Einfügen und Formatieren, ich habe einen Pastebin erstellt:
Pastebin
quelle
C 331 Bytes
Der Operator wird als ASCII-Code an
o
und die Zeichenanzahl an übergebenn
. Ich habe nur Leerzeichen zwischen horizontal aufeinanderfolgenden Zeichen in das Pluszeichen eingefügt, da dies das einzige war, bei dem die Ausgabe verzerrt gewesen wäre, wenn ich es nicht getan hätte, und in der Aufgabe stand nur "sollte". Ich verwende zwei verschachtelte Schleifen, die abwärts zählen (mit Ausnahme von-
wenn ich nur eine Zeile benötige).=
Drei Zeilen, eine davon leer, geradeaus+
mitprintf
wegen der Räume-
geradeaus/
Lassen Sie die innere Schleife auf Null drucken und beginnen Sie am Zähler der äußeren Schleifex
Lasse die innere Schleife auf den Zähler der äußeren Schleife drucken und die "Inverse"n-i
. Ich muss noch nachsehen, warum ich hier allein bin.Beispielanruf:
quelle
Lua,
402344312 Bytes312
344
402
90 Zeichen reduziert, und es ist jetzt schmerzhaft, sie zu betrachten, selbst wenn sie erweitert sind. : |
quelle