ポインター、ポインター、ポインター!


46

前書き

Javaなどの一部の言語のエラー出力では、エラーがどこで間違ったのかをプログラマに正確に知らせるためのポインタが表示されます。

Ideoneでこの例を取り上げます

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

キャレットが無効なコードの場所を示していることに注意してください。

チャレンジ

あなたの課題は、次のとおりです。与えられた数Nと文字列Sは、上にポインタを置くNにおける番目の文字S

入力2, "Lorem ipsum, dollar sit amet."

出力

Lorem ipsum, dollar sit amet.
 ^

ルール

  • 入力は、STDINまたは関数パラメーターを介して受信されます
  • 出力はコンソールまたはreturnedに出力されます
  • 末尾の改行、スペースなどは出力で許可されます
  • ポインタの文字はしなければならないこと^キャレットと、新しい行になければなりません。
  • これはコードゴルフであるため、最短の回答が勝ちます。幸運を!

16
これは非常に単純な問題だと思うので、それが過度に受け入れられるかどうかはわかりません。担当者が十分になったら、サンドボックスを試しみてください。
FryAmTheEggman

6
私はこれが行われていると思うビットの入力が複数行を持っていた場合は、正しい位置(S)で改行、スペース、およびカラットを挿入しなければならなかったのでことを、より興味深いです。正直なところ、この仕様では実際には1行になるとは言われていませんが、これを強制すると、いくつかの回答が不当に無効になります。これを示す例はありません。
ジオビット

3
私が言ったように、猫はおそらくこれのバッグから出ています。通常、有効な回答が投稿された後のルールの変更はうまくいきません。生きて学ぶ;)
Geobits

1
@SohamChowdhury私はちょうどそれが意図的だったふりをする;)あなたは私にそれを修正してほしいですか?
monkeyonkeyboard

9
これは非常に簡単かもしれませんが、最初の挑戦では確かに成功しています!+ 16 / -0票、1,300ビュー、28回答(この記事の執筆時点)があり、ホットネットワークの質問リストを作成しました。良くやった!
アレックスA.

回答:


36

C 33

関数のみが許可されている場合、cでも競合できます。

(レコードの場合、2バイトがthxを@Cool Guyに保存しました。Mtthxコメントは予期せず蒸発します。)

さらに1文字がthx @Migを保存しました

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

19
Cは常に競うことができ、常に勝つことはできません。;)
アレックスA.

3
@AlexA。<shrug>は私にとっては勝利のようです;-)
デジタルトラウマ

3
1文字を保存:f(a,c){printf("%s\n%*c",a,c,94);}
マイケルM.

私がシニカルな人であれば、ゴルフ言語の最短回答の約4倍の長さだと思います。これはいつものようにビジネスについてです。;)しかし、これは賢いです。*以前にフォーマット文字列でオプションを見たことがあったと思いますが、それは完全に忘れていました。将来のアスキーアートの課題のいくつかに役立つかもしれません。
レトコラディ

35

Brainf * ck-133バイト

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

[0-9]{2}.*「02Hello world !!!」などの入力を期待します 生産するだろう

こんにちは世界!!!
 ^

プログラミングパズルとコードゴルフへようこそ!これは素晴らしい最初の投稿であり、素晴らしい仕事です!:D
アレックスA.

問題は、これが有効なコードであるかどうか誰も知らないことです。ましてや、問題を解決することはもちろんです:)
サイモン

ええ、私はここでオフバイワンのエラーがあると思います。キャレットはeこの例の下にあるはずです。1バイトのコストで、これは添加することによって固定することができる-の前に[->.<]
FryAmTheEggman

@FryAmTheEggmanそのとおりです-編集をご覧ください。もともとはeの下にありましたが、現在は異なるフォントの2つのIDEを使用して混乱しています。
sudo rm -rfスラッシュ

25

IA-32マシンコード、24バイト

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

fastcall文字列をその場で更新する関数です(MS 規約を使用):

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

アセンブリコード:

    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;

これは、使用していますWORDいくつかの場所で-sized(16ビット)のデータを。これには、32ビットコードではペナルティ(1バイトのプレフィックス)がありますが、とにかくコードは小さくなります。32ビットデータを使用すると、2つのゼロバイトがコードに追加されます。

最後に、eax2 バイト()ではなく4バイト()を書き込みますax-コードはそのように小さく、余分な2バイトのジャンクは文字列の終了後に移動するため、誰も気づきません。

使用法:

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

1
命令66 b8 5e 00移動0x5ealしないように、ahと、ゼロahの代わりにal、アセンブリコードにコメントが誤解されそう。
ルスラン

