गिरने ASCII गेंदों


16

इनपुट

आपको इसमें गेंदों और जमीन के साथ एक 2D नक्शा दिया गया है। यह इस तरह दिख रहा है:

  1         5          2
                 3
     4


__________________________

प्रत्येक संख्या एक गेंद है, और _यह जमीनी स्तर है। अंडरस्कोर _कैरेक्टर को ग्राउंड लेवल लाइन की तुलना में किसी अन्य लाइन में अनुमति नहीं है। 0-9जमीनी स्तर से ऊपर की अनुमति केवल रिक्त स्थान, नए अंक और अंक हैं । आप यह नहीं मान सकते कि अंतिम पंक्ति जमीनी स्तर है - जमीनी स्तर से नीचे की खाली रेखाओं को अनुमति है। रिक्त स्थान भरने के लिए आप रिक्त स्थान भी जोड़ सकते हैं, यदि वह आपकी मदद करता है।

बॉल्स से संख्या में हो सकता है 0के लिए 9, जमीन के नीचे एक दूसरे के ऊपर रखा जा सकता है, लेकिन नहीं। गेंद की संख्या अद्वितीय होगी।

मान लें कि प्रत्येक वर्ण एक मीटर है

पास्टबिन से नक्शा प्राप्त करें!
टेस्ट केस 1 - इस
टेस्ट केस 2 की तरह कुछ आउटपुट करना चाहिए - पहले मैप के समान परिणाम उत्पन्न करना चाहिए

चुनौती

आपकी चुनौती एक फ़ाइल या उस तरह से एक नक्शा पढ़ना है stdin की है cat balls.txt | ./yourexecutable- जब आप जमीन से टकराते हैं तो आपको प्रत्येक गेंद के उपयोग और उत्पादन के वेग की अनुमति होती है।

यहां वेग का सूत्र दिया गया है:

यहाँ छवि विवरण दर्ज करें

मान लें कि hजमीन की रेखा संख्या और गेंद की रेखा संख्या के बीच अंतर हैg बराबर है 10m/s^2

उत्पादन

आपको m/sजमीनी स्तर पर प्रत्येक गेंदों की संख्या और वेग का उत्पादन करना चाहिए । उदाहरण के लिए N - Vm/s, Nबॉल नंबर कहां है औरV उसका वेग है। आप चाहें तो एक ऐरे को भी आउटपुट कर सकते हैं।

हैप्पी कोडिंग! :)


बिना किसी अपेक्षित परिणाम के परीक्षण के मामले परीक्षण के मामले नहीं हैं
edc65

@ edc65 मैंने सवाल में अपेक्षित परिणाम जोड़ दिए
जैकजैक

यदि मैं प्रोग्राम के भाग के रूप में उपयोगकर्ता से इनपुट के रूप में निर्देशिका लेता हूं तो क्या यह ठीक है?
डैनियल

@ डोप्प्प आप वास्तव में क्या मतलब है?
जैकजैक

मेरा जवाब देखिए ।
डैनियल

जवाबों:


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

सी, 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, क्योंकि यह इंगित नहीं करना मेरी गलती है
जैकजैक

@ जकजैक नहीं, कोई भी चरित्र तब तक ठीक है जब तक उसमें ASCII कोड वाला कोई वर्ण शामिल नहीं है जो इससे बड़ा है _। हालांकि, यह एक अतिरिक्त बाइट ( !=इसके बजाय <) के साथ तय किया जा सकता है ।
orlp

खैर, मैंने परीक्षण के लिए 'x' का उपयोग किया। कोई बात नहीं। आपका कोड महान :)
जैकजैक

@ जेजाकैक नए संस्करण में यह अब एक कैरेक्टर फिक्स नहीं है, लेकिन मैंने 3 और बाइट्स बचा लिए हैं :)
orlp

अच्छा! :) मैं घर वापस आने पर अपने कोड के साथ क्या कर सकता हूं, इस पर एक नज़र डालूंगा। मुझे पता है कि इसे बहुत छोटा किया जा सकता है, लेकिन मैं नहीं चाहता कि यह आपकी एक प्रति हो: p
जैकजैक

6

सी - 194 (-5) 150 137 बाइट्स

थोड़ा और समय और सोच के साथ, मैंने 44 बाइट्स
को गोल्फ के लिए धन्यवाद दिया, 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 यही मेरे पास था।
orlp

