떨어지는 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/s, 여기서 N볼 번호 V는 그 속도입니다. 원하는 경우 배열을 출력 할 수도 있습니다.

행복한 코딩! :)


예상 결과가없는 테스트 케이스는 테스트 케이스가 아님
edc65

@ edc65 나는이 질문에 대한 예상 결과 추가
Jacajack을

프로그램의 일부로 사용자의 입력으로 디렉토리를 가져도 괜찮습니까?
Daniel

@Dopapp 정확히 무엇을 의미합니까?
Jacajack

답변을 참조하십시오 .
Daniel

답변:


8

MATL , 31 30 27 25 바이트

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

입력은 ;행 구분자로 사용 되는 2D 문자 배열입니다 .

['  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

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

~(c=getchar())대신 4 바이트를 저장하십시오 (c=getchar())!=EOF.
marinus 2016 년

@marinus 그게 내가 가진 것입니다.
orlp

1
if (x != -1)is (uniquely) if (~x)이므로 ~-1( 2의 보수 시스템에서) 와 동일 0합니다. C에서 골프는 절대 사용하지 마십시오 while(cond)로, for(;cond;)마찬가지로 길이와 골프에 대한 더 많은 기회를 제공합니다. 귀하의 예에서 이것은 될 수 있습니다 for(;~(c=getchar());n=c==95?l:n)b[c]=(l+=c==10);.
orlp

@orlp 이해합니다, 조언 주셔서 감사합니다 :)
Jacajack

1
l=1C 런타임은 첫 번째 인수 ( ) 로 main에 인수 수를 전달하고 명령 행 인수 ( ) 없이 프로그램을 호출 할 때에 l첫 번째 인수를 작성 하여 우회 할 수 있습니다 . 전역 정수는 자동으로 0으로 초기화되므로 불필요 합니다. 따라서 충분합니다. mainargc./a.outargc = l = 1n=0;n;
orlp

4

피스, 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

파이썬 3, 84 바이트

버전 6, 84 바이트 : (Leak 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 2016 년

1
@LeakyNun 아니요 파이썬 2에서는 모든 키워드와 숫자에 대해 작동하지 않습니다. 특히로 시작하는 키워드에는 작동하지 않습니다 e. 파이썬 토크 나이 저는이를 부동 소수점 과학적 표기법 (예 :) 으로 구문 분석하려고하기 때문 1e5입니다. 실패한 예 : f = lambda n:-1if n<0else 1. 0or 1토크 나이 저는 0o8 진수를 시작 한다고 생각하기 때문에 두 파이썬 버전 모두에서 실패하는 예는입니다 .
orlp

2

파이썬 3, 84 바이트

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

공백으로 채워진 모든 빈 줄이있는 여러 줄 문자열로 인수로 입력을 받아들이고 각 요소의 형식이 [공 번호, 속도] 인 배열을 반환하는 익명 함수입니다.

작동 원리

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 이것은 실제로 스 니펫이 아닌 함수이며 기본적으로 허용됩니다 . 파이썬에서 람다 함수는 이름이없는 함수로 변수에 할당 된 다음 필요할 때 호출 할 수 있습니다. 을 작성한 f = MyAnswer다음을 사용하여 호출 할 수 f(x)있습니다. 람다의 이름을 지정할 필요없다는 합의가 있습니다 . 그건 그렇고 멋진 도전입니다!
TheBikingViking

물론, 람다는 여기 코드 스 니펫이라고 생각했습니다 ( meta.codegolf.stackexchange.com/a/1146/55729 ). 그렇다면 모든 것이 잘 된 것 같습니다. 의견 주셔서 감사합니다 :)
Jacajack

2

자바 스크립트 (ES6) 93

편집하다2 바이트 저장된 @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 그렇습니다 감사합니다 그것이 어떻게 내 마음을 미끄러
뜨 렸는지 모르겠습니다
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.