下降的ASCII球


16

输入值

您会得到一个带有球和地面的2D地图。看起来像这样:

  1         5          2
                 3
     4


__________________________

每个数字是一个球,并且_是地面。_除地面线外,其他任何行均不允许使用下划线字符。0-9地面以上只能有空格,换行符和数字。您不能假设最后一行是地面高度-允许在地面以下空线。如果确实有帮助,您还可以添加空格以填充空白行。

球的编号可以从09,可以互相重叠放置,但不能放在地下。球的号码将是唯一的。

假设每个字符都是一米

从pastebin获取地图!
测试案例1 -应该输出像这种
测试案例2 -应该产生相同的结果,第一张地图

挑战

您面临的挑战是从文件或stdin(您可以使用)中读取类似的地图,cat balls.txt | ./yourexecutable并在每个球撞击地面时输出其速度。

这是速度的公式:

在此处输入图片说明

假设这h是地面的线号和球的线号之间的线号差,并且g等于10m/s^2

输出量

您应该m/s在地面输出每个球的数量和速度。例如N - Vm/s,其中N是球数,是球V的速度。如果需要,还可以输出数组。

编码愉快!:)


没有预期结果的测试用例不是测试用例
edc65

@ edc65我在问题中添加了预期的结果
Jacajack

如果我将目录作为用户输入的一部分作为程序的一部分可以吗?
丹尼尔(Daniel)

@Dopapp你到底是什么意思?
Jacajack

看我的 回答
丹尼尔(Daniel)

Answers:


8

MATL31 30 27 25字节

95\16\5B#fG&X>1)b- 20*X^h

输入是带有;行分隔符的2D char数组:

['  1         5          2  ';'                 3        ';'     4                    ';'                          ';'                          ';'__________________________']

在线尝试!在代码中包含首字母t以显示地图,以更加清晰。

这里是其他测试用例:第一第二

说明

95\      % Take input implicitly. Modulo 95: convert to numbers and map '_' into 0
16\      % Modulo 16: map space into 0 and digit chars into corresponding numbers
5B#f     % Find row indices and values of nonzero entries
G        % Push input again
&X>      % Index of maximum of each column. This finds character '_'
1)       % Get first value (they are all equal)
b        % Bubble row indices of numbers up in the stack
-        % Subtract to get distance from each number to the ground
20*X^    % Multiply by 20, take sqrt. This gives the velocity values
h        % Horizontally concat numbers and velocities. Display implicitly

7

C,125 122 121字节

b[99]={};main(l,c){for(;(c=getchar())<95u;)b[c]=(l+=c==10);for(c=47;++c<58;)b[c]&&printf("%c,%f\n",c,sqrt((l-b[c])*20));}

编译并运行gcc -w golf.c -lm && cat balls.txt | ./a.out


先生,真是太好了!我没有在问题中说过,但是我想让您知道,当0 ... 9文本文件中出现其他字符时,您的示例不输出任何内容。无论如何,+ 1是因为我没有指出这一点
Jacajack

@Jacajack不,任何字符都可以,只要它不包含ASCII码大于的字符即可_。但是,可以用一个额外的字节(!=代替<)解决此问题。
orlp

好吧,我用“ x”进行测试。没关系。您的代码很棒:)
Jacajack

@Jacajack在新版本中,它不再是一个字符的修复程序,但我又保存了3个字节:)
orlp

真好!:)当我回到家时,我将看看如何使用我的代码。我知道可以将其缩短很多,但是我不希望它成为您的副本:p
Jacajack

6

Ç - 194(-5) 150个 137字节

花了更多时间和思考,我打出了44个字节,这
多亏了orlp帮助我节省了13个字节

我将从我的C代码开始:

b[256]={},n,i=47;main(l,c){for(;~(c=getchar());n=c==95?l:n)b[c]=(l+=c==10);for(;++i<58;)b[i]&&printf("%d %f\n",i-48,sqrt((n-b[i])*20));}

和人类可读的版本:

//Throws many warnings, but lack of libraries is tolerated

/*
    c - current character
    l - line number (starts at 1)
    n - ground level
    i - iterator
    b - balls array
*/

b[256] = {}, n, i = 47; //That actually works, as long as you are using ASCII

main( l, c )
{
    for ( ;~( c = getchar( ) ); n = c == 95 ? l : n ) //Read stdin and search for ground
        b[c] = ( l += c == 10 ); //Increment lines counter on newlines, and save line numbers

    for ( ; ++i < 58; ) //Iterate through balls
        b[i] && printf( "%d %f\n", i - 48, sqrt( ( n - b[i] ) * 20 ) ); //Print out data    
}

像这样编译并运行: gcc -o balls ballsgolf.c -lm && cat 1.txt | ./balls

输出量

1 10.000000
2 10.000000
3 8.944272
4 7.745967
5 10.000000

保存4个字节:~(c=getchar())而不是(c=getchar())!=EOF
marinus

@marinus这就是我所拥有的。
orlp

1
if (x != -1)if (~x)(在补码机上)相同,因为~-1是(唯一)0。在C高尔夫中,从不使用while(cond),因为for(;cond;)它是如此之久,并提供了更多的高尔夫机会。在您的示例中,这可能变为for(;~(c=getchar());n=c==95?l:n)b[c]=(l+=c==10);
orlp 2016年

@orlp我了解,感谢您的建议:)
Jacajack

1
l=1可以通过l为设置第一个参数来规避main,因为C运行时将参数数量传递给main作为其第一个参数(argc),并且当您调用不带任何命令行参数的程序时./a.out,则argc = l = 1n=0;不需要,因为全局整数会自动初始化为0。因此就n;足够了。
orlp 2016年

