Einführung
In den Fehlerausgaben einiger Sprachen wie Java wird ein Zeiger angezeigt, der dem Programmierer eine Vorstellung davon gibt, wo genau der Fehler aufgetreten ist.
Nehmen Sie dieses Beispiel auf Ideone:
Main.java:12: error: ';' expected
Invalid Java!
^
Beachten Sie, dass das Caret anzeigt, wo sich der ungültige Code befindet?
Herausforderung
Ihre Herausforderung ist: gegebene Anzahl N und String S , legen Sie einen Zeiger auf dem N - ten Zeichen in S .
Beispiele
Eingabe :2, "Lorem ipsum, dollar sit amet."
Ausgabe :
Lorem ipsum, dollar sit amet.
^
Regeln
- Die Eingabe erfolgt über STDIN oder Funktionsparameter
- Die Ausgabe wird auf die Konsole oder auf
return
ed ausgedruckt - In der Ausgabe sind neue Zeilen, Leerzeichen usw. zulässig
- Das Zeigerzeichen muss ein ^ Caret sein und sich in einer neuen Zeile befinden.
- Das ist Codegolf, also gewinnt die kürzeste Antwort. Viel Glück!
Antworten:
C 33
Wenn nur eine Funktion erlaubt ist, kann auch c mithalten.
(Für den Datensatz, 2 Bytes gespeichert thx zu @Cool Guy. Mt thx Kommentar wird unerwartet verdampft.)
1 weiteres Zeichen gespeichert dank @Mig
quelle
f(a,c){printf("%s\n%*c",a,c,94);}
*
Option bereits in der Formatzeichenfolge gesehen, aber völlig vergessen. Könnte sich als nützlich für einige der zukünftigen Herausforderungen im Bereich der ASCII-Kunst erweisen.Brainf * ck - 133 Bytes
Erwartet Eingaben wie
[0-9]{2}.*
zB "02Hello world !!!" würde produzierenquelle
e
im Beispiel sein. Auf Kosten von 1 Byte kann dies durch Hinzufügen eines-
vor[->.<]
IA-32 Maschinencode, 24 Bytes
Hexdump:
Es ist eine Funktion (unter Verwendung der MS-
fastcall
Konvention), die den String direkt aktualisiert:Assembler-Code:
Es verwendet
WORD
-sized (16-Bit) Daten an einigen Stellen. Dies hat einen Nachteil (1-Byte-Präfix) im 32-Bit-Code, verkleinert den Code jedoch trotzdem - bei Verwendung von 32-Bit-Daten werden zwei Null-Byte in den Code eingefügt!Am Ende schreibt es 4 Bytes (
eax
) anstelle von 2 Bytes (ax
) - der Code ist auf diese Weise kleiner, und 2 zusätzliche Bytes Junk gehen nach der Zeichenfolgenbeendigung, sodass niemand sie bemerkt.Verwendungszweck:
quelle
66 b8 5e 00
bewegt0x5e
zual
, nicht zuah
, und Nullah
stattal
, so dass Ihr Kommentar in Assembler - Code ist irreführend.naked
da drin? Und warum habe ich es als erstes gesehen?naked
in den VordergrundPyth , 8
Diese Lösung funktioniert nicht mehr, da sich das Festschreiben nach dem, mit dem ich verknüpft habe, als Sprachenname geändert hat
p
, um den Wert 1 zu erhaltenzp+*dQ\^
.Wenn die Zeichenfolge Anführungszeichen benötigt,
v
funktioniert das Hinzufügen am Anfang des Codes. Wenn es durch Kommas getrennt werden muss, werden bis zu 10 Bytes angegeben:quelle
^
wird immer unter dem ersten Zeichen sein. Übrigens, die Eingabeparameter werden dem Online-Interpreter in der falschen Reihenfolge übergeben (daher schlägt die Ausführung fehl).p
der Arität 1 vorlag. Dadurch wurde zuerst die erste Zeile der Ausgabe gedruckt und dann das Caret in der nächsten Zeile, gefolgt von den Leerzeichen. Jetzt könnten Siez+*dQ\^
für eine kürzere Punktzahl, aber mit einem nachgestellten Zeilenumbruch, tun oder einp
vor dem hinzufügen+
, um es zu entfernen. Ich bin mir nicht sicher, was ich hier tun soll, da die Leute diese Version der Antwort hochgestuft haben. Ich denke, ich werde versuchen, die Version zu finden, an der es gearbeitet hat.T-SQL, 90
Es ist zwar eine recht einfache Frage, aber es ist immer interessant, diese in Sprachen zu testen, die sie eigentlich nicht gut unterstützen oder auch nicht gut Golf spielen.
Diese Antwort ist fast garantiert die längste.
Dadurch wird eine Inline-Tabellenfunktion für SQL Server erstellt, die @n und @ als Parameter verwendet und die Ergebnisse als Spalte zurückgibt. Der Wagenrücklauf ist signifikant, sonst müsste ich char (13) verwenden.
Es wird auf folgende Weise verwendet
Und kehrt zurück
quelle
Python, 27
Dies verwendet zwei Ebenen der Zeichenfolgenformatierung.
Und hier ist eine 25-Byte- Lösung, die teilweise aus Feersums Antwort gestohlen wurde (mit umgekehrter Argumentreihenfolge):
quelle
Bash, 27
Ausgabe
quelle
$
am Ende steht die Shell-Eingabeaufforderung. Die Frage gibt an, dass nachfolgende Zeilenumbrüche zulässig sind, sagt jedoch nicht, dass sie erforderlich sind.Python, 29
Verkettet die Zeichenfolge, eine neue Zeile,
n-1
Leerzeichen und ein^
.quelle
rjust
nicht so lange her wäre ...sed, 16
Dies ist so etwas wie ein Testfall dieser Meta-Antwort . Insbesondere fordere ich, dass die Zahl N unär eingegeben wird. Beispielsweise für die caret in Position 2, der Eingang für N wäre
11
. Es ist auch nicht genau spezifiziert, welche Reihenfolge S und N sein sollen, so dass hier S zuerst folgt, gefolgt von unärem N in einer neuen Zeile, alles durch STDIN.Ausgabe:
quelle
2y/1/ /;2s/ $/^/
JavaScript (ES6):
6362565232 ByteDank nderscore für die starke Reduzierung des Codes.
Version, die über mehrere Browser hinweg funktioniert (47 Bytes):
quelle
Array(a-1)
. 2. Die anonymen Funktionen sind standardmäßig zulässig, sodass Sie sie nicht benötigenpoint=
. 3. In der ES6-Version können Sie diereturn
Anweisung und die geschweiften Klammern entfernen. Verwenden Sie einfach(a,b)=>b+"\n"+Array(a-1).join(" ")+" ^"
.\n
eine aktuelle Newline ersetzen )p=(a,b)=>b+`\n${' '.repeat(a-1)}^`
Array(1).join(' ')
führt zu einer leeren Zeichenfolge :)CJam, 9 Bytes
Probieren Sie es online aus.
Wie es funktioniert
quelle
Python, 29
Hier ist ein lustigerer Weg, dies in 29 zu tun:
Anwendungsbeispiel:
quelle
TI-BASIC, 10 (?) Bytes
Die Eingabe erfolgt in der Variablen N, wie in der Frage angegeben, aber Sie können den Buchstaben var S nicht als Zeichenfolge verwenden. Anstelle davon dauert es String - Eingang von Am, so das Beispiel im OP auszuführen:
2->N:"Lorem ipsum, dollar sit amet.":prgm<program name>
.Mir ist bewusst, dass dies wahrscheinlich nicht zählt, da jedes durch Doppelpunkte getrennte Segment technisch eine separate Aussage ist. Hier ist ein 46-Byte- Programm, das Eingaben als
N "S"
(2 "Lorem ipsum, dollar sit amet."
) akzeptiert.Beides setzt voraus, dass der Bildschirm vor dem Ausführen gelöscht wurde.
quelle
dc, 19
Die Eingabe erfolgt von STDIN.
dc
Zeichenfolgen sind Makrodefinitionen und enthalten in[
]
. Die Zeichenfolge von Leerzeichen wird durch Berechnung der Zahl generiert, die, wenn sie als Basis-256-Byte-Datenstrom ausgedrückt wird, die von uns benötigte Zeichenfolge ergibt. Die Berechnung ist((n ^ 256) / 255) * 32)
. Dies gibtn
Leerzeichen (ASCII-Zeichen 32), aber wir müssenn-1
folgen^
, also addieren wir einfach 62 zur letzten 256-stelligen Basis.Ausgabe
quelle
C
595747 BytesZiemlich einfach. Ungolfed-Version:
Teste es hier
Danke an @anatolyg für das Speichern von 10 Bytes!
quelle
puts(a)
undputchar(32)
in die Klammern derfor
Schleife zu treten - da sind genau 2 leere Stellen! Außerdem glaube ich nicht, dass Sie den Typ von deklarieren müssena
undc
- verwenden Sie einfach das Impliziteint
für sie - funktionieren, wenn Sie dies nicht tun#include <stdio.h>
.C # 55
Eine Funktion, deren Konzept meiner C-Antwort ähnelt, deren Rückgabe diesmal jedoch kürzer ist als die Ausgabe.
quelle
SAS, 35 Bytes
Das ist das SAS-Äquivalent einer nackten Funktion; Den Datenschritt zum Aufrufen hinzuzufügen (entspricht der C-Hauptfunktion zum Aufrufen), wäre etwas mehr (9 weitere Bytes - Ty Alex), aber ich denke, das ist für diesen Zweck nicht erforderlich. Wie würde es heißen:
Es gibt eine reine Makroimplementierung, die jedoch viel länger dauert, auch wenn Sie zulassen, dass eine Warnung zu ungültigen Parametern für n = 1 ausgegeben wird.
Wenn wir vordefinierte Parameter verwenden könnten, wäre SAS vergleichsweise kurz, was eine Seltenheit für eine Sprache ist, die definitiv nicht kurz sein soll.
Wenn ein Dataset die Eingabequelle sein darf, wie Sie es in SAS (oder mit% let-Anweisungen) tun würden, dies aber wahrscheinlich nicht zulässig ist, ist dies sogar noch kürzer ( 27 Byte , was tatsächlich 25 sein könnte) Wenn Sie garantiert haben, dass das Dataset unmittelbar vor der Ausführung erstellt wurde, können Sie Folgendes verwenden
set;
:(bereits vorhandener Datensatz)
(aktueller Code)
quelle
data a;
. Sie können einfach tun,data;
was 2 Bytes einspart. Aber wie Sie sagten, ist es für diesen Zweck sowieso nicht notwendig.Matlab / Octave, 41
Dies ist eine anonyme Funktion, die die Zeichenfolge zurückgibt. Dies erzeugt eine Warnung, die durch vorheriges Aufrufen unterdrückt werden kann
warning off
.quelle
ans =
Bit aus, also sind es nach der Korrektur nur 10 Zeichen Unterschied.K, 21 Bytes
Beispiel:
Erklärung (
x
ist die Zahl,y
ist die Zeichenfolge):quelle
R
494846Als unbenannte Funktion, die an STDOUT ausgegeben wird. Vielen Dank an @Flounderer für die Verbesserung.
verwendet jetzt strwrap, um das Caret mit n-1 zu identifizieren. cat verwendet ein Trennzeichen von \ n anstelle einer leeren Zeichenfolge.
Testlauf
quelle
function(n,x)cat(" ",x,"\n",rep("",n),"^")
und speichert ein paar Zeichenstrwrap
Funktion noch nie gesehen . Gibt es eine einfache Möglichkeit zu sagen, was es tut? Ich kann es nicht aus der Dokumentation herausfinden.Python3,
3836 BytesTeste es hier
Danke an @Dennis für das Speichern von 2 Bytes!
quelle
(i-1)
->~-i
Julia, 27 Bytes
Dadurch wird eine unbenannte Funktion erstellt, die eine Ganzzahl und eine Zeichenfolge als Eingabe akzeptiert und eine Zeichenfolge zurückgibt. Um es zu nennen, geben Sie ihm einen Namen, z
f=(n,s)->...
.Alles, was hier passiert, ist, dass wir eine neue Zeile,
n-1
Leerzeichen und das Caret anhängen . Die Verkettung von*
Zeichenfolgen erfolgt mit und die Wiederholung von Zeichenfolgen mit^
.Ungolfed:
Beispiel:
quelle
PHP (CLI) - 42
Rufen Sie es von der Kommandozeile aus auf:
quelle
<?printf("$S\n%{$P}s",'^');
. Ersetzen Sie die\n
durch eine echte Newline. Die Summe beträgt 5 Bytes. Das funktioniert nur auf PBP4.1 und darunter.Matlab, 25
Dieser ist extrem frech. Offenbar zeigt druckt nicht druckbare Zeichen als Leerzeichen. Der folgende Code definiert eine Funktion mit dem Namen
ans
, die den Spezifikationen entspricht.So rufen Sie diese Funktion wie folgt auf:
gibt die Ausgabe aus:
Ich mag den
ans =
Teil in Matlab Antworten immer nicht . Wenn dies ein Problem ist, muss ich 6 Bytes hinzufügen ... aber ich habe es immer so in Matlab Antworten gesehen. Beachten Sie, dass das Ausführen dieses Codes die Variable überschreibt.ans
Sie müssen die Funktion also neu definieren, wenn Sie sie ein zweites Mal verwenden möchten!quelle
x=ans(2, 'asdf');
das tust, bekommst du kein ans = Ding.Mein erster Versuch mit Codegolf
Java,
13365Ich bin sicher, dass es noch mehr reduziert werden kann.
Alter Code
quelle
System.out
irgendwo lagern ?public
. Und wechseln SieIntStream.range(1,i).forEach(j->System.out.print(" "));
zufor(;--i>0;)System.out.print(" ");
s+="\n"
Innere derfor()
Initialisierung verschieben, um dort das Semikolon zu verwenden?Swift, 41
Es ist enttäuschend, dass Swift keinen Operator
*
aufArray
oder hatString
.quelle
{$1+(0..<$0).reduce("\n"){$0.0+" "}+"^"}
SpecBAS - 34
Apostrophe in
PRINT
erzwingt eine neue Zeile, dann muss nur noch der Cursor zur korrekten Position bewegt werden.quelle
GolfScript 11
Testen Sie hier .
quelle
JavaScript - 52 Bytes
Hier ist meins, es ist ziemlich einfach.
Verwendungszweck:
Es zeigt auf das siebte Zeichen.
quelle
alert((P=prompt)()+"\n"+Array(P()+1).join(" ")+"^")
. Und Sie sparen 2 Bytes. Sie können es auch zu einem Stasksnippet machen, um den ausgeführten Code zu präsentieren. Das erwartet, dass die Saite zuerst kommt, dann die PositionPerl 5, 31
quelle