46
\$\begingroup\$

Introduction

In the error outputs of some languages such as Java, a pointer is shown to give the programmer an idea of exactly where the error went wrong.

Take this example on Ideone:

Main.java:12: error: ';' expected
    Invalid Java!
                ^

Notice the caret shows where the invalid code is?

Challenge

Your challenge is: given number N and string S, place a pointer on the Nth character in S.

Examples

Input: 2, "Lorem ipsum, dollar sit amet."

Output:

Lorem ipsum, dollar sit amet.
 ^

Rules

  • Input is received via STDIN or function parameters
  • Output is printed out to the console or returned
  • Trailing new lines, spaces etc are allowed in the output
  • The pointer character must be a ^ caret and must be on a new line.
  • This is code golf, so the shortest answer wins. Good luck!
\$\endgroup\$
  • 16
    \$\begingroup\$ I feel like this is an extremely simple problem, so I am not certain it will be received overly well. You might want to try the sandbox once you have enough rep. \$\endgroup\$ – FryAmTheEggman Jun 10 '15 at 1:08
  • 6
    \$\begingroup\$ I think this could have been made a bit more interesting if the input had multiple lines, so that you had to insert a newline, spaces, and carat at the correct position(s). Honestly, the spec doesn't really say it will be a single line, but I think enforcing that now will invalidate a few answers unfairly, since there's no example that shows this. \$\endgroup\$ – Geobits Jun 10 '15 at 2:04
  • 3
    \$\begingroup\$ Like I said, the cat's probably out of the bag on this one. Rule changes after valid answers are posted usually don't work out well. Live and learn ;) \$\endgroup\$ – Geobits Jun 10 '15 at 3:06
  • 1
    \$\begingroup\$ @SohamChowdhury I'll just pretend that was intentional ;) Do you want me to fix it? \$\endgroup\$ – monkeyonkeyboard Jun 10 '15 at 9:36
  • 9
    \$\begingroup\$ While this may be very simple, you've certainly done well for a first challenge! You have +16/-0 votes, 1,300 views, and 28 answers (as of this writing) and you've made the Hot Network Questions list. Nice job! \$\endgroup\$ – Alex A. Jun 10 '15 at 14:50

62 Answers 62

1
\$\begingroup\$

Perl 5, 31

