ลูกบอล ASCII ที่ตกลงมา


16

อินพุต

คุณจะได้รับแผนที่ 2D พร้อมลูกบอลและพื้นดิน ดูเหมือนว่านี้:

  1         5          2
                 3
     4


__________________________

แต่ละหมายเลขคือลูกบอลและ_ระดับพื้นดิน ห้ามใช้_อักขระขีดล่างในบรรทัดอื่นที่ไม่ใช่บรรทัดระดับพื้นดิน มีช่องว่างบรรทัดใหม่และตัวเลขที่0-9อนุญาตเหนือระดับพื้นดิน คุณไม่สามารถสรุปได้ว่าบรรทัดสุดท้ายคือระดับพื้นดิน - อนุญาตให้มีบรรทัดว่างด้านล่างระดับพื้นดิน คุณยังสามารถเพิ่มช่องว่างเพื่อเติมบรรทัดว่างถ้าสิ่งนั้นช่วยคุณได้

ลูกบอลสามารถมีตัวเลขจาก0ถึง9สามารถวางเหนือกัน แต่ไม่สามารถอยู่ใต้พื้นดินได้ หมายเลขของลูกบอลจะไม่ซ้ำกัน

สมมติว่าตัวละครแต่ละตัวเป็นหนึ่งเมตร

รับแผนที่จาก pastebin!
กรณีทดสอบ 1 - ควรบางสิ่งบางอย่างที่ส่งออกเช่นนี้
กรณีทดสอบ 2 - ควรผลิตผลเช่นเดียวกับแผนที่แรก

ท้าทาย

ความท้าทายของคุณคือการอ่านแผนที่แบบนั้นจากไฟล์หรือจากstdin- คุณได้รับอนุญาตให้ใช้cat balls.txt | ./yourexecutable- และความเร็วการส่งออกของลูกบอลแต่ละลูกเมื่อกระทบกับพื้น

นี่คือสูตรสำหรับความเร็ว:

ป้อนคำอธิบายรูปภาพที่นี่

สมมติว่าhเป็นความแตกต่างระหว่างหมายเลขบรรทัดหมายเลขบรรทัดพื้นดินและหมายเลขบรรทัดลูกและที่เท่าเทียมกันg10m/s^2

เอาท์พุต

คุณควรส่งออกลูกบอลแต่ละหมายเลขและความเร็วในm/sระดับพื้นดิน ตัวอย่างเช่นN - Vm/sที่ไหนNคือหมายเลขบอลและVความเร็วของมัน คุณยังสามารถส่งออกอาร์เรย์ถ้าคุณต้องการ

การเข้ารหัสที่มีความสุข! :)


กรณีทดสอบที่ไม่มีผลลัพธ์ที่คาดหวังไม่ใช่กรณีทดสอบ
edc65

@ edc65 ฉันได้เพิ่มผลลัพธ์ที่คาดไว้สำหรับคำถาม
Jacajack

ไม่เป็นไรถ้าฉันใช้ไดเรกทอรีเป็นอินพุตจากผู้ใช้เป็นส่วนหนึ่งของโปรแกรม
แดเนียล

@Dopapp คุณหมายถึงอะไรกันแน่?
Jacajack

ดูของฉันคำตอบ
Daniel

คำตอบ:


8

MATL , 31 30 27 25 ไบต์

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

อินพุตเป็นอาร์เรย์ถ่าน 2 มิติโดยมี;ตัวคั่นแถว:

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

บันทึก 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

@orlp ผมเข้าใจขอบคุณสำหรับคำแนะนำ :)
Jacajack

1
l=1สามารถหลีกเลี่ยงได้โดยการทำให้lอาร์กิวเมนต์แรกmainเป็นเพราะ C runtime ส่งผ่านจำนวนอาร์กิวเมนต์ไปยัง main เป็นอาร์กิวเมนต์แรก ( 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
เอสเอ็ม @ # `M; .e ข @ * 20 XD \ _k2dC

ลองออนไลน์!



@ orlp โอ้ฉันคิดว่าระดับพื้นดินจะต้องอยู่ในบรรทัดสุดท้ายเท่านั้น
Leun Nun



1
@ orlp อยู่ในกฎที่ว่า "คุณสามารถเพิ่มช่องว่างเพื่อเติมบรรทัดว่างถ้ามันช่วยคุณได้"
Leun 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
Leun Nun

@LeakyNun เคล็ดลับนั้นใช้ได้กับคำหลักและตัวเลขทั้งหมดหรือไม่
แดเนียล

1
ฉันเชื่ออย่างนั้น นอกจากนี้(n-1)*20->~-n*20
Leun Nun

1
ยึดมั่นใน Python3 ไม่ต้องการวงเล็บในการprintโทรหรือไม่?
Yytsi

1
@LeakyNun ไม่ทำงานสำหรับคำหลักและตัวเลขทั้งหมดใน Python 2 โดยเฉพาะมันไม่สามารถใช้ได้กับคำหลักที่เริ่มต้นด้วยeเพราะโทเค็นของ Python จะพยายามแยกวิเคราะห์เป็นเครื่องหมายทางวิทยาศาสตร์แบบลอยตัว (เช่น1e5) ตัวอย่างที่ล้มเหลว: f = lambda n:-1if n<0else 1. ตัวอย่างที่ล้มเหลวใน Python ทั้งสองรุ่นคือ0or 1เนื่องจาก tokenizer คิดว่า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()]

ฟังก์ชั่นไม่ระบุชื่อที่รับเข้าโดยการโต้แย้งเป็นสตริงหลายบรรทัดที่มีบรรทัดว่างทั้งหมดที่เต็มไปด้วยช่องว่างและส่งกลับอาร์เรย์ที่แต่ละองค์ประกอบมีรูปแบบ [หมายเลขบอล, ความเร็ว]

มันทำงานอย่างไร

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 ฟังก์ชั่นแลมบ์ดาเป็นฟังก์ชั่นที่ไม่มีชื่อซึ่งสามารถกำหนดให้กับตัวแปรแล้วเรียกเมื่อจำเป็น คุณสามารถเขียนและจากนั้นเรียกใช้f = MyAnswer f(x)มีฉันทามติที่มีไม่จำเป็นต้องตั้งชื่อ lambdas ความท้าทายที่ดีโดยวิธี!
TheBikingViking

แน่นอนฉันแค่คิดว่า lambdas ถูกถือว่าเป็นตัวอย่างโค้ดที่นี่ ( meta.codegolf.stackexchange.com/a/1146/55729 ) ฉันเดาว่าทุกอย่างก็โอเคแล้ว ขอขอบคุณสำหรับความคิดเห็นของคุณ :)
Jacajack

2

JavaScript (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 ใช่ขอบคุณฉันไม่รู้ว่าสิ่งเหล่านั้นหลุดรอดไปได้อย่างไร
edc65
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.