指针,指针,指针!


46

介绍

在某些语言(例如Java)的错误输出中,显示了一个指针,使程序员可以准确了解错误的出处。

就拿这个例子上Ideone:

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

注意插入符号显示无效代码在哪里?

挑战

您的挑战是:给定数字N和字符串S,将指针放在S中的N个字符上。

例子

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

输出

Lorem ipsum, dollar sit amet.
 ^

规则

  • 通过STDIN或功能参数接收输入
  • 输出输出到控制台或returned
  • 输出中允许尾随新行,空格等
  • 指针字符必须^插入号,并且必须在换行符上。
  • 这是代码高尔夫,所以最短的答案会获胜。祝好运!

16
我觉得这是一个非常简单的问题,所以我不确定会不会收到太多建议。如果您有足够的代表,则可能要尝试使用沙盒
FryAmTheEggman 2015年

6
我认为如果输入有多行,可能会变得更有趣,因此您必须在正确的位置插入换行符,空格和克拉。坦白地说,规范并没有真正说这是一行,但是我认为现在强制执行将不公平地使一些答案无效,因为没有示例可以表明这一点。
Geobits 2015年

3
就像我说的那样,这只猫可能不在书包里了。发布有效答案后更改规则通常效果不佳。生活和学习;)
Geobits 2015年

1
@SohamChowdhury我只是假装这是故意的;)您要我修复它吗?
monkeyonkeyboard 2015年

9
尽管这可能非常简单,但您在第一个挑战方面确实做得不错!您拥有+ 16 / -0票,1,300次查看和28个答案(截至撰写本文时),并且已进入“热门网络问题”列表。不错的工作!
Alex A.15年

Answers:


36

C 33

如果只允许一个函数,那么c也可以竞争。

(为了便于记录,将2个字节保存到@Cool Guy中。此注释被意外删除。)

还有1个字符保存了@Mig

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

19
C总是可以竞争,但不能总是赢。;)
Alex

3
@AlexA。<耸肩>看起来像是对我的胜利;-)
Digital Trauma 2015年

3
保存1个字符:f(a,c){printf("%s\n%*c",a,c,94);}
Michael M.

如果我是一个愤世嫉俗的人,我会说它仍然是打高尔夫球语言中最短答案的4倍左右。这与往常一样。;)这很聪明。我想我以前*在格式字符串中看到过该选项,但是完全忘记了它。将来可能会派上用场,以应对一些艺术方面的挑战。
Reto Koradi 2015年

35

Brainf * ck-133字节

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

[0-9]{2}.*期望输入例如“ 02Hello world !!!”。会产生

你好,世界!!!
 ^

欢迎来到编程难题和Code Golf!这是一篇很棒的第一篇文章,做得很好!:D
Alex A.

问题是,没有人知道这是否是有效的代码,更不用说解决问题了:)
Simon Simon

是的,我认为这里存在一个错误的错误。插入符号应e在示例中。在1个字节的成本这可以通过添加一个被固定-在前面[->.<]
FryAmTheEggman

@FryAmTheEggman您说对了-查看修改。我最初在e之下拥有它,但现在却被两个不同字体的IDE所混淆。
sudo rm -rf斜线

25

IA-32机器代码,24个字节

十六进制转储:

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

这是一个功能(使用MS fastcall约定),可以就地更新字符串:

__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在一些地方使用大小为16位的数据。这在32位代码中有一个代价(前缀为1字节),但无论如何都会使代码变小-使用32位数据将在代码中放入两个零字节!