@Ruslanありがとう!一定。それは以前のバージョンの名残でした。
アナトリグ

なぜnakedそこにいるのですか?そして、なぜ私が最初に見たのですか?
コメアリンガーをケア

それは置くことを決めたMicrosoftのnakedフロントにmsdn.microsoft.com/en-us/library/h5w10wxs.aspx
anatolyg

20

パイス、8

zp\^*tQd

言語名pがアリティ1に変更されたため、リンクした後のコミットが機能するため、このソリューションは機能しません。Pythで同様のスコアを達成する方法は他にもいくつかありますzp+*dQ\^

文字列に引用符が必要な場合vは、コードの先頭に追加してください。コンマで区切る必要がある場合、最大10バイトになります。

eQp\^*dthQ

これはこれまでで一番短いと思います。よくやった。
monkeyonkeyboard

アルゴリズムは私には間違っているように思えます^が、私は常に最初の文字の下にいると思います。また、入力パラメータが間違った順序でオンラインインタープリターに渡される(そのため、実行に失敗します)。
ジム

1
@Jimこの回答でpは、アリティ1の古いバージョンのpythを使用しました。これにより、出力の最初の行が最初に出力され、次の行にキャレットが続き、その後にスペースが続きました。これz+*dQ\^で、スコアを短くすることができますが、末尾の改行を使用するか、p前にaを追加し+て削除できます。人々がこのバージョンの答えを支持していたので、私はここで何をすべきかわからない、私はそれが働いたバージョンを見つけようとすると思う。
-FryAmTheEggman

16

T-SQL、90

かなり単純な質問ですが、実際にそれらをうまくサポートする傾向のない言語やこれらのことをゴルフで試すのは常に興味深いです。

この回答は、最も長くなることがほぼ保証されています。

これにより、@ nおよび@をパラメーターとして受け取り、結果を列として返すSQL Serverのインラインテーブル関数が作成されます。改行は重要です。そうでない場合は、char(13)を使用する必要があります。

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

次のように使用されます

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)

そして戻ります

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

ゴルフのために実際に設計されていない言語の非常に創造的な使用;)+1
monkeyonkeyboard

14

Python、27

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

これは、2つのレベルの文字列フォーマットを使用します。

そして、これはfeerumの答えから部分的に盗まれた25バイトのソリューションです(引数の順序が逆になっています):

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

12

Bash、27

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

出力

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

にんじん?また、最後のドルはいくらですか?
Scimonster

7
ドルはシェルのプロンプトのようです。
M.ヘルツカンプ

3
@Scimonster Carrotは冗談での私の試みでした- 質問に対する私の編集を見てください。はい、$最後にあるのはシェルプロンプトです。この質問は、末尾の改行が許可されることを指定していますが、それらが必要であるとは言いません。
デジタル外傷

10

Python、29

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

文字列、改行、n-1スペース、aを連結します^


2
rjustそんなに長くなかったら
...-Sp3000

10
ああ、オタマジャクシオペレーター。
user253751

10

sed、16

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

これは、このメタ回答のテストケースのようなものです。具体的には、数値Nを単項で入力する必要があります。たとえば、位置2のキャレットの場合、Nの入力はになります11。また、SNの順序が厳密に指定されていないため、ここではSが最初になり、新しい行に単項Nが続き、すべてSTDINを通過します。

出力:

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

1
2y/1/ /;2s/ $/^/
マナトワーク

@manatworkいいね!
デジタル外傷

9

JavaScript(ES6):63 62 56 52 32バイト

コードのサイズを大幅に削減してくれたnderscoreに感謝します。

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

より多くのブラウザーで動作するバージョン(47バイト):

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

1.質問では1から始まるインデックスが使用されるため、が必要Array(a-1)です。2.匿名関数はデフォルトで許可されているため、必要ありませんpoint=。3. ES6バージョンでは、returnステートメントとブレースを削除できます。使用するだけ(a,b)=>b+"\n"+Array(a-1).join(" ")+" ^"です。
デニス

1
33バイト:(\n実際の改行に置き換えます)p=(a,b)=>b+`\n${' '.repeat(a-1)}^`
-nderscore

インデックスは、私のために完璧に動作@dennis:i.stack.imgur.com/Tdejc.png
adroitwhiz

@Dennis Array(1).join(' ')は空の文字列になります:)
nderscore

@nderscore実際の改行をコードスニペットで改行せずに使用する方法を見つけることができず、インデックス付けは指定された例に従います。i.stack.imgur.com
adroitwhiz

7

CJam、9バイト

