Zeiger, Zeiger, Zeiger!


46

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 returned 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!

16
Ich bin der Meinung, dass dies ein äußerst einfaches Problem ist, daher bin ich nicht sicher, ob es übermäßig gut ankommt. Möglicherweise möchten Sie die Sandbox ausprobieren, sobald Sie genügend Wiederholungen haben.
FryAmTheEggman

6
Ich denke, das hätte ein bisschen interessanter sein können, wenn die Eingabe mehrere Zeilen hatte, so dass Sie eine neue Zeile, Leerzeichen und Karat an den richtigen Positionen einfügen mussten. Ehrlich gesagt sagt die Spezifikation nicht wirklich aus, dass es sich um eine einzelne Zeile handeln wird, aber ich denke, dass die Durchsetzung dieser Richtlinie einige Antworten zu Unrecht ungültig macht, da es kein Beispiel gibt, das dies zeigt.
Geobits

3
Wie ich schon sagte, die Katze ist wahrscheinlich aus dem Sack. Regeländerungen, nachdem gültige Antworten veröffentlicht wurden, funktionieren normalerweise nicht gut. Lebe und lerne;)
Geobits

1
@SohamChowdhury Ich werde nur so tun, als wäre das beabsichtigt;) Soll ich es reparieren?
monkeyonkeyboard

9
Dies mag zwar sehr einfach sein, aber Sie haben sicherlich eine erste Herausforderung gut gemeistert! Sie haben + 16 / -0 Stimmen, 1.300 Aufrufe und 28 Antworten (zum Zeitpunkt dieses Schreibens) und haben die Hot Network Questions-Liste erstellt. Gute Arbeit!
Alex A.

Antworten:


36

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

f(a,c){printf("%s\n%*c",a,c,94);}

19
C kann immer mithalten, es kann einfach nicht immer gewinnen. ;)
Alex A.

3
@AlexA. <Achselzucken> sieht für mich so aus, als würde es gewinnen ;-)
Digitales Trauma

3
1 Zeichen sparen:f(a,c){printf("%s\n%*c",a,c,94);}
Michael M.

Wenn ich eine zynische Person wäre, würde ich sagen, dass es immer noch ungefähr viermal so lang ist wie die kürzeste Antwort in einer Golfsprache. Welches ist über das Geschäft wie gewohnt. ;) Das ist aber schlau. Ich glaube, ich hatte die *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.
Reto Koradi

35

Brainf * ck - 133 Bytes

+++++>>+>>+++>>+++++++++<<<<<<[[->++++++++++<]>>]<++++<<++<<<<--<,>[->+<<->]>>>,<<[->>-<<]<<[->>>>++++++++++<<<<]>>+[,.]>.>[->.<]>>>.

Erwartet Eingaben wie [0-9]{2}.*zB "02Hello world !!!" würde produzieren

Hallo Welt!!!
 ^

Willkommen bei Programming Puzzles und Code Golf! Dies ist ein großartiger erster Beitrag, gute Arbeit! : D
Alex A.

Das Problem ist, niemand weiß, ob dies überhaupt ein gültiger Code ist, geschweige denn, das Problem zu lösen :)
Simon

Ja, ich denke, hier liegt ein Fehler vor. Das Caret sollte unter dem eim Beispiel sein. Auf Kosten von 1 Byte kann dies durch Hinzufügen eines -vor[->.<]
FryAmTheEggman

@FryAmTheEggman du hast recht - siehe die Bearbeitung. Ich hatte es ursprünglich unter dem e, wie es jetzt ist, aber ich wurde durch die Verwendung von zwei IDEs mit unterschiedlichen Schriftarten verwirrt.
sudo rm -rf Schrägstrich

25

IA-32 Maschinencode, 24 Bytes

Hexdump:

66 b8 5e 00 42 38 22 75 fb 66 c7 02 0d 0a 42 42
c6 02 20 e2 fa 89 02 c3

Es ist eine Funktion (unter Verwendung der MS- fastcallKonvention), die den String direkt aktualisiert:

__declspec(naked) void __fastcall carrot(int n, char* s)

Assembler-Code:

    mov ax, '^'; // ah = 0, al = '^'

mystrlen:
    inc edx;
    cmp [edx], ah;
    jne mystrlen;

    mov word ptr [edx], '\r\n'; // append a newline
    inc edx;

mymemset:
    inc edx;
    mov byte ptr [edx], ' ';
    loop mymemset;

    mov [edx], eax; // append a caret and terminate the string
    ret;

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:

