Betrachten Sie ein Quadrat aus druckbaren ASCII- Zeichen (Codepunkte 0x20 bis 0x7E) für die Seitenlänge N wie folgt (hier N = 6 ):
=\
g \
7
m+y "g
L ~
e> PHq
Wir fordern auch, dass jede Zeile und jede Spalte mindestens 1 Leerzeichen und 1 Nicht-Leerzeichen enthält . (Das obige Beispiel erfüllt dies.)
Wir definieren das Negativ eines solchen Quadrats als ein Quadrat gleicher Größe, bei dem jedes Leerzeichen durch ein Nicht-Leerzeichen ersetzt wird und umgekehrt. ZB wäre das Folgende ein gültiges Negativ des obigen Beispiels:
1234
a b cd
ZYXWV
!
{} [ ]
?
Die Auswahl von Nicht-Leerzeichen ist irrelevant (solange sie aus dem druckbaren ASCII-Bereich stammen).
Die Herausforderung
Sie müssen ein Programm mit quadratischem Quellcode mit der Seitenlänge N> 1 schreiben , das ein Negativ von sich selbst an STDOUT ausgibt. Nachgestellte Leerzeichen müssen gedruckt werden. Sie können eine einzelne nachgestellte Zeile drucken oder nicht.
Es gelten auch die üblichen Quine-Regeln. Sie dürfen also weder direkt noch indirekt Ihren eigenen Quellcode lesen. Ebenso dürfen Sie keine REPL-Umgebung annehmen, die automatisch den Wert jedes eingegebenen Ausdrucks ausgibt.
Der Gewinner ist das Programm mit der niedrigsten Seitenlänge N . Im Falle eines Gleichstands gewinnt die Einreichung mit den wenigsten Nicht-Leerzeichen im Quellcode. Wenn es immer noch ein Unentschieden gibt, gewinnt die früheste Antwort.
quelle
Antworten:
Jam, 4 x 4 (8 Nicht-Leerzeichen)
Probieren Sie es online im CJam-Interpreter aus .
Ausgabe
Wie es funktioniert
L
verschiebt ein leeres Array und verschiebt_
eine Kopie davon.Der Block
schiebt diesen Block auf den Stapel.
_
Drückt eine Kopie des Codeblocks undp
druckt sie aus, gefolgt von einem Zeilenvorschub.Schließlich druckt der Interpreter alle verbleibenden Elemente auf dem Stapel: zwei leere Arrays, die sich nicht auf die Ausgabe auswirken, und den ursprünglichen Codeblock.
Alternative Version
Probieren Sie es online im CJam-Interpreter aus .
Ausgabe
Wie es funktioniert
L
verschiebt ein leeres Array und gibt~
es aus. Der Stapel ist wieder leer.Der Block
schiebt diesen Block auf den Stapel.
_
verschiebt eine Kopie des Blocks und~
führt die Kopie aus.Die
_
Kopie des Blocks enthält eine Kopie des ursprünglichen Blocks, diep
gedruckt wird, gefolgt von einem Zeilenvorschub.Schließlich druckt der Interpreter das verbleibende Element auf dem Stapel: den ursprünglichen Codeblock.
quelle
Perl, 7 × 7 (42 Nicht-Leerzeichen)
Ausgabe:
quelle
7
made of zeigt7
. :)CJam, 4X4 (
1210 Nicht-Leerzeichen)Ausgabe:
Vorgängerversion mit 12 Leerzeichen:
Und die Ausgabe ist
Wie von Martin hervorgehoben, hat diese Version
*
,4
,4
als Ausgang;)
Probieren Sie es hier online aus
quelle
Marbelous - 16x16
Teste es hier! Leerzeichen, zylindrische Platinen und Include-Bibliotheken müssen alle überprüft werden.
Ausgabe
Erläuterung
Hier gibt es zwei Karten: die
ss
Hauptkarte (siehe unten) und die Karte, die keine Ein- und Ausgänge für zwei Leerzeichen (0x20) für STDOUT verwendet.Eine leere Zelle entspricht a
..
, und alles nach a#
ist ein Kommentar.Jeder Tick
ss
gibt zwei Leerzeichen an STDOUT aus.Der grüne Pfad ist eine einfache Schleife, die am Ende jedes siebten Ticks eine neue Zeile (0x0A) ausgibt.
Der blaue Pfad gibt die Zahlen aus (
Hp
druckt eine Murmel als zwei hexadezimale Ziffern), die am Ende jedes sechsten Ticks in der Ausgabe vorhanden sind.Nachdem wir einmal gedruckt haben
01
, endet die Schleife und bewegt sich den roten Pfad hinunter, der diese Murmel dupliziert.Ein Duplikat wird gedruckt (das zweite
01
), und das andere wird über den schwarzen Pfad gesendet, der die Karte an der!!
Zelle terminiert . Aufgrund der Position desHp
in diesem letzten Ausdruck verwendeten Zeichens wird das vor den beiden Leerzeichen desselben Häkchens01
angezeigt und nicht nach dem Verhalten jedes anderen Aufrufs.Hp
quelle
Python - 11x11
Ausgabe
Es ist eine ziemlich schmutzige und langweilige Lösung, aber ich dachte nur, ich würde das zeigen ...
Diese Lösung nutzt die Tatsache, dass Sie, wenn Sie sich in Python in zwei Klammern befinden, Ihren Code auf mehrere Zeilen aufteilen und willkürlich Leerzeichen hinzufügen können, ohne ein zu erhalten
IndentationError
. Eine andere Möglichkeit besteht darin, die Zeile mit einem Backslash zu beenden.quelle
Python - 7x7 (37 Nicht-Leerzeichen)
Ausgabe
Verwendet Python alt
%
Zeichenfolge Formatierung Bediener die Arbeit zu erledigen:+7
und-7
kümmern sich um Rechts- / Links - Ausrichtung und den letzten Raum die schließende Klammer passend fürprint
insbesondere. Bei der Vorbereitung des Formatstrings haben wir auchquelle
JavaScript (9 x 9)
Ausgabe
Anmerkungen
Ich habe (nach bestem Wissen und Gewissen) einen Code für ein Quadrat mit einer Diagonale beliebiger Größe n erstellt und gespielt:
Ersetzen der *** asdf *** -Zahlen durch Konstanten in Abhängigkeit von der Seitenlänge n, zum Beispiel für n = 6:
Aber obwohl dieser Code die Länge 46 hat, konnte ich den konstanten Abstand nicht mit einem Abstand in der Diagonale des Codes ausrichten, bis er so groß war wie ein 9x9, mit einer verschwendeten Zeile (der fünften).
Bearbeiten: Geändert, um eine Warnung hinzuzufügen (). Vor:
quelle
CJam, 5x5, 12 Nicht-Leerzeichen
Kein Gewinner, aber ich wollte eine eher kleine und spärliche Einsendung hinzufügen , da die meisten Antworten nur eine Diagonale drucken.
druckt
Teste es hier.
Die letzten beiden Zeichen des Codes haben nichts zu tun, es sind also nur 10 Byte realer Code enthalten. Für ein kleineres Raster könnte ich es sogar um weitere zwei Bytes auf 8 reduzieren, aber das passt nicht für 3x3, und dieser Code funktioniert nicht für gerade Rastergrößen.
Wie es funktioniert:
quelle
Befunge , 9x9
Ich habe keine Ahnung, warum ich das getan habe. Es hat viel zu lange gedauert. Ich habe jetzt massive Kopfschmerzen.
Ausgabe:
Eine Erklärung
Der Code
g
liest die@
Zeichen aus dem Raster "on the fly" (und auch das letzte Leerzeichen@ / 2
) undp
modifiziert die Schleife, um die letzte Ausgabezeile zu schreiben.Jedes einzelne Zeichen im Code wird irgendwann entweder als Code oder als Daten verwendet (das
9
und das@
in den beiden letzten Zeilen).Ich musste im Grunde eine Menge Workarounds machen, um den Code zum Laufen zu bringen. Der Befehlszeiger führt während der Ausführung mehrere Schnittpunkte aus, von denen einige übersprungen werden. (Ich konnte dort keine Anweisung für verschiedene Richtungen verwenden, da sie stören würde. Es gibt keine NOP.) An anderer Stelle habe ich entweder dasselbe Zeichen wiederverwendet oder es einfach wieder rückgängig gemacht (siehe
$:
in der Mitte).Ich habe auch ein paar kreative Arbeiten am Stack gemacht:
n,0
. Ich muss dann dekrementierenn
. Die naheliegende Lösung wäre$1-
, aber ich habe es geschafft, sie mit Hilfe von zu verkürzen!-
.0
. Ich organisierte dann Code Changer (20g46p7g46\p
), um das zu verwenden0
, anstatt 2 Zeichen weiter zu verschwenden$0
.quelle
!-
; Das würde ich tun. Unterhaltsame Tatsache: In Funge-98z
ist ein NOP.z
wurde nicht im Wiki gelistet und ich habe dies für die Codierung verwendet, was bedeutete, dass jeder Nichtbefehl die IP-Richtung umkehrte. Ziemlich viel musste 70% des Codes wegen einer Stelle umgestalten, die NOP sein sollte.Python 3, 8x8
Es gibt 50 Nicht-Leerzeichen und 14 Leerzeichen. Die letzte Zeile hat einen unnützen Charakter, aber alles andere ist notwendig.
Ausgabe:
quelle
(a,*b,c)="12345"
Rubin, 8x8
Ausgabe:
quelle
CJam, 5X5
Und die Ausgabe ist
Ich war so nah an 4X4 Lösung.Siehe meine andere Antwort<sigh>
Probieren Sie es hier online aus
quelle
C ++, 12 × 12
Edit: Also war ich ein bisschen besessen von dieser Herausforderung und habe es geschafft, sie von 17x17 auf 12x12 zu reduzieren. Es dauerte eine Weile, bis mir klar wurde, dass ich
/**/
einen Token-Begrenzer verwenden konnte. Dieser Code macht sich die Tatsache zunutze, dass ein Linienspleiß in Clang immer noch mit einem Leerzeichen dahinter funktioniert, obwohl er Warnungen ausgibt und die Farbgebung des Codes durch Xcode ruiniert.Ausgabe:
quelle
Befunge-98 , 8x8 (56 Nicht-Leerzeichen [11 Nein])
Hinweis: Im Interesse eines guten Sportpersönlichkeitsschiffs liest dieses seine eigene Quelle über
'
, was es für einige zu einem Betrüger schlechthin macht. Lesen Sie die Debatte hier .Programm
Ausgabe
Erläuterung
Die nicht golfene Version
(Nicht-Leerzeichen und Leerzeichen werden aus Gründen der Lesbarkeit durch 'n' und 's' ersetzt.)
Diese Lösung basiert auf der Tatsache, dass mit einem Index [0, width ^ 2) mod die Breite des Quadrats Ihnen sagen kann, ob Sie sich am Ende der Zeile oder auf der Diagonale befinden. Da alle Leerzeichen entlang der Diagonalen platziert sind, ist es einfach zu bestimmen, wann ein Nicht-Leerzeichen gedruckt werden soll!
Im Pseudocode
Diskussion
Ich bin sehr stolz darauf, obwohl ich wünschte, ich hätte jedes Nicht-Leerzeichen auch zu einem Nicht-Nein machen können. Ich bin auch stolz darauf, dass ich nicht das Standard-Befunge-Get-Increment-Put-Trope verwendet habe! Es druckt verschiedene Symbole für Nicht-Leerzeichen aus, weil ich den Raum dafür hatte und nicht langweilig sein wollte.
Probieren Sie es unter Windows mit BefungeSharp aus !
quelle
Jam, 4 x 4 (8 Nicht-Leerzeichen)
Probieren Sie es online im CJam-Interpreter aus .
Ausgabe
Wie es funktioniert
N
schiebt einen Zeilenvorschub als Singleton-String.a
Bricht diesen String in ein Array ein.`
Prüft das Ergebnis, dh es wird eine Zeichenfolgendarstellung des Arrays übertragen.Das ist das Ergebnis:
S*
Verbindet die resultierende Zeichenfolge (Array von Zeichen) und trennt ihre Elemente durch Leerzeichen. Mit anderen Worten, es wird ein Leerzeichen zwischen alle Paare benachbarter Zeichen der Zeichenfolge eingefügt.Das ist das Ergebnis:
N
drückt einen anderen Zeilenvorschub.X$
kopiert das Stapelelement am Index 1 (von oben gezählt), dh die mehrzeilige Zeichenfolge.Schließlich druckt der Interpreter alle Elemente auf dem Stapel: die ursprüngliche mehrzeilige Zeichenfolge, den Zeilenvorschub und die Kopie der mehrzeiligen Zeichenfolge.
quelle
SOGL V0.12 , 2x2 (2 Nicht-Leerzeichen)
Probieren Sie es hier aus!
Ausgabe
Erläuterung
In SOGL ersetzen alle Zeilen außer den letzten Zeilen die Zeilen - überall im fortlaufenden Code wird das letzte Zeichen der Zeile durch alles davor ersetzt. SO ist die 1. Zeile hier
replace space with 2 in the next line
.Dann wird die nächste Zeile
2╚
ausgeführt:2
drückt 2 und╚
erzeugt eine Diagonale der Größe 2.quelle
CBM BASIC v2.0 (8 × 8)
Eine Verbesserung gegenüber meiner vorherigen Antwort mit einem völlig anderen Ansatz:
Ausgabe:
quelle
Ruby,
8x87x7Ausgabe:
Vorherige Version, 8x8 mit 20 Leerzeichen:
Ausgabe:
quelle
Aufdringlich , 4x4 Quadrat
Nicht konkurrierend, da die Sprache die Herausforderung datiert:
Code:
Ausgänge:
Probieren Sie es online!
Da Leerzeichen in Pushy keine Rolle spielen, kann der Code einfach so angeordnet werden, dass er mit dem Negativ seiner Ausgabe übereinstimmt. Das eigentliche Programm sieht so aus:
Backslashes beginnen mit einem Kommentar, sodass der Schlussstrich
\o/
nur dazu dient, das Negativ zu vervollständigen und cool auszusehen.Alternativ können wir für die gleiche Punktzahl die folgenden Lösungen haben:
quelle
Haskell, 10 × 10
Definiert eine Hilfsfunktion
a ! b
, die eine Zeile des Formulars drucktbbbbbbbbba
, und eine rekursive Funktionn & c
, dien
Zeilen des Formulars druckt ,ccccccccc␣
gefolgt von einer Zeile des Formulars␣␣␣␣␣␣␣␣␣c
.Verwendet
<$
(fmap const
wieder) einen Bereich, um ein Zeichen zu wiederholen. Beachten Sie, dass dies<$
nur ohne Import seit GHC 7.10 möglich ist, da dies nach dieser Herausforderung erfolgt.Ich bin mir nicht ganz sicher, ob dies zu einem Wettbewerbsverbot führt.Nichts wirklich Aufregendes bei der Wahl des Layouts oder des Algorithmus; Ich hatte nicht viele Bytes übrig und es ist nur ein Glück, dass die Zeilenumbrüche so auftreten,
putStrLn
wie sie es getan haben.quelle
05AB1E , 3x3 (6 Nicht-Leerzeichen- Bytes )
Ausgabe:
Probieren Sie es online aus.
Erläuterung:
quelle
Perl, 6x6 (26 Nicht-Leerzeichen)
Ich habe diese Seiten gründlich durchgesehen und war mir sicher, dass es eine Perl-Lösung geben würde, die kleiner als 7x7 ist ... Eine sehr lustige Herausforderung! Diese Lösung erfordert
-E
.Verwendungszweck:
Ausgabe:
quelle
CBM BASIC v2.0 (9 × 9)
Ausgabe:
quelle
C (gcc) ,
7×78×8BEARBEITEN: Vorherige Version hatte falsches Verhalten.
Probieren Sie es online!
quelle
Gelee , 4 x 4 (12 Nicht-Leerzeichen)
Probieren Sie es online!
Ausgabe:
Das war ziemlich lustig.
Wie es funktioniert
Einfacher Teil: Jelly ignoriert Leerzeichen (solange nur Ein-Byte-Builtins verwendet werden).
Schwieriger Teil: Jede Zeile in Jelly ist eine separate Verknüpfung (oder Funktion), daher ist es nicht sehr kurz, eine konstante Anweisung in mehrere Zeilen zu verteilen. Die Verwendung eines String-Literal ist ein guter Kandidat, aber keine Ahnung, wie das Negativ generiert werden soll.
quelle