क्या हम डूबते हैं या तैरते हैं?


40

समस्या

एक कयामत के दिन परिदृश्य एक पंक्ति पर तीन नंबर से वर्णन किया गया है, n, m, और p। उस पंक्ति का अनुसरण प्रति पंक्ति मानों वाली nरेखाएँ हैं m। प्रत्येक मान पानी की कुल इकाइयों को दर्शाता है जो प्रत्येक सेल पकड़ सकता है।

अगली pपंक्तियों में अगले pदिनों के मौसम का वर्णन है । 1 यूनिट बारिश प्रत्येक दिन एक कोशिका पर होती है। यदि किसी सेल में पानी की मात्रा उस राशि से अधिक हो सकती है, जो उस सेल में बाढ़ आती है। यदि कई आसन्न कोशिकाएं पूर्ण क्षमता पर हैं, तो उन्हें एक सेल के रूप में माना जाता है जो आम पड़ोसियों को साझा करते हैं (लगता है कि जब आप ब्लैंक के समूह पर क्लिक करते हैं तो माइनस्वीपर)।

  • एक एकल मध्य सेल में 4 पड़ोसी हैं
  • दो आसन्न, पूर्ण क्षमता मध्य कोशिकाओं को एक सेल के रूप में माना जाता है जिसमें 6 पड़ोसी होते हैं
  • सिंगल कॉर्नर सेल में 2 पड़ोसी हैं
  • एक एकल दीवार सेल में 3 पड़ोसी हैं

जब सेल में बाढ़ आती है, तो बाढ़ की घटना होती है। सभी अतिरिक्त पानी समान रूप से अपने पड़ोसियों को वितरित किए जाते हैं। यदि वह एक या एक से अधिक पड़ोसियों को बाढ़ का कारण बनाता है, तो एक और बाढ़ की घटना होती है। यह तब तक जारी रहता है जब तक कि पानी बस नहीं जाता है, या शहर पूरी तरह से बह चुका है।

उदाहरण इनपुट

7 5 3
3 2 3 4 5
2 2 0 3 4
1 1 3 3
4 4 2 2 2
4 4 1 2 2
4 4 2 2
4 4 2 2
0 0
1 2
4 3

  • 0 0 इसका मतलब यह है कि पंक्ति 1, कॉल 1 पर बारिश हुई
  • 1 2 इसका मतलब यह है कि 2 पंक्ति, 3 कोलो (जो शून्य पानी और तुरंत बाढ़ पकड़ सकता है!) पर बारिश हुई।

pबारिश के दिनों के बाद , अगर शहर में पूरी तरह से पानी भर गया है, तो उत्पादन सिंक करें । अन्यथा, उत्पादन तैरना

उदाहरण आउटपुट

तैरना

मान्यताओं

  • स्टड के माध्यम से इनपुट प्रदान किया जा सकता है, "city.txt" से पढ़ा जा सकता है, या एक तर्क के रूप में स्वीकार किया जा सकता है। तीनों को अनुमति दी जाती है ताकि पहले से पोस्ट किए गए किसी भी उत्तर को अमान्य न किया जाए।
  • जल क्षमता गैर-नकारात्मक पूर्णांक होगी।

अंडरग्रेजुएट कॉलेज के छात्रों (ए एंड एम, यूटी, एलएसयू, चावल, बायलर, आदि से) की 40 टीमों ने विभिन्न भाषाओं में उपलब्ध प्रोग्रामिंग प्रतियोगिता में 5 घंटे में इस समस्या को हल नहीं किया। उसकी वजह से, मैं मदद नहीं कर सकता लेकिन इस बात का उल्लेख करता हूं कि इस पहेली में एक पकड़ है जो समाधान को तुच्छ बनाती है। सबसे छोटा कोड अभी भी जीतता है, क्योंकि मुझे विश्वास है कि सबसे छोटा कोड पहेली को भी हल करेगा।


क्या यह मूल्यों की nरेखाएं mहैं या चारों ओर का रास्ता? आपका उदाहरण लिखित विनिर्देश से मेल नहीं खाता है।
अल्गोरिदमशार्क