int main()
{
    char s[100] = "Lorem ipsum, euro sit amet.";
    carrot(2, s); // credit to Digital Trauma for the name
    puts(s);
}

1
Die Anweisung 66 b8 5e 00bewegt 0x5ezu al, nicht zu ah, und Null ahstatt al, so dass Ihr Kommentar in Assembler - Code ist irreführend.
Ruslan,

@ Ruslan Danke! Fest. Das war ein Überrest einer früheren Version.
Anatolyg

Warum ist nakedda drin? Und warum habe ich es als erstes gesehen?
Caird Coinheringaahing

Es ist Microsoft, das beschlossen hat, das nakedin den Vordergrund
anatolyg

20

Pyth , 8

zp\^*tQd

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 erhalten zp+*dQ\^.

Wenn die Zeichenfolge Anführungszeichen benötigt, vfunktioniert das Hinzufügen am Anfang des Codes. Wenn es durch Kommas getrennt werden muss, werden bis zu 10 Bytes angegeben:

eQp\^*dthQ

Ich denke, dies ist die kürzeste, die es bisher gibt. Gut gemacht.
Monkeyonkeyboard

Der Algorithmus scheint mir falsch, ich denke, ^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).
Jim

1
@Jim Bei dieser Antwort wurde eine ältere Version von Pyth verwendet, bei pder 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 Sie z+*dQ\^für eine kürzere Punktzahl, aber mit einem nachgestellten Zeilenumbruch, tun oder ein pvor 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.
FryAmTheEggman

16

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.

CREATE FUNCTION G(@N INT,@ VARCHAR(MAX))RETURNS TABLE RETURN SELECT @+'
'+SPACE(@n-1)+'^'R

Es wird auf folgende Weise verwendet

SELECT R 
FROM (VALUES
    (1,'This is test 1'),
    (2,'This is test 2'),
    (3,'This is test 3'),
    (4,'This is test 4'),
    (5,'This is test 5')
    )T(n,S)
    CROSS APPLY G(n,S)

Und kehrt zurück

R
---------------
This is test 1
^
This is test 2
 ^
This is test 3
  ^
This is test 4
   ^
This is test 5
    ^

Sehr kreativer Gebrauch einer Sprache, die nicht wirklich zum Golfen gedacht ist;) +1
monkeyonkeyboard

14

Python, 27

lambda n,s:s+'\n%%%dc'%n%94

Dies verwendet zwei Ebenen der Zeichenfolgenformatierung.

Und hier ist eine 25-Byte- Lösung, die teilweise aus Feersums Antwort gestohlen wurde (mit umgekehrter Argumentreihenfolge):

lambda*p:'%s\n%%%dc'%p%94

12

Bash, 27

printf %s\\n%$[$1-1]s^ "$2"

Ausgabe

$ ./carrot.sh 2 "Lorem ipsum, dollar sit amet."
Lorem ipsum, dollar sit amet.
 ^$ 

Karotte? Und was ist der Dollar am Ende?
Scimonster

7
Der Dollar scheint die Aufforderung der Muschel zu sein.
M.Herzkamp,

3
@Scimonster Carrot war mein Witzversuch - siehe meine Bearbeitung zu der Frage . Und ja, $am Ende steht die Shell-Eingabeaufforderung. Die Frage gibt an, dass nachfolgende Zeilenumbrüche zulässig sind, sagt jedoch nicht, dass sie erforderlich sind.
Digital Trauma

10

Python, 29

lambda n,s:s+'\n'+' '*~-n+'^'

Verkettet die Zeichenfolge, eine neue Zeile, n-1Leerzeichen und ein ^.


2
Wenn es nur rjustnicht so lange her wäre ...
Sp3000

10
Ah, der Kaulquappenbetreiber.
user253751

10

sed, 16

2y/1/ /;2s/ $/^/

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:

$ { echo "Lorem ipsum, dollar sit amet."; echo 11; } | sed '2y/1/ /;2s/ $/^/'
Lorem ipsum, dollar sit amet.
 ^
$

1
2y/1/ /;2s/ $/^/
Manatwork

@manatwork Guter Anruf!
Digital Trauma

9

JavaScript (ES6): 63 62 56 52 32 Byte

Dank nderscore für die starke Reduzierung des Codes.

p=(a,b)=>b+`\n${' '.repeat(a)}^`

Version, die über mehrere Browser hinweg funktioniert (47 Bytes):

p=function(a,b){return b+`\n${' '.repeat(a)}^`}