最后,它写的是4个字节(eax)而不是2个字节(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

@Ruslan谢谢!固定。那是以前版本的残余。
anatolyg 2015年

为什么naked在里面?为什么这是我看到的第一件事?
caird coinheringaahing

正是微软决定将其naked
放在首位

20

珀斯 8

zp\^*tQd

该解决方案不再起作用,因为我链接到的语言名称之后的提交已更改p为arity1 zp+*dQ\^。在Pyth中获得类似分数的其他方法仍然有效,例如。

如果字符串需要用引号引起来,则可以v将其添加到代码的开头。如果必须用逗号分隔,则最多增加10个字节:

eQp\^*dthQ

我认为这是迄今为止最短的一种。做得好。
monkeyonkeyboard 2015年

该算法对我来说似乎是错误的,我认为^它将始终位于第一个字符之下。顺便说一句,输入参数以错误的顺序提供给了在线解释器(因此执行失败)。
吉姆(Jim

1
@Jim此答案使用了较旧的pyth版本,该版本具有arity1 p。这导致首先输出输出的第一行,然后在下一行插入插入符号,然后打印空格。现在,您可以z+*dQ\^使用较短的分数,但换行符结尾,或在p之前添加+来删除分数。我不确定该怎么做,因为人们赞成这个答案的版本,所以我想我会尝试找到适用的版本。
FryAmTheEggman

16

T-SQL,90岁

尽管这是一个非常简单的问题,但用那些实际上不太容易很好地支持它们或打高尔夫球的语言尝试这些总是很有趣的。

这个答案几乎可以肯定是最长的答案。

这将为SQL Server创建一个内联表函数,该函数以@n和@作为参数并将结果作为列返回。回车很重要,否则我将需要使用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 2015年

14

Python,27岁

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

这使用两个级别的字符串格式。

这是一个25字节的解决方案,部分是从feersum的答案中偷走的(参数顺序颠倒了):

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.Herzkamp 2015年

3
@Scimonster Carrot是我开玩笑的尝试- 请参阅我对问题的编辑。是的,$最后是shell提示。问题指定允许尾随换行符,但并不表示它们是必需的。
数字创伤

10

Python,29岁

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

连接字符串,换行符,n-1空格和^


2
如果rjust不是那么久...
Sp3000 2015年

10
啊,the操作员。
user253751

10

sed,16岁

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

这是该元答案的一个测试用例。具体来说,我要求数字N以一元形式输入。例如,对于在2位插入符,对于输入Ñ11。同样,也没有严格规定SN应该是哪个顺序,因此这里首先通过STDIN ,然后是S,然后是新行中的一元N。

输出:

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

1
2y/1/ /;2s/ $/^/
manatwork 2015年

@manatwork大家好!
Digital Trauma 2015年

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(" ")+" ^"
丹尼斯2015年

1
33个字节:(\n用实际的换行符代替)p=(a,b)=>b+`\n${' '.repeat(a-1)}^`
nderscore 2015年

@dennis索引非常适合我:i.stack.imgur.com/Tdejc.png
adroitwhiz 2015年

@Dennis Array(1).join(' ')产生一个空字符串:)
nderscore 2015年

@nderscore我无法找到一种方法来使用实际的换行符,而不会导致代码段中的换行,并且索引遵循给定的示例:i.stack.imgur.com/Tdejc.png
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)),"^

这两个都假定在运行之前已经清除了屏幕。


最好从Input输入数字作为输入,从Ans输入字符串。
lirtosiast

如果程序名称,赋值和字符串的长度超过16个字符,则第一个也不起作用。
lirtosiast 2015年

@ThomasKwa 26,实际上,因为我有一个颜色计算器:P从技术上讲,如果您将覆盖部分输入视为“正常工作”,它将起作用。
MI Wright

如果您添加ClrHome:Input N,第一个选项确实可以工作,因为当前用于混合I / O方法的meta的投票为+7。
lirtosiast 2015年

5

直流电,19

?pr256r^255/32*62+P

输入来自STDIN。 dc字符串是宏定义,包含在中[ ]。通过计算在以基本256字节流表示的基础上给出所需字符串的数字,可以生成空格字符串。计算为((n ^ 256) / 255) * 32)。这给出了n空格(ASCII字符32),但是我们需要n-1紧随其后^,因此我们只需将62加到最后一个基数256位。

输出量

$ 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个空地方有!另外,我认为您不需要声明aand 的类型c-只需int对它们使用隐式-如果不这样做就可以工作#include <stdio.h>
anatolyg