@algorithmshark सही
रेनबोलेट

13
मुझे यकीन नहीं है, लेकिन यह मुझे लगता है कि अगर आप बारिश की मात्रा से बड़े हैं जो सभी वर्गों को पकड़ सकते हैं तो आप डूब जाते हैं; अन्यथा आप तैरते हैं। यही है क्या?
23

2
@ hosch250 मजा लूटना!
रेनबोल्ड

1
"अतिरिक्त पानी समान रूप से अपने पड़ोसियों को वितरित किया जाता है।" - कि पानी की 1 इकाई होने की संभावना है। क्या यह 0.25प्रत्येक आसन्न सेल ( जैसे एक मध्यम बाढ़ सेल मानकर) को इकाइयों के रूप में वितरित करता है ?
नील स्लेटर

जवाबों:


16

गोल्फस्क्रिप्ट, 37 30 अक्षर

नई और बेहतर, सुझावों के लिए पीटरटयूर का धन्यवाद :

~](\(@*\(@@<{+}*>"SwimSink"4/=

स्पष्टीकरण :

Code                     -                                            - Stack
~]                       - parse input into an array of integers      - []
(                        - pop first number and put on stack          - [] 7
\(                       - \ swaps top two, then pop first num again  - 7 [] 5
@                        - bring 3rd down from stack to front         - [] 5 7
*                        - mult. this is grid size                    - [] 35
\(@                      - bring next # out - the days of rain        - [] 3 35
@                        - bring array out                            - 3 35 []
<                        - take first 35 elements out of array.
                           this extracts just the capacities and 
                           consumes the rest                          - 3 []
{+}*                     - fold the array using plus - this sums the
                           entire thing                               - 3 86
<                        - greater-than comparison: 3 > 86?           - 0
"SwimSink"4/             - push a string and split it to groups of 4  - 0 ["Swim" "Sink"]

=                        - index into the array using the result of
                           the comparison. if rain > capacity, then
                           sink, else swim                            - "Swim"

कार्यक्रम तब समाप्त होता है, स्टैक को आउटपुट करता है।


पुराना संस्करण + स्पष्टीकरण:

[~](\(@*\(@{\(@\-}*\;0>"Sink""Swim"if

Fors के रूप में एक ही दृष्टिकोण , सिर्फ गोल्फस्क्रिप्ट =)। संभावना को और अधिक कुशल बनाया जा सकता है। इनपुट स्टड से है।

स्पष्टीकरण :

Code                     -                                            - Stack
[~]                      - parse input into an array of integers      - []
(                        - pop first number and put on stack          - [] 7
\(                       - \ swaps top two, then pop first num again  - 7 [] 5
@                        - bring 3rd down from stack to front         - [] 5 7
*                        - mult. this is grid size                    - [] 35
\(@                      - bring next # out - the days of rain        - [] 3 35
{                        - define a block which...
 \(@                     - brings next number out
 \-                      - swaps and subtracts 2nd down from top
}                                                                     - [] 3 35 {}
*                        - repeat that block 35 times. this ends up
                           pulling the capacities out one by one
                           and decrementing our number-of-days 
                           number by each one                         - [] -84 
\;                       - swap and kill the array to get rid of
                           unused input                               - -84
0>"Sink""Swim"if         - if the num > 0, evaluate to "Sink", 
                           otherwise to "Swim"                        - "Swim"

प्रोग्राम तब स्टैक को आउटपुट करता है, जो कि केवल उत्तर है।


]एक मिलान के बिना [पूरे स्टैक को एक सरणी में इकट्ठा करेगा, इसलिए एक प्रारंभिक [~]को सरल बनाया जा सकता है ~]grid_sizeकिसी सरणी के पहले तत्वों को प्राप्त करने के लिए , उपयोग करें <, इसलिए <{+}*कुल क्षमता को जोड़ने पर निश्चित रूप से आपको थोड़ा बचा सकता है। 0>"Sink""Swim"ifहो सकता है0>"SinkSwim"4/=
पीटर टेलर

@PeterTaylor: सुझावों के लिए धन्यवाद! क्या आपको यकीन है ~]? मैंने इसकी कोशिश की और यह काम नहीं कर पाया। अंतिम हैक अच्छा है, हालांकि यह होना चाहिए "SwimSink"- इसका उपयोग करेगा। और सरणी वाली चीज़ भी आशाजनक लगती है, उस पर काम करना होगा।
क्लॉडिउ

मैं निश्चित हूं: यह एक मानक चाल है, जिसका मैं और अन्य लोग वर्षों से उपयोग कर रहे हैं।
पीटर टेलर

@PeterTaylor: हम्म अजीब। मैंने जिस दुभाषिया से जोड़ा है , उसमें इसे आज़माएँ - यह विफल हो जाता है। तब - ठीक है शायद वेब दुभाषिया गैर-मानक है। लेकिन मैंने भी कोशिश की ruby golfscript.rbऔर यह अभी भी काम नहीं किया ... क्या आप यह सत्यापित कर सकते हैं कि यह आपके अंत में काम करता है? मुझे दोनों पर एक ही त्रुटि मिलती है:undefined method '+' for nil:NilClass (NoMethodError)
क्लाउडी

1
जब आप स्टड की कमी के लिए विकल्प के लिए एक स्ट्रिंग शाब्दिक सम्मिलित करते हैं, तो आपको इसे खाली स्ट्रिंग को हटाने के लिए अर्धविराम के साथ पूर्ववर्ती होना चाहिए जो वास्तव में "स्टडिन" से आता है। इसके साथ ही यह ठीक काम करता है
पीटर टेलर

20

C: 100 96 95 वर्ण

n,m;main(p){scanf("%d%d%d",&n,&m,&p);for(n*=m;n--;scanf("%d",&m))p-=m;puts(p>0?"Sink":"Swim");}

पाँच घंटे? मुझे पाँच मिनट लगे। :)

Aragaer, सरलीकरण के लिए धन्यवाद! हालांकि मैंने मुख्य के लिए चर घोषणाओं और तर्कों को पुनर्व्यवस्थित किया, क्योंकि क्लैंग को एक त्रुटि दिखाई देती है यदि मुख्य के अलावा दूसरा तर्क किसी अन्य प्रकार का है char **


3
९ ६ -p;main(n,m){for(scanf("%d%d%d",&n,&m,&p),n*=m;n--;scanf("%d",&m),p-=m);puts(p>0?"Sink":"Swim");}
at१४ को

1
95 - n,m;main(p){for(scanf("%d%d%d",&n,&m,&p),n*=m;n--;scanf("%d",&m))p-=m;puts(p>0?"Sink":"Swim");}। मैंने भी विचार के साथ खेला है n-=scanf, लेकिन निश्चित नहीं है कि उसके बाद कार्यक्रम सही होगा या नहीं। चरित्र की गिनती को बदलने scanfके forबिना पहले सामने की ओर ले जाया जा सकता है ।
arager

n-=scanf...n-=1मूल रूप से पूर्व वेतन वृद्धि के रूप में काम नहीं करेगा , इसलिए यह दक्षिण-पूर्वी कोने को याद करेगा। अन्य परिवर्तन महान है।
फोर्स

7

पायथन, 4 लाइनें, 175 वर्ण

import sys 
F=sys.stdin
n,m,p=[int(a) for a in F.readline().split()]
print("sink") if p > sum([sum(int(x) for x in F.readline().split()) for a in range(n)]) else print("swim")

योग्य, मुझे आश्चर्य है कि अगर 40+ टीमों ने कैच ढूंढना समाप्त कर दिया ... तो इसे कठिन तरीके से काम करने के बाद।


10
मैं 40+ टीमों में से एक था। हम असफल होने के बाद पकड़ बना रहे थे। सभागार में सभी ने एक साथ सामना किया। मुझे लगता है कि शायद मुझे इसका उल्लेख नहीं करना चाहिए था। तुम लोग बहुत जल्दी थे!
रेनबोल्ड

आउच! वैसे, क्या मुझे इन प्रकार के प्रश्नों के लिए स्टड से इनपुट प्राप्त करना चाहिए? - मैं स्टेक्सएक्सचेंज के लिए नया हूं। :)
निगल लें

मैं निर्दिष्ट प्रश्न कहने के लिए अपने प्रश्न को संपादित करने जा रहा था, लेकिन मुझे डर था कि यह आपके उत्तर को अमान्य कर देगा। मैं यहां लगभग एक महीने से पहेलियां पढ़ रहा हूं और वास्तव में इस पर ध्यान नहीं दिया गया है कि क्या लोग स्टैडिन को निर्दिष्ट करते हैं या नहीं।
रेनबोल्ट

1
@swalladge Codegolf में आपका स्वागत है! मैं सलाह देता हूं कि शीर्षक को एक शीर्षक बनाकर शीर्षक का शीर्षक बनाया जाए #
टिमोल्ला

2
यदि आप उपयोग करते हैं तो आप इसे नीचे 108 पर ला सकते हैं input()और map():n,_,p=map(int,input().split());print(['sink','swim'][p>sum(sum(map(int,input().split()))for a in range(n))])
ब्लेंडर

6

J (50 char) और K (40) डबल फीचर

हमेशा की तरह, इन दोनों के समाधानों में समान संरचना है, इसलिए वे दोनों यहाँ हैं। K एक पूर्ण बहुत छोटा है, हालांकि, जो एक सुखद आश्चर्य है।

>Sink`Swim{~(]<[:+/[+/@".@$+1!:1@#1:)/0 2{".1!:1]1

स्पष्टीकरण:

  • ".1!:1]1 - पहली पंक्ति में पढ़ें, और पूर्णांक में कनवर्ट करें।
  • (...)/0 2{- आइटम को इंडेक्स 0 और 2 ( nऔर pक्रमशः) पर ले जाएं, और उन्हें (...)क्रमशः क्रिया के लिए बाएं और दाएं तर्क के रूप में उपयोग करें ।
  • +1!:1@#1:- n+pलाइनों में पढ़ें ।
  • [+/@".@$- $पहली nपंक्तियों को लें ( [), बाकी को छोड़कर, और फिर पूर्णांक ( ".) और प्रत्येक पंक्ति पर योग करें ( +/)।
  • ]<[:+/- एक साथ पंक्ति रकम जोड़ें, और उसके बाद सही तर्क को यह मूल्य की तुलना, p। यदि pराशि से कम है तो हम सही उत्पादन करते हैं।
  • >Sink`Swim{~- चुनें Swimकि उपर्युक्त गणना सही है, या Sinkयदि गलत है।

उपयोग:

   >Sink`Swim{~(]<[:+/[+/@".@$+1!:1@#1:)/0 2{".1!:1]1
7 5 3
3 2 3 4 5
2 0 3 3 4
1 1 2 3 3
4 1 2 2 2
4 1 1 2 2
4 4 1 2 2
4 4 2 2 2
0 0
1 2
4 3
Swim

और अब के:

`Sink`Swim@{z<+//.:'x#0::'(x+z)#`}.. 0:`

व्याख्या की:

  • . 0:` - इनपुट की एक पंक्ति में पढ़ें, और पूर्णांक की एक सरणी में परिवर्तित करें।
  • {...}.- इस फ़ंक्शन n m pके तर्क के रूप में इन तीन नंबरों का उपयोग करें x y z
  • 0::'(x+z)#`- x+zइनपुट फ़ाइल हैंडल की प्रतियां बनाएं `, और फिर उनमें से प्रत्येक के लिए एक पंक्ति में पढ़ें ( 0::')।
  • .:'x#- पहले xआइटम लें , और प्रत्येक को संख्याओं के वेक्टर में बदलें।
  • z<+//- पूरे मैट्रिक्स को एक साथ जोड़ दें, और फिर यह देखने के लिए परीक्षण करें कि यह इससे अधिक है या नहीं z
  • `Sink`Swim@- वापस लौटें Sinkया उसके Swimअनुसार टेस्ट सही आए।

उपयोग:

  `Sink`Swim@{z<+//.:'x#0::'(x+z)#`}.. 0:`
7 5 3
3 2 3 4 5
2 2 0 3 4
1 1 2 3 3
4 1 2 2 2
4 1 1 2 2
4 4 1 2 2
4 4 2 2 2
0 0
1 2
4 3
`Swim

6

एपीएल, ३५

4↑'SwimSink'⌽⍨4×x[3]>+/{+/⎕}¨⍳1⌷x←⎕

निश्चित नहीं है अगर अनुमति दी गई है लेकिन यह "शहर" के बाद इनपुट स्वीकार करना बंद कर देता है

x←⎕इनपुट लेता है और इसे वेरिएबल में स्टोर करता है x(स्पेस-सीमांकित संख्याओं को एक संख्यात्मक सरणी के रूप में समझा जाता है)
1⌷एक्सट्रैक्ट इंडेक्स 1 (APL एरेज़ वन-बेस्ड हैं)
1 से तर्क तक एक सरणी उत्पन्न करें ( 1⌷x←⎕इस मामले में)
¨"मैप" ऑपरेशन
{+/⎕}सरणी लें इनपुट करें और राशि वापस करें यदि
+/मानचित्र
4×x[3]></> x[3](1 या 0) रिटर्न देता है, तो मानचित्र ऑपरेशन टेस्ट द्वारा उत्पन्न सरणी , तो 4 को उस राशि से गुणा
'SwimSink'⌽⍨करें अंत में, स्ट्रिंग के पहले 4 वर्णों को निकालें।'SwimSink'
4↑


मुझे लगता है कि एकमात्र हिस्सा जो मायने रखता है वह यह है कि यह किसी भी इनपुट के लिए सही उत्तर का आउटपुट देता है। यदि यह कोडगोल्फ के लिए असामान्य है, तो उम्मीद है कि कोई मुझे बताएगा।
रेनबोल्ड

बदलें ⎕IO←0, फिर की जगह 4↑'SwimSink'⌽⍨4×के साथ 'Swim' 'Sink'⊃⍨, x[3]के साथ x[2], और 1⌷xसाथ ⊃xदो बाइट्स को बचाने के लिए।
अड्मां

6

AWK, 70

n{for(;NF;NF--)s+=$NF;n--}NR==1{n=$1;p=$3}END{print p<s?"Swim":"Sink"}

यह मेरे प्रस्तुत करने पर लैन्डिर द्वारा किया गया नकल है (86):

NR==1{h=$1;w=$2;r=$3;next}NR<=h{for(i=1;i<=w;++i)c+=$i}END{print(c>r?"Swim":"Sink")}

NR<=hहोना चाहिए NR<=h+1, अन्यथा आपको झूठे सिंक मिलेंगे क्योंकि कैपेसिटी की आखिरी लाइन को छोड़ दिया जाता है। यह भी 70 तक छोटा किया जा सकता हैn{for(;NF;NF--)s+=$NF;n--}NR==1{n=$1;p=$3}END{print p<s?"Swim":"Sink"}
laindir

1
@ Laindir खैर, सुधार के लिए बहुत-बहुत धन्यवाद! मुझे यह बहुत मजेदार लगता है, कि अक्क बस एपीएल, जे और के के बगल में आता है, जिन्हें कोड-गोल्फिंग में हर किसी को हरा देने के लिए प्रजनन किया गया था! :-)
उपयोगकर्ता ४०

@ user40989 मुझे समझ नहीं आ रहा है। जे / के / एपीएल की तुलना में अवाक 40-100% अधिक लंबा लगता है, भले ही वे गोल्फिंग भाषाएँ नहीं हैं, बल्कि व्यावसायिक प्रोग्रामिंग भाषाओं के बजाय (स्टेम से)।
अडाम

5

कॉफ़ीस्क्रिप्ट - 128 113

एक फ़ंक्शन जो स्ट्रिंग को एकमात्र तर्क के रूप में लेता है:

s=(l)->l=l.split /\n/;[n,m,p]=l[x=0].split /\s/;x+=c|0 for c in r.split /\s/ for r in l[1..n];`p>x?"Sink":"Swim"`

आप इंडेंटेशन को हटा सकते हैं, और अर्धविराम द्वारा अलग की गई पहली पंक्ति पर सब कुछ स्थानांतरित कर सकते हैं। तुम भी लिखने `p>x?"Sink":"Swim"`के बजाय if p>x then"Sink"else"Swim"। तीसरे कथन के लिए भी आवश्यक नहीं है।
कोनराड बोरोस्की

4

एसईडी, 128

इसका एक sedसंस्करण लिखने में मज़ा आया । इसमें निम्नलिखित लघु-चित्रण हैं:

  • यह मानता है कि शहर में दो से अधिक स्तंभ हैं, आसानी से बारिश की रेखाओं को पहचानने के लिए।

  • यह मानता है कि प्रत्येक शहर की क्षमता 0-9 की सीमा में है।

यह रहा:

1d
s/^. .$/R/
G
:a
s/[\n 0]//
/[2-9]/{s/^/C/
y/23456789/12345678/}
s/1/C/
s/0//
s/RC//
h
ta
${s/R//g
s/^Sink//
s/.*C$/Swim/
p}

-nझंडे के साथ बुलाओ ।


3

SWI- प्रोलॉग 79

यदि आपको इस तथ्य पर कोई आपत्ति नहीं है कि यह उत्तर स्टैडिन के बजाय क्वेरी द्वारा इनपुट लेता है:

s(A,L):-append(A,B),sumlist(B,C),length(L,D),(D>C->E='Sink';E='Swim'),print(E).

जवाब इनपुट प्रारूप को मान्य नहीं करता है, लेकिन मुझे नहीं लगता कि यह एक समस्या है, क्योंकि प्रोग्रामिंग प्रतियोगिता को भी आपको ऐसा करने की आवश्यकता नहीं है।

नमूना क्वेरी (प्रश्न में उदाहरण का उपयोग करते हुए):

s([[3,2,3,4,5],
   [2,2,0,3,4],
   [1,1,2,3,3],
   [4,1,2,2,2],
   [4,1,1,2,2],
   [4,4,1,2,2],
   [4,4,2,2,2]],
  [(0,0),
   (1,2),
   (4,3)]).

1

अजगर - 152

import numpy
n, m, p = map(int,raw_input('').split())
print 'swim' if p<numpy.sum(numpy.matrix(';'.join([raw_input('') for i in range(n)]))) else 'sink'

1
आप कुछ व्हाट्सएप निकालकर शुरू कर सकते हैं। बाद ,, पहले और बाद में ', के बाद )...
Ry-

1

स्काला - 128

val a=readLine.split(' ')map(_.toInt);println(if((1 to a(0)map(x=>readLine.split(' ')map(_.toInt)sum)sum)>a(2))"swim"else"sink")

कुछ कोष्ठकों या कुछ को छोड़ना संभव हो सकता है, लेकिन स्केला वास्तव में विराम चिह्न और बिंदु-मुक्त शैली और () बनाम {} और व्हाट्सन के बारे में चंचल है।


0

जावास्क्रिप्ट - 73 वर्ण

for(i=c=0,a=s.split(/\s/);i++<a[0]*a[1];)c+=a[2+i]*1;c>a[2]?"Swim":"Sink"

मान लेता है कि इनपुट वैरिएबल में है sऔर आउटपुट Swimया Sink

उदाहरण:

मूल प्रश्न से - इसे ब्राउज़र कंसोल में दर्ज करना:

s="7 5 3\n3 2 3 4 5\n2 2 0 3 4\n1 1 2 3 3\n4 1 2 2 2\n4 1 1 2 2\n4 4 1 2 2\n4 4 2 2 2\n0 0\n1 2\n4 3";
for(i=c=0,a=s.split(/\s/);i++<a[0]*a[1];)c+=a[2+i]*1;c>a[2]?"Swim":"Sink"

आउटपुट:

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