캘리포니아에서는 가뭄을 겪고 있으므로 가능한 한 많은 물을 보존 할 수 있도록 남은 물의 양을 알아야합니다.
물은 공급이 제한되어 있기 때문에 코드는 가능한 짧아야합니다.
예
| |
| |
|~~~|
|___|
Output: 0.5
|~~~~~|
| |
| |
|_____|
Output: 1
| |
|__|
Output: 0 (or bonus)
사양
입력은 모든 |_ ~
개행과 개행 으로 만 구성됩니다 . 위의 모든 ~
것은 공기로 간주됩니다. _
, 아래 공간 ~
및 ~
그 자체는 물로 간주됩니다. 남은 물의 비율은에 의해 컴퓨터입니다 water / (air + water)
. 백분율 보너스를 가지지 않는 한 출력은 소수점 이하 4 자리까지 정확해야합니다. 입력은 항상 직사각형입니다. 는 ~
어떤에있는 경우에만, 한 줄에있을 것입니다. 원하는 경우 입력에 선택적으로 후행 줄 바꿈이있을 수도 있습니다.
보너스
두 보너스를 모두 받으면 -35 보너스 전에 -15 % 보너스가 적용됩니다
-35 바이트 보너스 : 코드가 “이 가뭄 염소 를 손에 넣지 않았습니다 “라고 출력하는 경우, 출력이 0 일 때 0 대신
-15 % 보너스 : 퍼센트를 출력 할 경우.
이렇게하려면 소수점 이하 두 자리를 왼쪽으로 이동하고 선행 0을 자르고 %
끝에 a 를 추가합니다 . 후행 0 (최대 2)은 값에 영향을 미치지 않는 한 허용됩니다. 0.5
-> 다음 중 하나 :50.00% 50% 50.0%
답변
Pyth- 17 46 45 52 * .85-35 = 9.2 바이트
줄에 대한 입력을 새 #
필터 meta-op!로 필터링 ~
한 다음 입력을 인덱싱 한 다음 입력 길이로 나눕니다. with가 없으면 ~
오류가 발생하고 except 절을 트리거 .x
하고 문자열을 인쇄합니다.
.x+*100-1cxK.zh@#\~KlK\%." u(C$éáPãbÉãç*îÂe[W
답변
파이썬 3, 37 바이트
lambda x:1-(x+'|~').find('|~')/len(x)
보너스가 없습니다. 후행 줄 바꿈을 포함하여 줄 바꿈이 포함 된 입력 문자열을받습니다.
수식이 왜 작동하는지 봅시다. 물의 비율은 우리가 도출 할 공기의 비율을 보완합니다.
frac_water = 1 - frac_air
행 번호 매기기 것은 0, 1, 2, ...
, 우리가
frac_air = water_row_index / num_rows
둘 다 각 행의 너비를 곱하고 개행을 계산하여 문자 수의 표현식으로 단순화하는 경우에도 마찬가지입니다.
frac_air = (width * water_row_index) / (width * num_rows)
= water_row_start_char_index / num_chars
워터 행 시작은에 대한 입력 문자열 x
을 검색하여 찾을 |~
수 있으며 문자 수는 길이입니다.
frac_air = x.find('|~') / len(x)
마지막으로, 비수 입력을 작동시키기 위해, |~
검색하기 전에 가상의 물 행 시작 을 끝에 추가하여 수위가 0 인 것처럼 보이게합니다.
보너스는 그만한 가치가 없었습니다. 내가 문자열 하나에 가장 좋은 것은 73-35 = 38입니다.
lambda x:['This drought goat out of hand',1-x.find('|~')/len(x)]['~'in x]
답변
CJam, 19 17 16 58 * 0.85-35 = 14.3 바이트
q'|-_'~#_)\@,d/1\m100*s'%+"This drought goat out of hand"?
이 버전은 두 가지 보너스를 모두받습니다. 이 솔루션이 작동 하려면 입력 에 후행 줄 바꿈이 있어야합니다 .
2 바이트를 절약 한 @Martin Büttner에게 감사합니다.
설명:
q Get input.
'|- Remove left/right wall, so that position of first ~ in remaining string
corresponds to the water level.
_ Make a copy.
'~# Find ~ character.
_) Make copy of find result, and increment it. This is 0 if the ~
was not found, and will be used for the bonus condition.
\ Swap original find result to top.
@, Rotate copy of remaining input to top, and get its length.
d Convert to double to get float division.
/ Divide the two values. Since the position of the ~ was indexed from
the top, this is 1 minus the desired result.
1\m Subtract value from 1, to get the actual result.
100* Multiply by 100 to get percent.
s Convert to string.
'%+ Append % sign.
"This drought goat out of hand"
Push bonus zero string.
? Ternary operator to pick calculated result or zero string.
답변
자바 스크립트 (ES6), 45 (94-15 % -35)
익명의 기능으로. 템플릿 문자열을 사용하면 바이트 수에 중요한 개행이 있습니다.
1 바이트 저장된 thx @ user81655 편집
p=>p.split`
`.map((r,i)=>r>'|~'?p=i:q=~i)&&q-p?(1+p/q)*100+'%':'This drought goat out of hand'
덜 골프
p=>(
p.split('\n') // split in rows
.map((r,i)=> // execute for each row
r>'|~' // look for the water top
? p=i // position of water top in p
: q=~i // if not water top, set current position (-i-1) in q
),
// at the end,if water top not found, p still contains the input string
q-p // subtracting the input string I get NaN (that is a falsy value)
? (1+p/q)*100+'%' // calc % taking into account the negative sign of q
: 'This drought goat out of hand'
)
테스트 스 니펫
F=p=>p.split`\n`.map((r,i)=>r>'|~'?p=i:q=~i)&&q-p?(1+p/q)*100+'%':'This drought goat out of hand'
function Update() {
var w=+W.value, h=+H.value, t=+T.value,
b=Array(h).fill().map((r,i)=>'|'+(i==h-1?'_':i==t?'~':' ').repeat(w)+'|').join`\n`
O.textContent = b+'\n\n'+F(b)
}
Update()
<table>
<tr><td>Width</td><td><input id=W type=number value=4 oninput='Update()'></td></tr>
<tr><td>Height</td><td><input id=H type=number value=4 oninput='Update()'></td></tr>
<tr><td>~~~ at row</td><td><input id=T type=number value=2 oninput='Update()'></td></tr>
</table>
<pre id=O></pre>
답변
Par , 57 * 85 %-35 = 13.45 바이트
`This drought goat out of hand`r√″T┐↑⌐'~˦↑↔~÷Zx²*'%↔╡\z_g
설명
`This dr...d` ## 'This drought goat out of hand'
r ## Read entire input
√ ## Split by newlines
″ ## Duplicate
T ## Transpose
┐↑ ## Second element of each line
⌐ ## Reverse
'~˦ ## First index of '~'
↑ ## Plus one
↔ ## Swap
~÷ ## Divide by size
Z ## Assign to z
x²* ## Multiply by 100
'%↔╡ ## Append '%'
\ ## Array of string and number
z_g ## If z=0, then string; else, number
답변
Perl, 70-15 %-35 = 24.5 바이트
+1 포함 -p
$S[$w|=/~/]++}{$_=$w?100*$S[1]/$..'%':'This drought goat out of hand'
의견 :
$S[ $w |= /~/ ]++ # $w=0 for air, 1 for having seen water; count element
}{ # -n/-p: end the `while(<>){` and begin END block
$_ = $w # assign output for -p
? 100 * $S[1] / $. . '%' # $. is $INPUT_LINE_NUMBER
:'This drought goat out of hand' # costs 35 aswell, but is effectively more after -15%
-
26 + 1 바이트 버전, 보너스 없음 : 27
$S[$w|=/~/]++}{$_=$S[1]/$.
-
34 + 1 바이트 버전, 15 % 보너스 : 29.75
$S[$w|=/~/]++}{$_=100*$S[1]/$..'%'
-
61 + 1 바이트 버전, -35 보너스 : 27
$S[$w|=/~/]++}{$_=$w?$S[1]/$.:'This drought goat out of hand'
-
69 + 1 바이트 버전, 두 보너스 : 24.50
$S[$w|=/~/]++}{$_=$w?100*$S[1]/$..'%':'This drought goat out of hand'
답변
자바 스크립트, 59.3
소수점 이하 자릿수가 추가되기를 바랍니다. 후행 줄 바꿈이 없다고 가정합니다.
drought=
// code
a=>(b=-1,e=a.split`
`.map((c,d)=>b=c[1]=='~'?d:b).length,++b?(e-b+1)*100/e+"%":"This drought goat out of hand")
// I/O
var i = document.getElementById("i");
var o = document.getElementById("o");
i.onchange = i.onkeyup = function(){
o.textContent = drought(i.value);
};
// explanation
inputStr=>(
tildePosition = -1, // default: not found
containerDepth = // if the current line has a tilde, set tildePosition, otherwise
// keep current tildePosition
inputStr.split`\n`.map((line, pos)=> tildePosition = line[1]=='~' ? pos : tildePosition)
.length, // assign number of lines (container depth) to containerDepth
++tildePosition // if it's still -1, print the message, otherwise print percent
?(containerDepth-tildePosition+1)*100/containerDepth+"%"
:"This drought goat out of hand")
<textarea id="i"></textarea>
<p id="o"></p>