물이 얼마나 남았습니까?


29

캘리포니아에서는 가뭄을 겪고 있으므로 가능한 한 많은 물을 보존 할 수 있도록 남은 물의 양을 알아야합니다.

물은 공급이 제한되어 있기 때문에 코드는 가능한 짧아야합니다.

|   |
|   |
|~~~|
|___|

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%


28
" 물은 공급이 제한되어 있기 때문에 코드가 가능한 짧아야합니다. "알았어요 .
Fatalize

14
@Fatalize : 주 외부의 일반적인 지식은 아니지만 유동적 논리 기반 컴퓨터는 캘리포니아에서 매우 인기가 있습니다. 요즘 아몬드 기반 대안을 찾을 수 있는지 확인하려고 노력하고 있다고 들었습니다.
JohnE

10
@JohnE 그것은 아마도 왜 가뭄이 지금 존재하는지 설명합니다
hargasinski

1
유동적 인 컴퓨터가 물을 사용 하지 않는다는 것을 알고 있습니까? 전기 컴퓨터가 전자 부족을 일으키지 않는 것처럼.
user253751

이것은 : |~~~|(밑줄 없음) 유효한 입력입니까?
edc65

답변:


16

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

여기에서 온라인으로 사용해보십시오 .


10

파이썬 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]

7

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.

5

자바 스크립트 (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>


1
언제나처럼 아름다운 테스트 스 니펫과 훌륭한 코드! 한 가지 제안 : 당신은 대체 할 수 p=~ip=i, &&-p함께 &&p-q하고 1+~p하는 1+p1 바이트를 저장합니다.
user81655

@ user81655 좋은 제안, 감사합니다
edc65

4

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

3

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'
    

2

자바 스크립트, 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>


1

하스켈, 56 바이트

l=sum.(>>[1])
f i|s<-lines i=l(snd$break(elem '~')s)/l s

사용 예 : f "| |\n|~~|\n| |\n|__|"-> 0.75.

l는 사용자 정의 길이 함수입니다. 빌드 인 length은 정수 값 을 반환하지만 나누기에는 부동 소수점 값이 필요 genericLength합니다 (이 기능도 제공하지만 필수는 물론 더 길다 import Data.List). f입력 i을 행 (-> s) 으로 분할 한 다음 첫 번째 요소가 첫 번째 요소가 첫 번째 요소 (및 첫 번째 요소)를 포함하는 목록 인 쌍으로 분할 ~합니다. 두 번째 요소는 나머지 줄이있는 목록입니다. 결과는 두 번째 요소의 길이를 길이로 나눈 값입니다 s.

보너스는 지불하지 않습니다.


1

파이썬은 장황하다!

파이썬 : 98.45 바이트

(157 * 0.85)-35 = 98.45 바이트

이 버전은 stdin에서 읽고 두 보너스를 모두 수집합니다.

import sys
r=[x[1]for x in sys.stdin.read().split('\n|')]
o="This drought goat out of hand"if'~'not in r else"%g%%"%(100-100.0*r.index('~')/len(r))
print(o)

2
보너스없이 66 :import sys;r=[x[1]for x in sys.stdin];print(1-r.index('~')/len(r))
블렌더

좋은! 선택적인 후행 줄 바꿈에 의해 넘어 졌습니까? 또한 나누기 연산자로 인해 Python 3 전용입니까?
Nicholas Clark

선택적인 후행 줄 바꿈은 포함 할 책임이 있습니다. 분할에 관해서는, 그래도 이미 print함수처럼 취급 하고 있으므로 파이썬 3을 사용한다고 가정했습니다.
Blender

1

Awk, 72 자-15 %-35 = 26.2

/~/{w=NR}END{print w?(NR-w+1)/NR*100"%":"This drought goat out of hand"}

샘플 실행 :

( 1;이러한 샘플 실행에서만 "사람이 읽을 수있는"탱크를 표시하는 데 사용됩니다.)

bash-4.3$ awk '1;/~/{w=NR}END{print w?(NR-w+1)/NR*100"%":"This drought goat out of hand"}' <<< $'| |\n| |\n| |\n|_|'
| |
| |
| |
|_|
This drought goat out of hand

bash-4.3$ awk '1;/~/{w=NR}END{print w?(NR-w+1)/NR*100"%":"This drought goat out of hand"}' <<< $'| |\n| |\n|~|\n|_|'
| |
| |
|~|
|_|
50%

1

PHP, 92 자-15 %-35 = 43.2

(두 블록의 코드에 88 자 + 4 자 명령 행 옵션)

$argn[1]>z&&$w=+$argi;
echo$w?100*($argi-$w+1)/$argi."%":"This drought goat out of hand";

가정 error_reporting이 기본값으로 설정되어 있다고 가정합니다 .

(큰 일이 아니라, -Rand를 -E한 번 사용하고 싶었습니다 . 이제는 -B왼쪽 에만 있습니다.)

샘플 실행 :

( echo"$argn\n";이러한 샘플 실행에서만 "사람이 읽을 수있는"탱크를 표시하는 데 사용됩니다.)

bash-4.3$ php -R 'echo"$argn\n";$argn[1]>z&&$w=+$argi;' -E 'echo$w?100*($argi-$w+1)/$argi."%":"This drought goat out of hand";' <<< $'| |\n| |\n| |\n|_|'
| |
| |
| |
|_|
This drought goat out of hand

bash-4.3$ php -R 'echo"$argn\n";$argn[1]>z&&$w=+$argi;' -E 'echo$w?100*($argi-$w+1)/$argi."%":"This drought goat out of hand";' <<< $'| |\n| |\n|~|\n|_|'
| |
| |
|~|
|_|
50%

0

QBIC -116-15 % = 98.6 바이트

{input S$:S$=MID$(S$,2,1):I=I+1:IF y<1 then x=I
y=y+instr(S$,"~"):IF instr(S$,"_")>0 THEN ?(1-(x-y)/I)*100;"%":END}

QBasic의 경쟁력을 높이기 위해 QBIC을 만들었지 만 여전히 몇 가지 개선이 필요합니다. 현재로서는 오류 트래핑에 대한 바로 가기가 없습니다 THEN(이 부분은 상당히 큰 감독입니다) input$. 곧 추가 될 예정입니다.

너무 많은 비용을 들이지 않고 0 보너스를받을 수 없었습니다. 나는 백분율을 인쇄했습니다.

샘플 입력 / 출력 :

? |  |
? |  |
? |~~|
? |__|
 50 %

프로그램은 대화식으로 입력을 읽습니다. 호수의 바닥을 감지하면 ( _) 백분율을 인쇄하고 종료합니다. 가득 찬 용기와 빈 용기도 테스트했습니다.

편집 : 작년에 QBIC가 어떻게 확장되었는지 보여주기 위해 현재 통역사를 위해 작성된 동일한 프로그램이 있습니다.

{_?A=$MID$|(A,2,1)#~|#_| i=i+1~j<1|k=i]j=j+instr(A,B)~instr(A,C)|?(1-(k-j)/i)*100,@%|_X

인쇄 백분율 인 87 바이트는 74 점입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.