1
if (x != -1)के रूप में ही है if (~x)(दो पूरक मशीनों पर) क्योंकि ~-1(विशिष्ट) है 0। सी में गोल्फ का उपयोग कभी नहीं while(cond), के रूप for(;cond;)में बस के रूप में लंबे समय है और गोल्फ के लिए और अधिक अवसर प्रदान करता है। आपके उदाहरण में यह बन सकता है for(;~(c=getchar());n=c==95?l:n)b[c]=(l+=c==10);
orlp

@orlp मैं समझता हूं, सलाह के लिए धन्यवाद :)
जैकजैक

1
l=1के lलिए पहला तर्क देकर खतना किया जा सकता है main, क्योंकि सी रनटाइम अपने पहले तर्क ( argc) के रूप में मुख्य के लिए तर्कों की संख्या से गुजरता है , और जब आप किसी भी कमांड लाइन तर्क ( ./a.out) के बिना एक कार्यक्रम कहते हैं , तो argc = l = 1n=0;अनावश्यक है, क्योंकि वैश्विक पूर्णांक स्वचालित रूप से 0. के लिए आरंभिक होते हैं, इसलिए बस n;पर्याप्त होगा।
orlp

4

पायथ, 27 26 25 24 बाइट्स

smf-hT "_"। e, b @ * 20-xd \ _k2dC 
smf @T`M; .e, b @ * 20-xd \ _k2dC 
smf @ T`M .e।, b @ * 20-xd \ _d2। _k2dC
एसएम @ # `एम; करें.ई., ख @ * 20-xd \ _k2dC

इसे ऑनलाइन आज़माएं!



@orlp ओह, मैंने सोचा कि जमीनी स्तर केवल अंतिम पंक्ति में हो सकता है।
लीक नून



1
@orlp यह नियमों में था कि "आप रिक्त स्थान भरने के लिए रिक्त स्थान जोड़ सकते हैं, यदि वह आपकी सहायता करता है।"
लीक नून

3

मतलाब, 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

पायथन 3, 84 बाइट्स

संस्करण 6, 84 बाइट्स: (लीक नन के लिए धन्यवाद!)

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कॉल के साथ कोष्ठक की आवश्यकता नहीं है ?
यति

1
@LeakyNun नहीं यह पायथन 2 में सभी कीवर्ड्स और नंबरों के लिए काम नहीं करता है। यह विशेष रूप से उन कीवर्ड्स के लिए काम नहीं करता है, जिनकी शुरुआत ए के साथ होती है e, क्योंकि तब पायथन टोकन इसे फ्लोटिंग पॉइंट साइंटिफिक नोटेशन (जैसे 1e5) के रूप में पार्स करने का प्रयास करेगा । उदाहरण में विफल रहता है कि: f = lambda n:-1if n<0else 1। एक उदाहरण जो पायथन के दोनों संस्करणों में विफल रहता है 0or 1, क्योंकि टोकन करने वाला सोचता है कि 0oएक अष्टक संख्या शुरू होती है।
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 पर इसे आज़माएं


इस मामले में, मुझे लगता है, यह पूर्ण स्वसंपूर्ण पायथन स्क्रिप्ट के बजाय कोड स्निपेट है, है ना?
जैकजैक

@ जेजैक यह वास्तव में एक फ़ंक्शन है, न कि एक स्निपेट, जिसे डिफ़ॉल्ट रूप से अनुमति दी जाती है । पायथन में, लैम्ब्डा फ़ंक्शन एक नाम के बिना कार्य हैं जो एक चर को सौंपा जा सकता है और फिर जरूरत पड़ने पर बुलाया जा सकता है; आप लिख सकते हैं f = MyAnswer, और फिर कॉल करके कॉल कर सकते हैं f(x)। एक आम सहमति है कि लंबोदर नाम रखने की कोई आवश्यकता नहीं है । अच्छी चुनौती है, वैसे!
बाइकिंग बाइक 20

निश्चित रूप से, मुझे लगा कि लैम्ब्डा को यहाँ कोड स्निपेट माना जाता है ( meta.codegolf.stackexchange.com/a/1146/55729 )। मुझे लगता है कि सब कुछ ठीक है, फिर। आपकी राय के लिए धन्यवाद :)
जैकजैक

2

जावास्क्रिप्ट (ईएस 6) 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)?
जैजैक

@ जैकाजैक धन्यवाद धन्यवाद मुझे नहीं पता कि यह मेरे दिमाग से कैसे फिसल गया
edc65
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.