गोल्फर साहसिक - अध्याय 1: फूलदान


13

गोल्फर साहसिक

यह पहली चुनौती है! बाद में और भी चुनौतियाँ होंगी जिन्हें पिछली चुनौती से डेटा की आवश्यकता होगी :)

अध्याय 1: फूलदान

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

आपकी पहली चुनौती एक छोटे से गाँव को बचाना है, अगर आप उसकी चुनौती को हल कर लेते हैं तो शैतान पूरे गाँव को नष्ट नहीं करने को तैयार है।

चुनौती :

आपके पास एक वर्टीकल फूलदान है जिसमें 10 चीजें (वायु शामिल) हो सकती हैं। यदि आप उस फूलदान में कोई चीज़ डालते हैं, तो गुरुत्वाकर्षण उस चीज़ को नीचे की तरफ कर देगा। यदि फूलदान पहले से ही भरा हुआ है (और यह हमेशा भरा रहता है यदि आप इसे "हवा से भरा" मानते हैं), तो इनपुट फूलदान के शीर्ष पर मौजूद तत्व को बदल देगा।

यहाँ अनुमत चीजों का सेट है:

  • वायु 0 /
  • एक चट्टान 1 / -
  • एक पत्ता 2 / ~
  • एक विस्फोटक 3 / x

यदि "ए बम" के ऊपर कोई चट्टान या पत्ती है, तो यह ऊपर की चीज़ पर विस्फोट और नष्ट कर देगा।

इनपुट उन चीज़ों की सूची है जिन्हें आप फूलदान में रखेंगे।

उदाहरण: 11231: आप 2 चट्टानें डालेंगे, फिर एक पत्ता, फिर एक बम और अंत में एक अंतिम चट्टान।

जब फूलदान स्थिर होता है, तो आप निम्न नियम से गणना करना शुरू कर सकते हैं:

  • रॉक संचायक को 1 यूनिट जोड़ता है
  • पत्ता संचायक को 2 से गुणा करता है
  • बम संचायक को 1 से घटाता है
  • हवा कुछ नहीं करती

(आपको कलश के ऊपर से गिनती शुरू करने की आवश्यकता है)

इनपुट के रूप में हम "11231" का उपयोग कर रहे हैं:

|-|  |-|  |~|  |x|  |-|  | |  | |  | |  | |  | |  | |
| |  |-|  |-|  |~|  |x|  |-|  | |  | |  | |  | |  | |
| |  | |  |-|  |-|  |~|  |x|  |-|  | |  | |  | |  | |
| |  | |  | |  |-|  |-|  |~|  |x|  |-|  | |  | |  | |
| |  | |  | |  | |  |-|  |-|  |~|  |x|  |-|  | |  | |
| |  | |  | |  | |  | |  |-|  |-|  |~|  |x|  |-|  | |
| |  | |  | |  | |  | |  | |  |-|  |-|  |~|  |x|  | |
| |  | |  | |  | |  | |  | |  | |  |-|  |-|  |~|  |~|
| |  | |  | |  | |  | |  | |  | |  | |  |-|  |-|  |-|
| |  | |  | |  | |  | |  | |  | |  | |  | |  |-|  |-|

और आउटपुट 2 होगा (गणना के रूप में ((0 x 2) + 1) + 1) फूलदान के सभी राज्यों को मुद्रित करने की आवश्यकता नहीं है!

आधार कार्यक्रम (पायथन 3)

आप इसे समझ सकते हैं कि यह कैसे काम करता है।

def printVase(vase):
  for i in vase:
    if i == 1:
      print("|-|")
    elif i == 2:
      print("|~|")
    elif i == 3:
      print("|x|")
    else:
      print("| |")

def updateVase(vase):
  changed = False
  for i in range(len(vase), -1, -1):
    if i < len(vase) - 1:
      if vase[i+1] == 3 and vase[i] in [1,2]:
        vase[i], vase[i+1] = 0, 0
        changed = True
      if not vase[i+1] and vase[i] in [1, 2, 3]:
        vase[i], vase[i+1] = vase[i+1], vase[i]
        changed = True
  return changed

userInput = input("Vase : ")
vase = [0 for i in range(0, 10)]
oldVase = vase
while updateVase(vase) or userInput != "":
  if userInput != "":
    vase[0] = int(userInput[0])
  userInput = userInput[1::]
  printVase(vase)
  input()

accumulator = 0
for i in vase:
  if i == 1:
    accumulator += 1
  if i == 2:
    accumulator *= 2
  if i == 3:
    accumulator -= 1
print(accumulator)

गोल्फ संस्करण (पायथन 3, नो वासे डिस्प्ले): 360 बाइट्स = 360 अंक

def u(v):
  c=0
  for i in range(len(v),-1,-1):
    if i<len(v)-1:
      if v[i+1]==3 and v[i]in[1,2]:v[i],v[i+1],c=0,0,1
      if not v[i+1]and v[i]in[1,2,3]:v[i],v[i+1],c=v[i+1],v[i],1
  return c
l,v=input(),[0 for i in range(0, 10)]
while u(v)or l!="":
  if l!="":v[0],l=int(l[0]),l[1::]