4

Pyth,27 26 25 24字节

smf-hT“ _”。e,b @ * 20-xd \ _k2dC 
smf @ hT`M; .e,b @ * 20-xd \ _k2dC 
smf @ T`M; .e,b @ * 20-xd \ _k2dC
sm @#`M; .e,b @ * 20-xd \ _k2dC

在线尝试!



@orlp哦,我以为地面只能在最后一行。
Leaky Nun



1
@orlp 在规则中“如果可以帮助您,您可以添加空格以填充空白行”。
Leaky Nun

3

Matlab,100 96 89 90字节

s=input('');X=find(s==95);for i=0:9
[x y]=find(s==48+i);if(x)[i sqrt(20*(X(1)-x))]
end
end

Luis Mendo节省了很多字节

输入格式:

['  1         9          2  ';'                 3        ';'     4                    ';'                          ';'                          ';'__________________________']

说明:

X=find(s==95)         -- finds '_', we'll need X(1) to determine max height
for i=0:9             -- loops through balls' numbers
[x y]=find(s==48+i)   -- finds the ball
if(x)                 -- if it is present
[i sqrt(20*(X(1)-x))] -- output its number and velocity

3

Python 3,84个字节

版本6,84字节:(感谢Leaky Nun!)

lambda a:[(c,(~-(len(a)-i)*20)**.5)for i,s in enumerate(a)for c in s if c.isdigit()]

版本5,共91个字节:

lambda a:[c+":"+str((~-(len(a)-i)*20)**.5)for i,s in enumerate(a)for c in s if c.isdigit()]

版本4,共92个字节:

lambda i:[c+":"+str((~-(len(i)-n)*20)**.5)for n in range(len(i))for c in i[n]if c.isdigit()]

版本3,99个字节:

def r(i):x=len(i);print([c+":"+str((~-(x-n)*20)**.5)for n in range(x)for c in i[n] if c.isdigit()])

版本2,102个字节:

def r(i):
 n=len(i)
 for l in i:
  for c in l:
   if c.isdigit():print(c+":"+str((~-n*20)**.5))
  n-=1

以上版本将字符串数组作为输入。

版本1,140字节:

with open(input(),"r")as i:
 n=sum(1for l in i);i.seek(0)
 for l in i:
  for c in l:
   if c.isdigit():print(c+":"+str((~-n*20)**.5))
  n-=1

这会将文件目录作为用户的输入。


1 for l in i->1for l in i
Leaky Nun

@LeakyNun,这个技巧适用于所有关键字和数字吗?
丹尼尔(Daniel)

1
我相信是这样。另外,(n-1)*20->~-n*20
Leaky Nun

1
坚持,稍等。Python3不需要在print调用中加上括号吗?
Yytsi

1
@LeakyNun不,它不适用于Python 2中的所有关键字和数字。它特别不适用于以开头的关键字e,因为Python令牌生成器将尝试将其解析为浮点科学计数法(例如1e5)。失败的示例:f = lambda n:-1if n<0else 1。在两个Python版本中都失败的示例是0or 1,因为令牌生成器认为它0o以八进制数开头。
orlp

2

Python 3,84个字节

lambda x:[[i,(20*x[x.find(i):x.find('_')].count('\n'))**.5]for i in x if i.isdigit()]

一个匿名函数,它将按参数输入作为多行字符串,所有空行都用空格填充,并返回一个数组,其中每个元素的格式为[ball number,speed]。

怎么运行的

lambda x                      Function with input x
...for i in x if i.isdigit()  Loop through all characters i in x for which i is a digit,
                              and hence one of the balls
x[x.find(i):x.find('_')]      Slice x to give the substring between the ball and the ground
....count('\n')               Count the number of newlines in the substring to give the
                              height of the ball
(20*...)**.5                  Calculate the speed of the ball as it hits the ground
[i,...]                       Package the ball number and speed into a list
:[...]                        Return all ball-speed pairs as a list with elements [ball
                              number, speed]

在Ideone上尝试


在这种情况下,我认为这是代码段,而不是完整的独立Python脚本,不是吗?
Jacajack

@Jacajack实际上,这是一个函数,而不是摘要,默认情况下是允许的。在Python中,lambda函数是没有名称的函数,可以将其分配给变量,然后在需要时调用。您可以编写f = MyAnswer,然后使用调用f(x)。大家一致认为不需要命名lambda。顺便说一句好挑战!
TheBikingViking

当然,我只是认为lambdas是此处的代码段(meta.codegolf.stackexchange.com/a/1146/55729)。我想一切都很好。谢谢您的意见:)
Jacajack

2

JavaScript(ES6)93

编辑保存的2个字节thx @Jacajack

以多行字符串作为输入参数的函数。输出未排序(因为不要求)

a=>[...a].reverse().map(c=>c>'Z'?b=i:c<' '?++i:c>' '&&console.log(c,Math.sqrt((i-b)*20)),i=0)

测试

F=
a=>[...a].reverse().map(c=>c>'Z'?b=i:c<' '?++i:c>' '&&console.log(c,Math.sqrt((i-b)*20)),i=0)

function test()
{
  F(I.value);
}

test()
#I { height: 12em; width: 30em}
<textarea id=I>
    
 
  1         5          2
                 3
     4


__________________________




</textarea>
<button onclick="test()"></button>


sqrt(x)比短pow(x,.5)吗?
Jacajack

@Jacajack是的,谢谢,我不知道这是怎么回事
edc65
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.