q~N@(S*'^

オンラインでお試しください。

使い方

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

29でそれを行うより楽しい方法を次に示します。

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

使用例:

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

5

TI-BASIC、10(?)バイト

Disp Ans
Output(3,N,"^

質問にあるように、入力は変数Nで与えられますが、文字列var Sを文字列として使用することはできません。その代わりに、Ansから文字列入力を受け取るため、OP:で例を実行します2->N:"Lorem ipsum, dollar sit amet.":prgm<program name>

ただし、コロンで区切られた各セグメントは技術的には別個のステートメントであるため、これはおそらくカウントされないことを認識しています。以下は、入力を()として取る46バイトのプログラムです。N "S"2 "Lorem ipsum, dollar sit amet."

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)),"^

どちらも、実行前に画面がクリアされていることを前提としています。


数値の入力と文字列のAnsから入力を取得した方が良いでしょう。
リルトシアスト

プログラム名、割り当て、および結合された文字列が16文字より長い場合、最初のものも機能しません。
リルトシアスト

@ThomasKwa 26、実際には、私は色の計算機を持っているので:P入力の一部を「作業中」として上書きするとカウントすると、技術的には機能します。
MIライト

ClrHome:Input Nを追加すると、最初の方法が機能します。これは、I / Oメソッドを混合するためのメタに対する現在の投票が+7であるためです。
リルトシアスト

5

dc、19

?pr256r^255/32*62+P

入力はSTDINからです。 dc文字列はマクロ定義であり、に含まれてい[ ]ます。スペースの文字列は、ベース256バイトストリームとして表現されたときに必要な文字列を与える数を計算することによって生成されます。計算は((n ^ 256) / 255) * 32)です。これは、与えnスペース(ASCII文字32に)、しかし、我々は必要n-1に続いて^、私たちは単に最後の塩基256桁に62を追加します。

出力

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

4

C、59 57 47バイト

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

とても簡単です。ゴルフされていないバージョン:

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
}

ここでテストしてください@anatolygに10バイトの節約を
ありがとう!


これは、移動するために、より美しいputs(a)putchar(32)の括弧の中にforループ-ちょうど2空の場所があります!また、タイプを宣言する必要はないと思います-暗黙的に使用するだけac- intしない場合は機能します#include <stdio.h>
アナトリグ

@anatolyg、ありがとう!型を省略してもうまくいくとは思っていませんでしたが、驚いたことに、うまくいきました。
Spikatrix

4

C#55

私のCの答えに似た関数ですが、今回は戻り値が出力よりも短くなっています。

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

4

SAS、35バイト

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

これは、ネイキッド関数に相当するSASです。呼び出すデータステップを追加する(呼び出すCメイン関数と同等)のはもう少し(9バイト-Ty Alex)ですが、この目的には必要ないと思います。呼び出し方法:

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

マクロのみの実装がありますが、n = 1で無効なパラメーターに関する警告を出すことを許可しても、はるかに長くなります。

事前定義されたパラメーターを使用できる場合、SASはこのパラメーターに比べてかなり短くなります。


データセットが入力のソースとして許可されている場合、SASで(または%letステートメントによって)「実行」する方法ですが、おそらく許可されない場合、これはさらに短くなります(実際には25 バイトこれを実行する直前にデータセットが構築されたことが保証されている場合[次のように使用できますset;]):

(既存のデータセット)

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

(実際のコード)

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

SOの常駐SASエキスパートであるPPCGをご覧ください。:)
アレックスA.

DMスクリプティングを知っている古いタイマーの何人かがこのスコアを最高にすることができると確信しています...そして、私のcmdmacスキルは下手です。
ジョー

私は常にDMが存在することさえ忘れており、cmdmacが何であるかさえ知りません!ところで、データステップ全体のバイト数をカウントする場合data a;、必要はありませんdata;。2バイトを節約するだけです。しかし、あなたが言ったように、とにかくこの目的のためにそれは必要ではありません。
アレックスA.

ええ、私のSASに深く根付いた反射神経は、私がそれを直感的に使用することを許可しません:) ありがとう。
ジョー

古いタイマーについて言えば、SASの直感をすべて無視し、古いスタイルのマクロを使用すると、数バイト節約できると思います。ただし、パラメータを受け入れることができるかどうかは思い出せません。
アレックスA.

3

Matlab / Octave、41

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

これは、文字列を返す匿名関数です。これにより警告が生成されますが、事前にを呼び出すことで抑制することができますwarning off


エディターの警告を意味しますか、それとも実際に警告を表示しますか?また、16文字であなたを打ちました;-)しかし、私のものはans =ビットを印刷しますので、それを修正した後、それはわずか10文字の違いです。
-Oebele

@Oebeleは警告を出力しますが、返される文字列は影響を受けません。
FryAmTheEggman

3