sub{"$_[0]
"." "x($_[1]-1)."^"}
\$\endgroup\$
  • \$\begingroup\$ You can save 2-3 characters. Drop the final newline as it's not required, then change the first newline to a literal newline. (Perl is okay with multi-line strings) \$\endgroup\$ – Mr. Llama Jun 10 '15 at 16:10
  • \$\begingroup\$ @Mr.Llama thanks, those are good. \$\endgroup\$ – hobbs Jun 10 '15 at 16:12
1
\$\begingroup\$

Perl, 45

This is a pretty horribly golfed answer, but it's my first attempt at code golf.

<>=~/(.*), "(.*)"/;print"$2
"." "x($1-1)."^";
\$\endgroup\$
  • 1
    \$\begingroup\$ Welcome to PPCG! If you enjoy Perl, reading Tips for golfing in Perl? is a must. Using the -p switch (counted as 1 byte), you can eliminate <>=~ and replace print with $_=. If you take a few liberties with the input format on top of that, you can shorten your code to /\d+ /;$_=$'.$"x($&-1)."^". \$\endgroup\$ – Dennis Jun 11 '15 at 5:57
1
\$\begingroup\$

Ruby, 17 23 22

->s,n{s+$/+?\s*~-n+?^}

This is as short as I can go from something like this:

# Lambdas are like Procs, except with a fixed num of arguments
lambda do |sourceLine, offset|
    # The last expression is returned as the lambda's return value.
    # Multiplying a string by N will repeat it N times.
    sourceLine + "\n" + " " * (offset - 1) + "^"
end
\$\endgroup\$
  • 1
    \$\begingroup\$ And where are you outputting/returning the source code line to which the caret points? \$\endgroup\$ – manatwork Jun 10 '15 at 18:28
  • \$\begingroup\$ The rules say: "Output is printed out to the console or returned". I am returning the output. \$\endgroup\$ – boxmein Jun 10 '15 at 18:32
  • \$\begingroup\$ The accent was not on the action but on the subject: your proc neither receives nor returns the source code. \$\endgroup\$ – manatwork Jun 10 '15 at 18:35
  • \$\begingroup\$ Oh, sorry! Edited the code. \$\endgroup\$ – boxmein Jun 10 '15 at 18:51
  • 1
    \$\begingroup\$ You can save 1 char by replacing ?\n with $/. \$\endgroup\$ – Tony Ellis Jun 11 '15 at 8:39
1
\$\begingroup\$

Pascal: 57 characters

procedure p(n:Byte;s:string);begin
Write(s,#10,'^':n)end;

Just to demonstrate Pascal's cute little output formatting. The rest is depressing.

\$\endgroup\$
1
\$\begingroup\$

Perl, 20

After seeing @Digital Trauma's answer, I wanted to port his answer to Perl to show an another example of accepting the input numbers as unary as a default. This is based on the meta discussion.

$i++&y/1/ /&s/ $/^/

19 characters +1 for -p flag.

Run with:

{ echo "Lorem ipsum, dollar sit amet."; echo 111; } | perl -pe'$i++?y/1/ /&&s/ $/^/:1'
\$\endgroup\$
  • \$\begingroup\$ The ternary operator seems pointless here as you only have instruction for the “then” branch: $i++&y/1/ /&s/ $/^/. \$\endgroup\$ – manatwork Jun 12 '15 at 15:17
  • \$\begingroup\$ @manatwork good call! updated answer \$\endgroup\$ – hmatt1 Jun 12 '15 at 15:19
1
\$\begingroup\$

C, 60 49

f(n,s){puts(s);while(n-=1)putch(' ');putch('^');}

First post, so I guess it's not that good.

\$\endgroup\$
1
\$\begingroup\$

Scala (49 42 bytes)

def p(i:Int,s:String)=s+"\n"+" "*(i-1)+"^"

scala> def p(i:Int,s:String)=s+"\n"+" "*(i-1)+"^"
p: (i: Int, s: String)String

scala> p(2, "Lorem ipsum, dollar sit amet.")
res0: String =
Lorem ipsum, dollar sit amet.
 ^
\$\endgroup\$
1
\$\begingroup\$

J, 19

Including parentheses!

The verb:

(],:'^',~' '#~<:@[)

Use:

9 (],:'^',~' '#~<:@[) 'Invalid Java!'
Invalid Java!
        ^
\$\endgroup\$
1
\$\begingroup\$

This is my first code golf, but here I go.

Haskell, 36

f s n=s++'\n':replicate(n-1)' '++"^"

The regular version being

placeCaret :: String -> Integer -> String
placeCaret s n = s ++ '\n' : replicate (n - 1) ' ' ++ "^"

So, not really much change. Clearly, the replicate is wasting the most space here, but as far as I know there are no alternatives in Prelude. I played a bit with other things which could have been cool tricks, but they all ended up being the same length.

Example usage:

Prelude> putStrLn $ f ['a'..'z'] 7
abcdefghijklmnopqrstuvwxyz
      ^

putStrLn is needed so that the newline will be displayed as a newline instead of "\n" (in GHCi only).

I know I'm VERY late to this party, but whatever.

\$\endgroup\$
1
\$\begingroup\$

Straw, 13 bytes

<#<>
> ,}*>^>

Try it online!

^ is the only non-alphanumeric character (with \) to not be assigned to a command, so no need for a string literal to push it.

\$\endgroup\$
1
\$\begingroup\$

Haskell, 30 bytes

s!n=s++'\n':([1..n]>>" ")++"^"
\$\endgroup\$
1
\$\begingroup\$

C++ (with the standard library) - 159 121 bytes (-38 by Riley)

#include<iostream>
using namespace std;int main(int c,char**v){cout<<string(v[2])<<endl<<string(stoi(v[1])-1,' ')<<"^";}

Gets input from the command line args.
Example usage: ./a.out 8 "hello, world"

This is my first ever code golf, so if you have any tips, that would be great!

\$\endgroup\$
  • \$\begingroup\$ 1. Unless specified, you can assume the input will be correctly formatted. That lets you skip the exit part. 2. You shouldn't need to assign p and s. I think you can just put stoi(...) and string(...) right in the cout. 3. I don't think you need the space in char** v. I hope this helps :) \$\endgroup\$ – Riley Feb 2 '17 at 14:52
  • \$\begingroup\$ @Riley Thanks! That helped. \$\endgroup\$ – Admicos Feb 2 '17 at 15:00
  • \$\begingroup\$ You shouldn't need the space in stoi either. \$\endgroup\$ – Riley Feb 2 '17 at 15:04
