Herausforderung
Schreiben Sie ein nicht leeres Programm / eine nicht leere Funktion p
, die bei einer nicht leeren Eingabezeichenfolge s
die Position des ersten Vorkommens jedes Zeichens s
im Quellcode von ausgibt p
.
Zum Beispiel, wenn Ihr Programm ist
main() { cout << magic << cin }
^0 ^5 ^10 ^15 ^20 ^25
und es erhält eine Eingabe abcd{
, die Ausgabe sollte sein
[1, x, 9, x, 7] (0-based) [2, x, 10, x, 8] (1-based)
Dabei x
stellt jede Ausgabe , die keine gültige Ausgabe für eine Zeichenposition ist (zB eine negative Zahl, 0
wenn Sie verwenden 1-basierte Indizierung NaN
, Inf
die Zeichenfolge potato
, eine Zahl , die größer ist als die Länge Ihres Programms, etc.).
Beschränkungen
Das Lesen des Quellcodes ist nicht erlaubt (wie in einem richtigen Quine). Die Verwendung von Kommentaren ist zulässig, wird jedoch für Ihre Punktzahl berücksichtigt.
Die Ein- und Ausgabe kann in einem vernünftigen Format erfolgen, muss jedoch eindeutig sein (nur zusätzliche Begrenzer, kein rand
Datenstrom und die Behauptung, dass die Antwort irgendwo darin enthalten ist), konsistent (z. B. x
sollte der Wert von oben immer der gleiche sein) und menschlich. lesbar ; Zum Beispiel eine Zeichenfolge oder ein Zeichenarray. Sie können davon ausgehen, dass die Eingabe eine Zeichenfolge (oder ein Array) druckbarer ASCII-Zeichen ist. Es muss nicht der gesamte Unicode-Satz verarbeitet werden.
Benutzerdefinierte Codepage oder nicht druckbare ASCII-Dateien in Ihrem Code?
Wenn Ihre Sprache eine benutzerdefinierte Codepage (Jelly, APL usw.) verwendet, müssen Sie dies berücksichtigen (ein Programm €æÆ
muss also [1, x, 2]
für eine Eingabe ausgeben €%æ
). Die Verwendung von Nicht-ASCII-Zeichen für die Ausgabe -1
(da die Eingabe nur ASCII-Zeichen enthält) ist keine gültige Lösung. Sie können davon ausgehen, dass Ihr Programm Ihre benutzerdefinierte Codepage nativ akzeptiert. Wenn Ihr Programm über eine Methode zum Konvertieren eines Zeichens A
in eine Ganzzahl 65
(ASCII-Codierung) verfügt, können Sie davon ausgehen, dass es jetzt das 65. Zeichen in Ihrer Codepage in konvertiert 65
.
Inspiriert von der folgenden Herausforderung: Positionsbewusstsein
01030708070
?Antworten:
Python2, 55 Bytes
Beginnt mit einer Zeichenfolge, die alle im Code verwendeten Zeichen enthält, und durchsucht dann die Indizes
quelle
raw_input
.Sprache , 56.623 Bytes
Unten ist ein Hexdump der ersten 256 Bytes. Die restlichen Bytes können beliebig gewählt werden.
Die Ausgabe erfolgt in Bytes, wie bei Brainfuck et al.
Wie es funktioniert
Dies ist insbesondere ein einfaches Katzenprogramm
,[.,]
.Der Quellcode enthält alle 256-Byte-Werte in der angegebenen Reihenfolge, sodass der Index jedes Bytes mit seinem Wert übereinstimmt.
quelle
+[,.]
viel besser?Sprache , 1.22e7 Bytes
Besteht aus
12263215
NUL
Bytes (Hex 0x00) .Gibt ein
NUL
für jedes Zeichen aus, das nicht in der Quelle erscheint.Dies übersetzt in das folgende Brainfuck-Programm
Und mit einer Panne ...
Dies zeigt nur die schiere Kraft von Lenguage als Golfsprache. Fürchte es.
quelle
,[>.,]
kürzer?Gelee ,
109 BytesProbieren Sie es online!
Wie es funktioniert
quelle
pbrain,
402356340338329 BytesPuh, @KritixiLithos und ich arbeiten seit 4 Tagen daran.
Gibt aus,
0x00
wenn das eingegebene Zeichen nicht im Programm enthalten ist, andernfalls den Index des Zeichens (1-basiert) in hexadezimal. Probieren Sie es online!Erläuterung:
Diese letzte Funktion ist die Schleife. Es durchläuft die ausgewählten Zeichen der
[(:<>)+,-.]
Reihe nach und vergleicht die Eingabe mit dem Zeichen. Jetzt werde ich genauer erklären, wie diese Schleife funktioniert.Der Stapel sieht in einer Schleife so aus. Die Schleife läuft bis
12-n
ist0
. Dann haben wir den Zähler, der istn+2
. Dieser Zähler ist auch die Nummer der Funktion für jedes der ausgewählten Zeichen. Also , wennn=0
,n+2
wird auf das erste Zeichen wird entsprechend, dh[
.>[->+>+<<]>>[-<<+>>]<:
Um genau das zu tun, konvertiert es den Zähler in das Zeichen.Sobald sich der Zeiger an der Stelle befindet, an der sich das Caret befindet, vergleichen wir das aus der Zählervariablen erzeugte Zeichen mit der Eingabe, während wir sie beibehalten.
Z
ist,0
wenn das Zeichen gleich der Eingabe ist oder eine andere Ganzzahl, die nicht Null ist.Nun überlegen wir uns eine if-Anweisung, um diese Gleichheit zu überprüfen.
Wenn
Z
ungleich Null ist, dh das Zeichen und die Eingabe nicht identisch sind, erhöhen wir den nächsten Speicherplatz.Nachdem wir diese if-Anweisung verlassen haben, dekrementieren wir den nächsten Speicherplatz. Nun enthält dieser Speicherplatz
!Z
. Abschließend geben wir den Index des Zeichens aus, wenn er mit der Eingabe übereinstimmt, und verlassen dann die Schleife mit Gewalt. Ansonsten fahren wir mit der Schleife fort, bis sie beendet ist oder eine Übereinstimmung gefunden wurde.quelle
CJam ,
1412 BytesVerwendet die 0-basierte Indizierung und
-1
für Zeichen, die nicht in der Quelle enthalten sind.Probieren Sie es online!
quelle
Javascript, 34 Bytes
Es nimmt Eingaben als Array von Strings an,
x
ist-1
(0-basierte Indizierung).quelle
s='s=%s;print s%%s';print s%s
in Python. Es enthält nicht dief=
, so ist es in Ordnunga
eine Zeichenkette sein soll.map
Für Strings gibt es keine Funktion.C
153152143 BytesProbieren Sie es online!
quelle
Ruby,
41 88 86 71 69 67 6156 BytesThx Lynn für das Töten von 6 Bytes
quelle
a='p$<.chrsm{| #index};"';p$<.chars.map{|c|"a='#{a}".index c}
sollte auch funktionieren, Eingaben von STDIN nehmen.> <> (Fisch) 70 Bytes
Wahrscheinlich der längste> <> 1 Liner, den ich je gemacht habe.
Es wird die Ausgabe für jedes Zeichen gedruckt, das in einer separaten Zeile gefunden wird (0 indiziert).
Ein nicht gefundenes Zeichen gibt immer die Länge des Codes + 1 aus (ich könnte dies ändern, wenn es in seinem aktuellen Status als nicht in Ordnung erachtet wird), sodass in diesem Fall 71 immer die Zeichen "Nicht gefunden" sind.
Sobald ich die Zeit habe, werde ich eine Erklärung abgeben.
Einige Testfälle;
## K = 1 \ n1 \ n71
# "# = 1 \ n69 \ n1
Probieren Sie es online aus
> <> Sprache
quelle
Perl 6 ,
5052 BytesÜbersetzung von GBs Ruby-Lösung und Rods Python-Lösung .
Ein Lambda, das eine Liste von Zeichen eingibt und eine Liste von nullbasierten Indizes ausgibt (
Nil
für nicht vorhandene Zeichen).BEARBEITEN: Ein Versehen wurde behoben - Hinzufügen von 2 Bytes erforderlich :(
quelle
Clojure,
435648 BytesEdit: Verdammt habe ich vergessen
2
! Erhöht von 43 auf 56.Bearbeiten 2: Der Beispielcode unter diesem Text wurde aktualisiert, die Anzahl der nicht einzuschließenden Bytes wurde aktualisiert,
(def f ...
aber nur der Hash-Map-Teil.Die Hash-Map besteht nur aus Zeichen
01234{\\}
und kodiert deren Position. In Clojure können Hash-Maps Funktionen verwendet werden, wie in diesem vollständigen Beispiel gezeigt (f
könnte durch die Hash-Map-Definition ersetzt werden):Ich denke das zählt :)
quelle
JavaScript, 39 Bytes
quelle
[...s]
bitte erklärenPyth, 11 Bytes
Ein Programm, das die Eingabe von a annimmt
"quoted string"
, wobei Anführungszeichen in der Zeichenfolge mit einem vorangestellten Escapezeichen versehen sind\
, und eine Liste von mit Nullen indizierten Werten-1
für Zeichen ausgibt, die nicht in der Quelle enthalten sind.Probieren Sie es online!
Wie es funktioniert
quelle
05AB1E , 19 Bytes
Probieren Sie es online!
Dies gibt -1 anstelle von fehlenden Zeichen aus.
Luis Mendo hat dies (leicht modifiziert) auf Golf you a quine für great good gepostet ! Das Hinzufügen von "s" und "k" zu diesem Quine führt ebenfalls zu dieser Antwort. Ich kann diese Kleinigkeit einer Änderung jedoch nicht würdigen ... Luis, du kannst mir eine Nachricht senden, wenn du dies erneut posten möchtest, und ich werde es einfach löschen. Wenn Sie meinen Fortschritt sehen möchten, bevor Sie diese Frage finden, sehen Sie sich die Änderungen an. Nun ... Es war an einem Punkt deutlich wie bei ihm.
quelle
SmileBASIC,
128968886 BytesEine wichtige Erkenntnis ist, dass dies keine echte Herausforderung ist. Sie benötigen nur den Quellcode bis zum letzten eindeutigen Zeichen .
Ich füge mindestens 1 jedes Zeichens am Anfang des Codes ein,
?R<3+CD,4LINPUT(S$)WHILE"
so dass ich nur eine Kopie des Programms bis zum ersten Anführungszeichen speichern muss.quelle
Python,
9088 BytesTestfall:
quelle
Gestapelt , nicht konkurrierend, 36 Bytes
Als ich sagte, diese Sprache sei noch in der Entwicklung, meinte ich es auch so. Anscheinend
prompt
verwendet, um den gesamten Stapel zu verbrauchen. Deshalb kann ich keine schönen Dinge haben. Probieren Sie es hier aus!Dies ist das Standard-Quine-Framework. Grundsätzlich
:
dupliziert sich die Funktion[...]
auf dem Stack, der dann mit ausgeführt wird!
. Dann wird das Innere von[...]
mit der Funktion auf dem Stapel ausgeführt. Es wandelt es in einen String um, hängt:!
(das Programm selbst) an und nimmt dann eine String-Eingabe mit anprompt
.CS
konvertiert es in eine Zeichenkette. Eine Zeichenkette unterscheidet sich insofern von einer regulären Zeichenkette, als Operatoren über sie vektorisieren. In diesem Fall wirdindex
über die Eingabe vektorisiert, wobei jeder Index der Eingabezeichenfolge im Programmout
ausgegeben und schließlich geputtet wird.Für die Eingabe
Hello, World!
gibt dies:Ich habe versucht, die Zeichenfolge ohne Quine zu verwenden (dh die Zeichenfolge zu codieren, die in Ihrer Quelle enthalten ist), aber es gibt nur eine Art von Anführungszeichen in Stacked, dh,
'
es wäre länger, diese Art von Lösung durchzuführen.quelle
Schale , 12 Bytes
Probieren Sie es online!
Erläuterung
Die Erklärung dient
¨
zum Abgrenzen von Zeichenfolgen und'
zum Abgrenzen von Zeichen:quelle
Java 8,
172122 Bytes0-indiziert und gibt
-1
Zeichen an, die nicht Teil des Quellcodes sind.Erläuterung:
Probieren Sie es online aus.
quelle
J ,
3122 BytesProbieren Sie es online!
1-indiziert, 0 für Zeichen, die im Code nicht vorhanden sind.
''
steht für ein einfaches Anführungszeichen. Suchen Sie jedes Zeichen in der Zeichenfolge11|1+i.~&'
, fügen Sie 1, Modulo 11 hinzu.quelle
> <> 31 Bytes
Probieren Sie es online!
Die Ausgabe ist 1-indiziert,
32
dh das Zeichen befindet sich nicht im Code.quelle
Perl 5 mit
-pl
43 BytesVerwendet durch Zeilenvorschub getrennte Eingaben und druckt
-1
für Zeichen, die nicht im Programm erscheinen.Probieren Sie es online!
quelle
Stax , 19 Bytes
Führen Sie es aus und debuggen Sie es
Gibt einen 0-basierten Index mit einem Zeichen pro Zeile aus. Es stellt sich heraus, dass es kürzer ist, als das
"34bL"34bL
Quine zu modifizieren, das ich zuvor geschrieben habe.quelle