K、21バイト

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

例:

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

説明(x数字yは文字列です):

{                   }   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

STDOUTに出力する名前のない関数として。改善してくれた@Floundererに感謝します。

strwrapを使用して、キャレットをn-1に識別します。catは、空の文字列ではなく、\ nの区切り文字を使用します。

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

テスト走行

> 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
                            ^
>

関数(N、X)ネコ(X、 "\ n"は、担当者(」」、N-1)、 "^"、9月=は"")48の文字
Flounderer

@Floundererそのおかげで...私の元々のアイデアはそれに似ていましたが、
それほど

私は2つの初期のスペース、この作品をせて頂く場合:function(n,x)cat(" ",x,"\n",rep("",n),"^")といくつかの文字が保存されます
Flounderer

@Flounderer私はそうは思わない。strwrapにはいくつかの可能性もありますが、おそらく長くなるでしょう。
MickyT

1
それはすばらしい!私はstrwrap前に関数を見たことがありません。それが何をするのかを言う簡単な方法はありますか?ドキュメントからはわかりません。
ヒラメ


2

ジュリア、27バイト

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

これにより、入力として整数と文字列を受け取り、文字列を返す名前のない関数が作成されます。呼び出すには、名前を付けf=(n,s)->...ます。

ここで行われているのは、改行、n-1スペース、キャレットを追加することだけです。文字列の連結はとを使用*して文字列の繰り返しを実行します^

ゴルフをしていない:

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

例:

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],'^');

コマンドラインから呼び出します:

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

気付いたのは今だけです。しかし、あなたの答えは私の2番目の選択肢とまったく同じです。私はあなたにそれを提供しています:<?printf("$S\n%{$P}s",'^');。交換する\n、実際の改行。合計は5バイトです。これはPBP4.1以下でのみ機能します。
イスマエルミゲル

うわー、そのコメントの非常に多くの間違い...私はそれが26バイト長であることを意味し、それはPHP4.1でのみ動作します。そして、それはあなたのものです!
イスマエルミゲル

2

Matlab、25

これは非常に生意気です。どうやら印刷できない文字をスペースとして表示します。次のコードansでは、仕様を満たす関数を定義しています。

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

この関数を次のように呼び出します:

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

出力を与えます:

ans =

Lorem ipsum, dollar sit amet.
 ^

ans =Matlabの回答の一部が嫌いです。これが問題である場合、6バイトを追加する必要があります...しかし、Matlabの回答では常にこのように見えました。このコードを実行すると変数が上書きされるansため、もう一度使用する場合は関数を再定義する必要があります。


非常に素晴らしい!ベクトルに文字列を入れると、そのように動作することを知りませんでした。私の理解では、これは関数なので、文字列が意味のある値を返し、MATLABのrepl環境がたまたまそれを出力するということでした。すなわち、もしあなたがx=ans(2, 'asdf');ans = thingを取得しない場合。
FryAmTheEggman

2

codegolfでの最初のショット

Java、133 65

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

私はそれをさらに減らすことができると確信しています。

古いコード

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

System.outどこにでも保管できますか?
イスマエルミゲル

2
の必要はありませんpublic。そして、変更IntStream.range(1,i).forEach(j->System.out.print(" "));for(;--i>0;)System.out.print(" ");
Spikatrix

@CoolGuyあは!時にはシンプルな方が良い
-pallavt

初期化s+="\n"内でfor()セミコロンを使用するために移動できますか?
リルトシアスト

@ThomasKwa 1バイト未満
pallavt

2

スイフト、41

Swift *Arrayまたはの演算子がないのは残念ですString

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

Swift 2.0の場合:{$1+(0..<$0).reduce("\n"){$0.0+" "}+"^"}
Kametrixom

1

SpecBAS-34

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

アポストロフィはPRINT強制的に新しい行を作成し、カーソルを正しい位置に移動するだけです。



1

JavaScript-52バイト

これは私のものです、それは非常に簡単です。

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

使用法:

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

Any string at all
      ^

7番目の文字を指しています。


Scimonster O_Oを保存ニース
フロリー

1
のように書くことができますalert((P=prompt)()+"\n"+Array(P()+1).join(" ")+"^")。そして、2バイト節約します。また、実行中のコードを紹介するために、それをstasksnippetにすることができます。すなわち、位置、文字列が最初に来ることを期待
イスマエルミゲル

1

Perl 5、31

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

2〜3文字保存できます。必要ではないので最後の改行を削除し、最初の改行をリテラルの改行に変更します。(Perlは複数行の文字列で大丈夫です)
Mr. Llama

@ Mr.Llamaありがとう、それらは良いです。
ホッブズ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.