0
\$\begingroup\$

rs, 35 bytes

(\d+), "(.*?)"/\2\n( )^^(\1)^
 \^/^

Unfortunately, the online demo has a bug that I need to fix with newlines, so I can't put a demo link.

EDIT: I fixed the bug in the demo page. So...

Live demo!

This is pretty simple:

  • Line 1 places the text, a newline, and a series of spaces repeated one more times than we want.
  • Line 2 gets rid of the extra space.
\$\endgroup\$
0
\$\begingroup\$

Lua, 58 53 bytes

a=" "function p(n,s)print(s,"\n"..a:rep(n-1).."^")end

Thanks to manatwork this just got shorter by 5 bytes. Looks like I need to refresh my Lua skills.

First version:

function p(n,s)print(s.."\n"..string.rep(" ",n-1).."^")end
\$\endgroup\$
  • 2
    \$\begingroup\$ That static method call is horribly long. function p(n,s)x=" ";print(s.."\n"..x:rep(n-1).."^")end \$\endgroup\$ – manatwork Jun 10 '15 at 17:24
  • 1
    \$\begingroup\$ Actually you can remove one more character. As “Trailing new lines, spaces etc are allowed in the output”, replace the first .. with ,. This way a trailing tab will appear in the first line, but is allowed. \$\endgroup\$ – manatwork Jun 10 '15 at 18:37
0
\$\begingroup\$

PHP 4.1, 35 31 bytes

This one was really simple, but still fun!

<?="$S
",str_pad('^',$P,' ',0);

You can pass the values over POST, GET, SESSIONS, ...

The key S must contain the string, while the key P must contain the character number where you want the ^.


Old answer (35 bytes):

<?="$S
",str_repeat(' ',--$P),'^';
\$\endgroup\$
0
\$\begingroup\$

F#, 31 characters

let p n s=s+"\n"+"^".PadLeft(n)
\$\endgroup\$
0
\$\begingroup\$

Batch, 56 Bytes

@set/p=
@for /l %%a in (2,1,%1)do @cd|set/p=.<BS> 
@echo ^^

This code contains two points of interest. First, it takes input from both StdIn and command line arguments. The string is read from StdIn while the index of the caret is taken as a parameter. Second, Batch doesn't play nice when it come to outputting a single space character (U+0020) so a bit of a work around is required: cd|set/p=.<BS> In this line <BS> stands in for the backspace character (U+0008) and the last character is a space. This is accounted for in the byte count.

\$\endgroup\$
0
\$\begingroup\$

SAS, 22

macro a put &s/@&n'^'%

Usage:

%let s="Lorem ipsum dolor sit amet";
%let n=2;
data;a;run;

Output:

Lorem ipsum dolor sit amet
 ^

If running in 'batch' mode, the run is not required so the code in needed to produce the function and run it (just not setting the inputs) would be 30 bytes

macro a put &s/@&n'^'% data;a;

So, it may be cheating... this style macro(function) definition in SAS does not have parameters, so the inputs are defined separately, in Usage as two %let statements. Parsing from STDIN would substantially lengthen the solution and only works when running SAS in 'batch' mode, which is not necessarily commonplace.

\$\endgroup\$
0
\$\begingroup\$

Javascript, 50 bytes

Code

function f(n,s){return s+'\n'+s.substr(0,n-1)+'^'}

Output

console.log(f(2, "hello"));
hello
h^

This approach takes advantage of the fact that you do not specify an empty string preceding the caret, only a caret pointing to the index in the input string and anything following that. If you happen to have a caret in your input string and an error there then it might get a little bit confusing :)