@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 main函数)会多一点(多9个字节-Ty Alex),但是我认为这不是必需的。怎么称呼它:

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

有一个仅宏的实现,但是它更长了,即使您允许它在n = 1上给出有关无效参数的警告。

如果我们可以使用预定义的参数,那么SAS在这个参数上相对较短。


如果数据集被允许作为输入源(这是您在SAS中(或通过%let语句)执行的方式),但很可能不允许这样做,那么它甚至会更短(27个字节,实际上可能是25 个字节)如果您保证数据集是在运行此操作之前立即构建的(那么您可以使用set;]):

(现有数据集)

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

(实际代码)

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

很高兴在这里看到SO的常驻SAS专家PPCG。:)
Alex A.

我相当确定一些知道DM脚本的老手可以最好地得分……而我的cmdmac技能很烂。

我总是忘记了DM甚至存在,甚至不知道cmdmac是什么!顺便说一句,当您为整个数据步骤计算字节时,您不需要data a;,您只需这样做即可data;节省2个字节。但是正如您所说的,无论如何都没有必要这样做。
Alex A.

是的,我想,SAS根深蒂固的反射效果不能让我直观地使用它:)。谢谢。

说到旧计时器,我认为您可以通过违反所有SAS直觉并使用旧式宏来节省几个字节。我不记得他们是否可以接受参数。
Alex A.

3

Matlab /八度,41

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

这是一个返回字符串的匿名函数。这会产生警告,可以通过预先调用来消除警告warning off


您是指编辑器警告,还是实际上为您打印警告?另外,我用16个字符击败了您;-)但是我的确打印出了该ans =位,因此在解决该问题后,仅相差10个字符。
Oebele 2015年

@Oebele将显示警告,但返回的字符串不受影响。
FryAmTheEggman 2015年

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

电话,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
                            ^
>

function(n,x)cat(x,“ \ n”,rep(“”,n-1),“ ^”,sep =“”)为48个字符
Flounderer 2015年

@Flounderer谢谢你……我的初衷与之相似,但我做的并不出色
MickyT 2015年

如果允许我使用两个初始空格,则可以使用该方法:function(n,x)cat(" ",x,"\n",rep("",n),"^")并保存一些字符
Flounderer 2015年

@Flounderer我怀疑不是。strwrap也有一些可能性,但可能会花费更长的时间。
MickyT 2015年

1
真好!我以前从未见过该strwrap功能。有没有一种简单的方式来说明它的作用?我无法从文档中弄清楚。
Flounderer 2015年


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

我现在才注意到。但是您的答案与我的第二个选择完全一样。我提供给您:<?printf("$S\n%{$P}s",'^');。更换\n一个真正的换行符。总计为5个字节。这仅适用于PBP4.1及以下版本。
Ismael Miguel

哇,该评论中有很多错误……我的意思是它的长度为26个字节,仅在PHP4.1上有效。这是你的!
Ismael Miguel 2015年

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 =东西。
FryAmTheEggman 2015年

2

我在Codegolf的第一枪

爪哇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哪里存储吗?
Ismael Miguel

2
不需要public。并更改IntStream.range(1,i).forEach(j->System.out.print(" "));for(;--i>0;)System.out.print(" ");
Spikatrix

@CoolGuy啊哈!有时简单会更好
pallavt 2015年

您可以s+="\n"for()初始化内部移动以在其中使用分号吗?
lirtosiast

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

它指向第七个字符。


尼斯保存Scimonster O_O
弗洛里

1
你可以这样写alert((P=prompt)()+"\n"+Array(P()+1).join(" ")+"^")。并节省2个字节。另外,您可以将其放入一个snipspetpet中以展示正在运行的代码。那期望弦乐首先出现,然后是位置
Ismael Miguel

1

Perl 5,31

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

您可以保存2-3个字符。删除不需要的最后一个换行符,然后将第一个换行符更改为文字换行符。(Perl可以使用多行字符串)
Llama先生

@Llama先生,谢谢,这些很好。
hobbs 2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.