a=0
for i in v:
  if i==1:a+=1
  if i==2:a*=2
  if i==3:a-=1
print(a)

यदि आप परीक्षण करना चाहते हैं कि क्या आपका प्रोग्राम सही तरीके से काम करता है, तो आप इस इनपुट का परीक्षण कर सकते हैं: 12122111131

सही उत्तर 43 है :) (धन्यवाद एमिग्ना)

अब अंक के लिए:

  • (x) वह बिंदु जहाँ: x आपके प्रोग्राम को लिखने के लिए आवश्यक बाइट्स की मात्रा है। यदि आप अगली चुनौती पोस्ट करने के बाद जवाब देते हैं, तो इस चुनौती के अंक आपके कुल अंकों में नहीं जोड़े जाएंगे।

लक्ष्य पूरी चुनौती के दौरान कम से कम अंक रखने का है :) अगर आप चुनौती के किसी एक हिस्से को छोड़ देते हैं, तो आपके पास (wx + 1) अंक डिफ़ॉल्ट रूप से स्किप किए गए भाग के लिए होंगे (जहाँ wx सबसे खराब स्कोर है) उस चुनौती के लिए)।

अगली चुनौती के लिए आवश्यक डेटा:

आउटपुट जब इनपुट = 10100000200310310113030200221013111213110130332101

वर्तमान चैंपियन: एमिग्ना

भाग्य आप सभी का साथ दे !


2
"10 चीजों को शामिल कर सकते हैं" के साथ क्या है? क्या "वायु" एक चीज़ के रूप में गिना जाता है? क्या इनपुट की गारंटी इस तरह की है कि फूलदान में केवल 10 चीजें होंगी (मैं इसे संदर्भ कार्यान्वयन के लिए पूरा नहीं करता)? इसके अलावा अगली चुनौती के लिए डेटा तैयार करने वाले इनपुट में 10 से अधिक चीजें हैं (भले ही हवा कुछ भी न हो और बम ऊपर की चीज उड़ा दे, 14 चीजें होंगी, मुझे लगता है)।
जोनाथन एलन

1
एक इनपुट आपके गोल्फ एल्गोरिथ्म में 333एक फूलदान का निर्माण [0, 0, 0, 0, 0, 0, 0, 3, 3, 3]करता है और इसलिए इसका एक स्कोर होता है -3, लेकिन क्या यह आपके विनिर्देश [0, 0, 0, 0, 0, 0, 0, 0, 0, 3]के -1अनुसार नहीं होना चाहिए ?
लकोनी 16

2
@ लिकोनी मैं यह निर्दिष्ट करना भूल गया कि बम तब विस्फोट नहीं करता जब एक बम दूसरे के ऊपर होता है, धन्यवाद!
सिगमेई

1
10100000200310310113030200221013111213110130332101 के लिए आउटपुट 22, सही लगता है?
आउटगोल्फर

2
12122111131 जैसे ट्रिकी टेस्ट-केस जोड़ना एक अच्छा विचार हो सकता है।
22

जवाबों:


5

अजगर 2 - 208 191 185 180 172 164 156 बाइट्स

t=filter(bool,map(int,input()))
i=a=0
n=len(t)
while 0<n-1>i<11:
 if(t[i]>=3>t[i+1]):del t[i:i+2];i,n=0,n-2
 i+=1
for x in t[9::-1]:a+=a+x%2*(2-x-a)
print a

ब्रेकडाउन यह हवा और बम को हटाता है यदि यह स्टैक पर है तो मायने रखता है।

EDIT: बाइट बचाने के लिए मैंने पायथन 2 की अदला-बदली की, लेकिन अब इनपुट को 'ब्रेक्स 1212' जैसे ब्रेसिज़ में रखना चाहिए

EDIT2: Im भी संचायक गिनती पर गर्व है

EDIT3: आपके सभी सुझावों के लिए धन्यवाद, मैंने कभी नहीं सोचा होगा कि मैं इसे इतना कम कर सकता हूं


अच्छा पहला जवाब! मैं आज पाइथन के साथ भी कम समय के बारे में सोच रहा था। सोचिए आपने मेरे दृष्टिकोण को वैसे भी पीटा होगा।
ElPedro

इस तरह की टिप्पणी के लिए धन्यवाद :) पहली बार मैं एक कोड गोल्फ कर रहा हूं और मुझे यह कहना है कि यह काफी मजेदार है।
पेरी डौडी

4 बाइट्स बचाने t[:10][::-1]के reverse()लिए उपयोग करें और शायद एक ब्रैकेट को बचाने के लिए पायथन 2 का उपयोग करें print? मेरे लिए 5 और आत्माओं को बचाया :)
ElPedro

मेरे लिए कोई पायथन 2 नहीं है क्योंकि मुझे इसके लिए काम करने के लिए इनपुट () देना होगा, जिससे 5 और आत्माओं को मार दिया जाएगा। 22:22 पर [:: - 1]
Prisris Douady