For example

console.log(f(3, "he^lo"));
he^lo
he^

or

console.log(f(3, "he^"));
he^
he^
\$\endgroup\$
0
\$\begingroup\$

Turtlèd, 17 bytes (non-competing)

r!-[*.-l_]' d?:'^

explanation

r!-               move right, take input into string variable, decrement string pointer
   [*    ]        while current char is not *
     .-           write pointed char from string, decrement pointer
       l_         move left, write * if the pointer is on the last char of string
          ' d     write space, move down
             ?:'^ Take input into register, move forward by the amount in register, write ^
\$\endgroup\$
0
\$\begingroup\$

Pyth, 8 bytes

z+*dtQ\^

Takes inputs separated by a newline (i.e. 2\nLorem ipsum).
Try it online!

Explanation:

z           The second input, implicitly printed with trailing newline
  *d__      The space character, __ times
    tQ        where __ is the first input -1
 +    \^    Append a literal carat character and printed
\$\endgroup\$
0
\$\begingroup\$

Jelly, 8 7 bytes (non-competing)

Ṅ⁶ṁ”^⁹¦

Try it online!

That dollardolor makes me laugh!!

Thanks to @Dennis for -1.

\$\endgroup\$
0
\$\begingroup\$

Vim, 7 keystrokes (buffer input/output, excluding input keystrokes)

o<Esc> + input number + i <Esc>r^

Explanation

  • o<Esc> creates a new line
  • #i <Esc> creates # spaces
  • r^ replaces the last space by ^

Note: This answers does not write the output to stdout (:w !tee, + 6 keystrokes) - so maybe it will be considered invalid.

\$\endgroup\$
0
\$\begingroup\$

C++14, 45 bytes

As unnamed lambda modifying its input, assuming s is similar to std::string (has operator+=):

[](int n,auto&s){for(s+=10;--n;s+=32);s+=94;}

Usage:

#include<string>
#include<iostream>

auto f =
[](int n,auto&s){for(s+=10;--n;s+=32);s+=94;}
;

int main() {
 std::string s = "abcdefghijk";
 f(2,s);
 std::cout << s << std::endl;
}
\$\endgroup\$
0
\$\begingroup\$

05AB1E, 7 bytes (non-competing)

'^I<ú‚»

Try it online!

Explantion

'^       # push caret
  I<ú    # prepend with input-1 spaces
     ‚   # pair with second input
      »  # join by newline
\$\endgroup\$
0
\$\begingroup\$

SmileBASIC, 26 bytes

INPUT N,S$?S$?" "*(N-1);"^

1-indexed arrow adds 4 bytes...

\$\endgroup\$
  • \$\begingroup\$ Note that you only want N-1 spaces before the caret. \$\endgroup\$ – Nick Matteo Feb 2 '17 at 23:08
0
\$\begingroup\$

Gol><> (Golfish), 14 bytes (non-competing)

`^IMR` aTiEHot

Try it here.

Explanation

`^             # push caret
  I            # read input as number
   M           # subtract 1
    R`         # pop N, and Repeatedly push a space, N times
       a       # push 10 (ASCII newline)
        T      # set teleport pad
         i     # input character
          EH   # if EOF, output stack and halt
            o  # otherwise, output the character just read
             t # teleport back to pad
\$\endgroup\$
0
\$\begingroup\$

tcl, 47

gets stdin s
puts $s\n[format %[gets stdin]s ^]

demo

\$\endgroup\$
0
\$\begingroup\$

Vim 9 bytes

jD@"a <esc>r^

Try it online!

Note that <esc> is a single byte, namely 0x1B, but since that byte is unprintable, I added a flag and used <esc> instead. This version uses the unprintable.

Explanation:

j               " Move down one line
 D              " Delete everything on this line, and save it in the unnamed register
  @"            " 'n' times
    a <esc>     " Append a 'space'
           r^   " Replace this last space with caret
\$\endgroup\$
0
\$\begingroup\$

V, 6 bytes (noncompeting)

ïÀá r^

Try it online!

\$\endgroup\$

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.