골퍼 모험
이것이 첫 번째 도전입니다! 나중에 이전 도전의 데이터를 요구하는 더 많은 도전이있을 것입니다 :)
제 1 장 : 꽃병
잠깐 상상해 봅시다. 당신은 강력한 신이며, 당신의 능력은 무한하지만 한 가지가 필요합니다 : 영혼. 각 영혼은 여기에서 바이트로 표현되며, 사용하는 각 바이트는 영혼을 희생시킵니다. 따라서 목표는 분명히 가장 적은 수의 영혼을 희생하면서 많은 수의 사람들을 구하는 것입니다.
첫 번째 도전은 작은 마을을 구하는 것이며, 악마는 당신이 그의 도전을 해결하면 마을 전체를 파괴하지 않을 것입니다.
도전 과제 :
정확히 10 가지 (공기 포함)를 포함 할 수있는 수직 꽃병이 있습니다. 꽃병에 물건을 넣으면 중력이 그 물건을 바닥에 떨어 뜨립니다. 꽃병이 이미 가득 찬 경우 (그리고 "공기 가득한"것으로 간주하면 항상 가득 찬 경우) 입력이 꽃병 상단의 요소를 대체합니다.
다음은 허용되는 것들입니다.
- 공기
0 / - 바위
1 / - - 잎
2 / ~ - 폭탄
3 / x
"폭탄"위에 바위 나 잎이 있으면 그 위에있는 것이 폭발하여 파괴됩니다.
입력은 매번 꽃병에 넣을 물건의 목록입니다.
예 : 11231 : 바위 2 개, 잎, 폭탄, 마지막 바위를 넣습니다.
꽃병이 정적이면 다음 규칙으로 계산을 시작할 수 있습니다.
- Rock은 어큐뮬레이터에 1 단위를 추가합니다
- 리프는 누산기에 2를 곱합니다.
- 폭탄으로 누산기가 1 씩 감소합니다
- 공기는 아무것도하지 않습니다
(화병 위에서 계산을 시작해야합니다)
다음은 "11231"을 입력으로 사용하여 얻은 시뮬레이션입니다.
|-| |-| |~| |x| |-| | | | | | | | | | | | |
| | |-| |-| |~| |x| |-| | | | | | | | | | |
| | | | |-| |-| |~| |x| |-| | | | | | | | |
| | | | | | |-| |-| |~| |x| |-| | | | | | |
| | | | | | | | |-| |-| |~| |x| |-| | | | |
| | | | | | | | | | |-| |-| |~| |x| |-| | |
| | | | | | | | | | | | |-| |-| |~| |x| | |
| | | | | | | | | | | | | | |-| |-| |~| |~|
| | | | | | | | | | | | | | | | |-| |-| |-|
| | | | | | | | | | | | | | | | | | |-| |-|
그리고 출력은 2가 될 것입니다 (로 계산 ((0 x 2) + 1) + 1) 꽃병의 모든 상태를 인쇄 할 필요가 없습니다!
기본 프로그램 (Python3)
작동 방식을 이해하기 위해 실행할 수 있습니다.
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)
골프 버전 (Python3, 꽃병 없음) : 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입니다 :) (Emigna 감사합니다)
이제 포인트 :
- (x) 포인트 : x는 프로그램을 작성하는 데 필요한 바이트 수입니다. 다음 챌린지가 게시 된 후에 대답하면이 챌린지에 대한 포인트가 총 포인트에 추가되지 않습니다.
목표는 전체 챌린지 중에 최소 점수를 유지하는 것입니다. 그 도전을 위해).
다음 도전에 필요한 데이터 :
입력시 출력 = 10100000200310310113030200221013111213110130332101
현재 챔피언 : Emigna
모두 행운을 빌어 요 !
333꽃병 [0, 0, 0, 0, 0, 0, 0, 3, 3, 3]을 구성 하므로 점수는 -3이지만 사양 [0, 0, 0, 0, 0, 0, 0, 0, 0, 3]에 -1따라 점수 가 맞지 않아야 합니까?