落下するASCIIボール


16

入力

ボールと地面が入った2Dマップが表示されます。次のようになります。

  1         5          2
                 3
     4


__________________________

各数字はボールであり、_は地上レベルです。アンダースコア_文字は、グラウンドレベルの行以外の行では使用できません。0-9地上レベルではスペース、改行、数字のみが許可されています。最後のラインが地上レベルであると仮定することはできません-地上レベルの下の空のラインは許可されます。空行を埋めるためにスペースを追加することもできます。

ボールにはから0までの番号を付けることが9できます。互いの上に配置できますが、地面の下には配置できません。ボールの番号は一意です。

各文字が1メートルであると仮定します。

pastebinからマップを入手してください!
テストケース1- この ようなものを出力する必要があります
テストケース2-最初のマップと同じ結果を生成する必要があります

チャレンジ

あなたの課題は、そのようなマップをファイルまたは(stdin使用が許可されている)から読み取り、cat balls.txt | ./yourexecutableボールが地面に当たったときに各ボールの速度を出力することです。

速度の式は次のとおりです。

ここに画像の説明を入力してください

それは想定hグラウンドの行番号、ボールの行番号、およびそれとの間の行数の差であるgイコール10m/s^2

出力

m/s地上レベルで各ボールの数と速度を出力する必要があります。たとえばN - Vm/sNは、ボール数とVその速度です。必要に応じて配列を出力することもできます。

ハッピーコーディング!:)


結果が期待できないテストケースはテストケースではありません
-edc65

@ edc65質問に予想される結果を追加しました
-Jacajack

プログラムの一部としてユーザーからの入力としてディレクトリを取得しても大丈夫ですか?
ダニエル

@Dopappどういう意味ですか?
ジャカジャック

私の答えをご覧ください。
ダニエル

回答:


8

MATL31 30 27 25バイト

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

入力は、;行セパレータとしての2D文字配列です。

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

オンラインでお試しください!または、コードイニシャルtを含めて、より明確にするためにマップを表示します。

他のテストケースは次のとおりです。firstsecond

説明

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が、テキストファイル以外の文字が出現した場合、あなたの例は何も出力しません。とにかく、これを指摘していないのは私のせいです
-Jacajack

@Jacajackいいえ、ASCIIコードがより大きい文字を含まない限り、どの文字でも構いません_。ただし、これは1バイト余分に修正できます(!=代わりに<)。
orlp

さて、テストには「x」を使用しました。気にしないで。あなたのコードは素晴らしいです:)
Jacajack

@Jacajack新しいバージョンでは、もう1文字修正されていませんが、さらに3バイトを保存しました:)
orlp

いいね!:)私は家に戻ったときに、自分のコードでできることを見ていきます。私はそれが多く短縮できることを知っていますが、私はそれをあなたのコピーにしたくないです:p
Jacajack

6

C - 194(-5) 150の 137バイト

もう少し時間をかけて考えながら、 13バイト節約するために助けてくれたorlp
感謝します。

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それは私が持っていたものです。
orlp

1
if (x != -1)は(一意に)であるif (~x)ため、(2の補数のマシンで)と同じです。C では、ゴルフは決して使用しないでください。同じくらい長く、ゴルフの機会が増えます。あなたの例では、これはになります。~-10while(cond)for(;cond;)for(;~(c=getchar());n=c==95?l:n)b[c]=(l+=c==10);
-orlp

@orlp私は理解しています、アドバイスをありがとう:)
Jacajack

1
l=1することによって回避することができるlための最初の引数をmainCランタイムは、その最初の引数(とメインに引数の数を通過すると、argc()、そして、あなたは、任意のコマンドライン引数なしでプログラムを呼び出すときに./a.out、その後、) argc = l = 1n=0;グローバル整数は自動的に0に初期化されるため、不要n;です。それで十分です。
orlp

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ああ、地上レベルは最後の行にしかないと思った。
リーキー修道女



1
@orlp ルールでは、「空行を埋めるためにスペースを追加できます。それが役立つ場合」。
リーキー修道女

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

おかげで多くのバイトが節約されました ルイスメンドーの

入力形式:

['  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
リーキー修道女

@LeakyNun、そのトリックはすべてのキーワードと数字で機能しますか?
ダニエル

1
そう信じる。また、(n-1)*20->~-n*20
リーキー修道女

1
つかまっている。Python3はprint呼び出しで括弧を必要としませんか?
Yytsi

1
@LeakyNunいいえ、Python 2のすべてのキーワードと数字では機能しません。で始まるキーワードでは特に機能しません。Pythonトークナイザーはe、浮動小数点科学表記(例:)として解析しようとするため1e5です。失敗する例:f = lambda n:-1if n<0else 1。両方のPythonバージョンで失敗する例は0or 1、トークナイザー0oが8進数で始まると考えているためです。
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これは実際にはスニペットではなく関数であり、デフォルトで許可されています。Pythonでは、ラムダ関数は名前のない関数であり、変数に割り当てて必要なときに呼び出すことができます。あなたは書くことができf = MyAnswer、それからを使用して呼び出すことができますf(x)ラムダに名前を付ける必要ないというコンセンサスがあります。ところで、すてきなチャレンジです!
TheBikingViking

確かに、ここではラムダがコードスニペットであると想定されていると思いました(meta.codegolf.stackexchange.com/a/1146/55729)。私はすべてが順調だと思います。ご意見ありがとうございます:)
ジャカジャック

2

JavaScript(ES6)93

編集@Jacajackに保存された2バイトの

入力パラメーターとして複数行の文字列を使用する関数。出力はソートされません(これは要求されていません)

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
edc65
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.