1. Die Frage verwendet eine 1-basierte Indizierung Array(a-1). 2. Die anonymen Funktionen sind standardmäßig zulässig, sodass Sie sie nicht benötigen point=. 3. In der ES6-Version können Sie die returnAnweisung und die geschweiften Klammern entfernen. Verwenden Sie einfach (a,b)=>b+"\n"+Array(a-1).join(" ")+" ^".
Dennis,

1
33 Bytes: (durch \neine aktuelle Newline ersetzen )p=(a,b)=>b+`\n${' '.repeat(a-1)}^`
Endpunkt 10.06.15

@dennis Die Indizierung funktioniert bei mir perfekt: i.stack.imgur.com/Tdejc.png
adroitwhiz

@ Tennis Array(1).join(' ')führt zu einer leeren Zeichenfolge :)
nderscore

@nderscore Ich kann keine Möglichkeit finden, eine aktuelle Newline zu verwenden, ohne dass dies zu einem Zeilenumbruch im Code-Snippet führt. Die Indizierung folgt dem angegebenen Beispiel: i.stack.imgur.com/Tdejc.png
adroitwhiz

7

CJam, 9 Bytes

q~N@(S*'^

Probieren Sie es online aus.

Wie es funktioniert

q~  e# Read the input from STDIN and interpret it.
    e# This pushes the integer and the string on the stack.
N@  e# Push a linefeed an rotate the integer on top of it.
(S* e# Subtract 1 and push a string consisting of that many spaces.
'^  e# Push a caret.

6

Python, 29

Hier ist ein lustigerer Weg, dies in 29 zu tun:

lambda*p:'%s\n%*s'%(p+('^',))

Anwendungsbeispiel:

>>> f=lambda*p:'%s\n%*s'%(p+('^',))
>>> print f('lorem',5)
lorem
    ^

5

TI-BASIC, 10 (?) Bytes

Disp Ans
Output(3,N,"^

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.

Input Str1
2+inString(Str1," 
//^there's a space after the quote
Disp sub(Str1,Ans,length(Str1)-Ans
Output(4,expr(sub(Str1,1,1)),"^

Beides setzt voraus, dass der Bildschirm vor dem Ausführen gelöscht wurde.


Es ist besser, die Eingabe von Input für die Zahl und von Ans für die Zeichenfolge zu übernehmen.
Lirtosiast

Das erste funktioniert auch nicht, wenn der Programmname, die Zuweisung und die Zeichenfolge zusammen mehr als 16 Zeichen umfassen.
Lirtosiast

@ThomasKwa 26, eigentlich, da ich einen Farbrechner habe: P Es funktioniert technisch nicht, wenn man das Überschreiben eines Teils der Eingabe als 'funktionierend' betrachtet.
MI Wright

Das erste funktioniert, wenn Sie ein ClrHome: Input N hinzufügen, da die aktuelle Abstimmung über Meta für das Mischen von E / A-Methoden bei +7 liegt.
Lirtosiast

5

dc, 19

?pr256r^255/32*62+P

Die Eingabe erfolgt von STDIN. dcZeichenfolgen 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 gibt nLeerzeichen (ASCII-Zeichen 32), aber wir müssen n-1folgen ^, also addieren wir einfach 62 zur letzten 256-stelligen Basis.

Ausgabe

$ dc -e '?pr256r^255/32*62+P' <<< "2 [Lorem ipsum, dollar sit amet.]"
Lorem ipsum, dollar sit amet.
 ^$

4

C 59 57 47 Bytes

f(a,c){for(puts(a);--c;putchar(32));puts("^");}

Ziemlich einfach. Ungolfed-Version:

f(char* a,int c){
    puts(a);        //Print the string first

    for(;--c;)      //Until number-1 is not 0
        putchar(32);//Print a space
    puts("^");      //Print a caret
}

Teste es hier
Danke an @anatolyg für das Speichern von 10 Bytes!


Es ist schöner, sich zu bewegen puts(a)und putchar(32)in die Klammern der forSchleife zu treten - da sind genau 2 leere Stellen! Außerdem glaube ich nicht, dass Sie den Typ von deklarieren müssen aund c- verwenden Sie einfach das Implizite intfür sie - funktionieren, wenn Sie dies nicht tun #include <stdio.h>.
Anatolyg

@anatolyg, Danke! Ich dachte nicht, dass das Weglassen der Typen funktionieren würde, aber zu meiner Überraschung tat es das.
Spikatrix

4

C # 55

Eine Funktion, deren Konzept meiner C-Antwort ähnelt, deren Rückgabe diesmal jedoch kürzer ist als die Ausgabe.

string f(string a,int b){return a+'\n'+"^".PadLeft(b);}

4

SAS, 35 Bytes

%macro a(n,s);put &s/@&n."^";%mend;

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:

data;
%a(3,"My String");
run;

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)

data b;
  n=3;
  s="My String";
run;

(aktueller Code)

data;set b;put s/@n"^";run;

Gut zu sehen, dass SO hier ein SAS-Experte für PPCG ist. :)
Alex A.

Ich bin mir ziemlich sicher, dass einige der Oldtimer, die mit DM-Skripten vertraut sind, dieses Ergebnis am besten erzielen können ... Und meine cmdmac-Fähigkeiten sind mies.
Joe

Ich vergesse immer, dass DM überhaupt existiert und ich weiß nicht einmal, was cmdmac ist! Übrigens, wenn Sie die Bytes für den gesamten Datenschritt zählen, brauchen Sie das nicht 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.
Alex A.

Ja, meine tief verwurzelten SAS-Reflexe lassen mich das wohl nicht intuitiv bedienen :). Vielen Dank.
Joe

Apropos Oldtimer, ich denke, Sie könnten ein paar Bytes sparen, indem Sie sich aller SAS-Intuition entziehen und ein altmodisches Makro verwenden. Ich kann mich nicht erinnern, ob sie Parameter akzeptieren können.
Alex A.

3

Matlab / Octave, 41

@(n,s)sprintf('%s\n%s^',s,ones(1,n-1)+31)

Dies ist eine anonyme Funktion, die die Zeichenfolge zurückgibt. Dies erzeugt eine Warnung, die durch vorheriges Aufrufen unterdrückt werden kann warning off.


Meinen Sie die Warnung des Editors oder gibt sie tatsächlich eine Warnung für Sie aus? Außerdem habe ich dich um 16 Zeichen geschlagen ;-) Aber meins gibt das ans =Bit aus, also sind es nach der Korrektur nur 10 Zeichen Unterschied.
Oebele,

@Oebele gibt eine Warnung aus, die zurückgegebene Zeichenfolge ist jedoch nicht betroffen.
FryAmTheEggman

3

K, 21 Bytes

{y,"\n",1_|"^",x#" "}

Beispiel:

ryan@DevPC-LX:~/golf/caret$ rlwrap k
K Console - Enter \ for help

  `0:{y,"\n",1_|"^",x#" "}[2;"Lorem ipsum, dollar sit amet."]
Lorem ipsum, dollar sit amet.
 ^  

Erklärung ( xist die Zahl, yist die Zeichenfolge):

{                   }   enclosing function
               x#" "    repeat the space `x` times
           "^",         prepend the caret
          |             reverse the string to put the caret at the end
        1_              drop the extra space
   "\n",                prepend a newline
 y,                     prepend the text

3

R 49 48 46

Als 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.

function(n,s)cat(s,strwrap('^',,n-1),sep='\n')

Testlauf

> f=function(n,s)cat(s,strwrap('^',,n-1),sep='\n')
> f(29,'The caret should point here v hopefully')
The caret should point here v hopefully
                            ^
>

Funktion (n, x) cat (x, "\ n", rep ("", n-1), "^", sep = "") ist 48 Zeichen
Flunder

@Flounderer Danke dafür ... meine ursprüngliche Idee war ähnlich, aber ich habe es nicht so gut gemacht
MickyT 10.06.15

Wenn ich zwei anfängliche Leerzeichen darf, funktioniert dies: function(n,x)cat(" ",x,"\n",rep("",n),"^")und speichert ein paar Zeichen
Flunder

@Flounderer vermute ich nicht. strwrap hat auch einige Möglichkeiten, aber es würde wahrscheinlich länger dauern.
MickyT,

1
Das ist schön! Ich habe die strwrapFunktion noch nie gesehen . Gibt es eine einfache Möglichkeit zu sagen, was es tut? Ich kann es nicht aus der Dokumentation herausfinden.
Flunder

3

Python3, 38 36 Bytes

def f(s,i):return s+'\n'+' '*~-i+'^'

# OR 

def f(s,i):print(s+'\n'+' '*~-i+'^')

Teste es hier
Danke an @Dennis für das Speichern von 2 Bytes!


(i-1)->~-i
Dennis

Ich bin schwach in Bitoperationen und Mathe .... Trotzdem danke! :-D
Spikatrix

2

Julia, 27 Bytes

(n,s)->s*"\n"*" "^(n-1)*"^"

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-1Leerzeichen und das Caret anhängen . Die Verkettung von *Zeichenfolgen erfolgt mit und die Wiederholung von Zeichenfolgen mit ^.

Ungolfed:

function f(n, s)
    s * "\n" * " "^(n-1) * "^"
end

Beispiel:

julia> println(f(2, "Lorem ipsum, dollar sit amet."))
Lorem ipsum, dollar sit amet.
 ^

2

PHP (CLI) - 42

<?=sprintf("%s\n%$argv[1]s",$argv[2],'^');

Rufen Sie es von der Kommandozeile aus auf:

php pointer.php 2 "Lorem ipsum, dollar sit amet."

Ich habe es erst jetzt bemerkt. Aber deine Antwort ist genau wie meine 2. Option. Ich biete es Ihnen: <?printf("$S\n%{$P}s",'^');. Ersetzen Sie die \ndurch eine echte Newline. Die Summe beträgt 5 Bytes. Das funktioniert nur auf PBP4.1 und darunter.
Ismael Miguel

Wow, so viele Fehler in diesem Kommentar ... Ich meinte, dass er 26 Bytes lang ist und nur mit PHP4.1 funktioniert. Und es ist deins!
Ismael Miguel

2

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.

@(N,S)[S 10 ones(N-1) 94]

So rufen Sie diese Funktion wie folgt auf:

ans(2, 'Lorem ipsum, dollar sit amet.')

gibt die Ausgabe aus:

ans =

Lorem ipsum, dollar sit amet.
 ^

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. ansSie müssen die Funktion also neu definieren, wenn Sie sie ein zweites Mal verwenden möchten!


Sehr schön! Ich wusste nicht, dass das Einfügen eines Strings in einen Vektor so funktioniert. Da dies eine Funktion ist, gibt die Zeichenfolge den aussagekräftigen Wert zurück, und die MATLAB-Repl-Umgebung druckt ihn einfach aus. dh wenn du x=ans(2, 'asdf');das tust, bekommst du kein ans = Ding.
FryAmTheEggman

2

Mein erster Versuch mit Codegolf

Java, 133 65

String g(int i,String s){for(s+="\n";--i>0;)s+=" ";return s+"^";}

Ich bin sicher, dass es noch mehr reduziert werden kann.

Alter Code

public void go(int i,String s){System.out.println(s);IntStream.range(1,i).forEach(j->System.out.print(" "));System.out.println("^");}

Kannst du System.outirgendwo lagern ?
Ismael Miguel

2
Keine Notwendigkeit für public. Und wechseln Sie IntStream.range(1,i).forEach(j->System.out.print(" "));zufor(;--i>0;)System.out.print(" ");
Spikatrix

@CoolGuy aha! manchmal ist einfach besser
pallavt

Können Sie das s+="\n"Innere der for()Initialisierung verschieben, um dort das Semikolon zu verwenden?
Lirtosiast

@ ThomasKwa 1 Byte weniger
Pallavt

2

Swift, 41

Es ist enttäuschend, dass Swift keinen Operator *auf Arrayoder hat String.

{$1+reduce(0..<$0,"\n",{$0.0+" "})+"^"}

Für Swift 2.0:{$1+(0..<$0).reduce("\n"){$0.0+" "}+"^"}
Kametrixom

1

SpecBAS - 34

1 INPUT n,s$: PRINT s$'TAB n-1;"^"

Apostrophe in PRINTerzwingt eine neue Zeile, dann muss nur noch der Cursor zur korrekten Position bewegt werden.



1

JavaScript - 52 Bytes

Hier ist meins, es ist ziemlich einfach.

function f(n,s){return s+"\n"+Array(n).join(" ")+"^"}

Verwendungszweck:

$ console.log(f(7, "Any string at all"))

Any string at all
      ^

Es zeigt auf das siebte Zeichen.


Schön zu retten Scimonster O_O
Florrie

1
Du kannst es so schreiben 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 Position
Ismael Miguel

1

Perl 5, 31

sub{"$_[0]
"." "x($_[1]-1)."^"}

Sie können 2-3 Zeichen speichern. Löschen Sie den letzten Zeilenumbruch, da er nicht erforderlich ist, und ändern Sie den ersten Zeilenumbruch in einen wörtlichen Zeilenumbruch. (Perl ist in Ordnung mit mehrzeiligen Zeichenfolgen)
Mr. Llama

@ Mr.Llama danke, die sind gut.
Hobbs
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.