btw, मैं इस सवाल में कुछ भी नहीं देखा कि कहते हैं कि इनपुट 'उद्धरण में लपेटा जा सकता है। बस कहता है "इनपुट चीजों की सूची है"। पायथन 2 में काम करता है :)
ElPedro



3

पायथन 2, 150 146 बाइट्स

v=[]
s=0
for c in input():
 v=v[:9]
 if'0'==c:1
 elif 3 in v[-1:]and c in'21':v=v[:-1]
 else:v+=[int(c)]
for x in v[::-1]:s+=s+x%2*(2-x-s)
print s

पॉइंट फॉर्मूला, और 4 बाइट बचाने के लिए Prisris Douady का धन्यवाद।


क्या आपने बिंदु की गिनती के लिए मेरा सूत्र लिया? किसी भी तरह से अच्छा समाधान, तुम मुझे हरा और यह बहुत क्लीनर है। इसके अलावा आप for c in input()सीधे कुछ कर बाइट्स बचा सकते हैं
Prisris Douady

2

जावास्क्रिप्ट, 267 264 249 आत्माओं की बलि

r='replace'
f=t=>{t=t[r](/0/g,'');while(/3[12]/.test(t.substring(0,10)))t=t[r](/3[12]/,'');
a=t.length-1;x=(t.substring(0,9)+(a>8?t[a]:'')).split('').reverse().join('');
c='c=0'+x[r](/1/g,'+1')[r](/2/g,';c*=2;c=c')[r](/3/g,'-1');eval(c);return c}

संपादित संस्करण, क्योंकि पहले वाला बड़ा इनपुट के लिए गलत था। इसे string.prototype.replace()ऐक्सेस-एक्सेस फंक्शन कॉल करके थोड़ा और आगे बढ़ाया । स्पष्टीकरण:

f=t=>{                                  Function declaration, input t
t=t.replace(/0/g,'');                   Remove air
while(/3[12]/.test(t.substring(0,10)))  Look for bombs; not double bombs, and only in the first 10 chars
    t=t.replace(/3[12]/,'');            Detonate bombs. If this makes a new bomb fall into the vase, or
                                        a double bomb is now a single bomb, it'll detonate that bomb too.
x=(t.substring(0,9)+                    Fill the vase, take the first 9 items
    (t.length>9?t[t.length-1]:''))      If we have more than 9 items, then add the last one
    .split('').reverse().join('');      Flip the instruction string.
c='c=0'+x.replace(/1/g,'+1')            Replace each item with the proper instruction to the ACC
         .replace(/2/g,';c*=2;c=c')
         .replace(/3/g,'-1');
eval(c);return c}                       Eval to get the value of ACC and return it.

f('11231');लौटता है 2इसे ऑनलाइन आज़माएं


10100000200310310113030200221013111213110130332101 अच्छा परिणाम नहीं लौटाता :) आप करीब हैं हालांकि :)
सिगमेई

@Sygmei मुझे पता है, और मैं इसे से बकवास को डिबग कर रहा हूं, लेकिन मुझे पता नहीं चल पाया है कि क्यों। क्या आप मुझे चैट में देख
स्टीनबर्ग

1

हास्केल, 221 202 181 177 166 आत्मा बाइट्स

g(0:r)=r++[0]
g(3:x:r)|0<x,x<3=0:0:g r|1<3=3:g(x:r)
g(x:r)=x:g r
g r=r
v%(x:r)=g(init v++[x])%r
v%[]|v==g v=foldr([id,(+)1,(*)2,(-)1]!!)0v|1<3=g v%[]
(([0..9]>>[0])%)

इसे आइडोन पर आज़माएं । आइटमों को पूर्णांक सूची के रूप में लेता है।

उपयोग:

*Prelude> (([0..9]>>[0])%) [1,2,1,2,2,1,1,1,1,3,1]
43

(संपादित करें: पुराना) स्पष्टीकरण:

g [] = []                             -- g simulates gravity in the vase
g ('0':r) = r ++ "0"                  -- the first 0 from the bottom is removed
g ('3':x:r) | elem x "12" = "00"++g r -- if a 1 or 2 is on a bomb, explode 
            | True = '3' : g(x:r)     -- else continue
g (x:r) = x : g r                     -- no air and no bomb, so check next item

c x = [id,(+)1,(*)2,(-)1]!!(read[x])  -- map 0, 1, 2, 3 to their score functions

f v w (x:r) =                         -- v is the current vase state, w the previous one
               init v++[x]            -- replace last vase element with input
             g(init v++[x])           -- simulate one gravity step
           f(g(init v++[x]))v r       -- repeat, w becomes v
f v w[] | v==w =                      -- if the input is empty and vase reached a fixpoint
                 foldr c 0 v          -- then compute score 
        | True = f (g v) v []         -- else simulate another gravity step


vase input = f "0000000000" "" input  -- call f with empty vase, previous vase state and
                                      -- the input as string of numbers

बहुत बढ़िया :) ! अंतिम तीन क्या हैं?
सगमेई

@Sygmei यह दो तार हैं f "0000000000" "", आपको उनके बीच किसी स्थान की आवश्यकता नहीं है। मैंने कोड में एक स्पष्टीकरण जोड़ा।
लकोनी

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