Còn lại bao nhiêu nước?


29

Ở California, chúng tôi đang bị hạn hán nên chúng tôi cần biết chúng tôi còn lại bao nhiêu nước để có thể bảo tồn càng nhiều nước càng tốt.

Bởi vì nguồn nước bị hạn chế, mã của bạn sẽ cần phải càng ngắn càng tốt.

Ví dụ

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

Output: 0.5
|~~~~~|
|     |
|     |
|_____|

Output: 1
|  |
|__|

Output: 0 (or bonus)

Đặc điểm kỹ thuật

Đầu vào sẽ chỉ bao gồm tất cả: |_ ~và dòng mới. Tất cả ở trên ~được coi là không khí; _, không gian bên dưới ~, và ~chính nó được coi là nước. Phần trăm nước còn lại là máy tính water / (air + water). Đầu ra của bạn cần phải chính xác đến 4 chữ số thập phân (trừ khi bạn đi phần thưởng phần trăm). Đầu vào sẽ luôn là hình chữ nhật. Các ~sẽ chỉ có trên cùng một dòng, nếu trên bất kỳ. Tùy chọn đầu vào cũng có thể có nguồn cấp dữ liệu theo dõi nếu bạn muốn.

Tiền thưởng

Nếu bạn nhận được cả hai phần thưởng, phần thưởng -15% được áp dụng trước phần thưởng -35

Phần thưởng -35 byte: Nếu mã của bạn in "Con khô hạn này ra khỏi tay", thay vì 0 khi Đầu ra bằng 0

-15% Tiền thưởng: Nếu bạn xuất ra một phần trăm.

Để làm điều này, bạn sẽ dịch chuyển vị trí thập phân hai vị trí sang trái, cắt các số 0 đứng đầu và thêm %vào cuối. Các số 0 lưu trữ (tối đa 2) được cho phép miễn là chúng không ảnh hưởng đến giá trị. 0.5-> bất kỳ:50.00% 50% 50.0%


28
" Bởi vì nguồn nước bị hạn chế, mã của bạn sẽ cần phải càng ngắn càng tốt. " Uhhh được rồi, có ý nghĩa gì ... tôi đoán vậy?
Gây tử vong

14
@Firthize: Đây không phải là kiến ​​thức phổ biến ngoài tiểu bang, nhưng các máy tính dựa trên logic trôi chảy rất phổ biến ở California. Tôi nghe nói họ đang cố gắng xem liệu họ có thể tìm ra một sự thay thế dựa trên hạnh nhân ngày nay không.
JohnE

10
@ John có lẽ giải thích tại sao bây giờ có hạn hán
hargasinski

1
Các bạn biết rằng máy tính chất lỏng không sử dụng hết nước, phải không? Giống như máy tính điện không gây ra tình trạng thiếu điện tử.
dùng253751

Đây có phải là: |~~~|(không có dấu gạch dưới) đầu vào hợp lệ?
edc65

Câu trả lời:


16

Pyth - 17 46 45 52 * .85 - 35 = 9.2 byte

Lọc đầu vào (Với #meta-op của bộ lọc mới !) Cho một dòng có ~trong đó, sau đó lập chỉ mục đó cho đầu vào, sau đó chia số đó cho độ dài của đầu vào. Nếu không có ~, nó sẽ lỗi và kích hoạt mệnh đề ngoại trừ .xvà in chuỗi.

.x+*100-1cxK.zh@#\~KlK\%." u(C$éáPãbÉãç*îÂe[W

Hãy thử trực tuyến tại đây .


10

Python 3, 37 byte

lambda x:1-(x+'|~').find('|~')/len(x)

Không có tiền thưởng. Có một chuỗi đầu vào với các dòng mới, bao gồm cả một dòng mới.

Hãy xem tại sao công thức hoạt động. Phần nước là phần bổ sung của phần không khí, chúng ta sẽ lấy được.

frac_water = 1 - frac_air

Đánh số các hàng 0, 1, 2, ..., chúng ta có

frac_air = water_row_index / num_rows 

Điều này cũng tương tự nếu cả hai được nhân với chiều rộng của mỗi hàng, tính các dòng mới, đơn giản hóa thành các biểu thức trong số lượng ký tự.

frac_air = (width * water_row_index) / (width * num_rows)
         = water_row_start_char_index / num_chars

Đầu hàng nước được tìm thấy bằng cách tìm kiếm chuỗi đầu vào xcho |~, và số lượng các ký tự chỉ là chiều dài.

frac_air = x.find('|~') / len(x)

Cuối cùng, để làm cho đầu vào không có nước hoạt động, chúng tôi nối một hàng nước giả tưởng bắt đầu |~đến cuối trước khi tìm kiếm, điều này làm cho nó trông giống như mực nước là 0.

Tiền thưởng dường như không xứng đáng. Điều tốt nhất tôi có trên chuỗi một là 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 byte

q'|-_'~#_)\@,d/1\m100*s'%+"This drought goat out of hand"?

Dùng thử trực tuyến

Phiên bản này được cả hai phần thưởng. Đầu vào phải có một dòng mới để giải pháp này hoạt động.

Cảm ơn @Martin Büttner vì đã lưu 2 byte.

Giải trình:

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

JavaScript (ES6), 45 (94 -15% -35)

Là một chức năng ẩn danh. Sử dụng các chuỗi mẫu, có một dòng mới có ý nghĩa và được bao gồm trong số byte

Chỉnh sửa 1 byte đã lưu 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'

Ít chơi gôn

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' 
)

Kiểm tra đoạn

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
Đoạn kiểm tra đẹp và mã tuyệt vời như mọi khi! Một gợi ý: Bạn có thể thay thế p=~ivới p=i, &&-pvới &&p-q1+~pđể 1+ptiết kiệm 1 byte.
dùng81655

@ user81655 gợi ý hay, cảm ơn
edc65

4

Mệnh giá , 57 * 85% - 35 = 13,45 byte

`This drought goat out of hand`r√″T┐↑⌐'~˦↑↔~÷Zx²*'%↔╡\z_g

Giải trình

`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 byte

bao gồm +1 cho -p

 $S[$w|=/~/]++}{$_=$w?100*$S[1]/$..'%':'This drought goat out of hand'

Với nhận xét:

$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%

  • Phiên bản 26 + 1 byte, không có tiền thưởng: 27

    $S[$w|=/~/]++}{$_=$S[1]/$.
    
  • Phiên bản 34 + 1 byte, với 15% tiền thưởng: 29,75

    $S[$w|=/~/]++}{$_=100*$S[1]/$..'%'
    
  • Phiên bản 61 + 1 byte, với phần thưởng -35: 27

    $S[$w|=/~/]++}{$_=$w?$S[1]/$.:'This drought goat out of hand'
    
  • Phiên bản 69 + 1 byte, cả hai phần thưởng: 24,50

    $S[$w|=/~/]++}{$_=$w?100*$S[1]/$..'%':'This drought goat out of hand'
    

2

Javascript, 59.3

Tôi hy vọng các vị trí thập phân thêm là OK. Giả sử không có dòng mới.

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

Haskell, 56 byte

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

Ví dụ sử dụng: f "| |\n|~~|\n| |\n|__|"-> 0.75.

llà một hàm độ dài tùy chỉnh, rất cần thiết, bởi vì việc xây dựng lengthtrả về các giá trị nguyên, nhưng chúng ta cần các giá trị dấu phẩy động cho phép chia ( genericLengthcũng có cung cấp tính năng này, nhưng nó dài hơn, chưa nói đến yêu cầu import Data.List). fchia đầu ivào thành các dòng (-> s) và sau đó thành một cặp trong đó phần tử đầu tiên là một danh sách với tất cả các dòng lên đến (và loại trừ) đầu tiên có một ~trong đó. Phần tử thứ hai là một danh sách với các dòng còn lại. Kết quả là chiều dài của phần tử thứ hai chia cho chiều dài của s.

Tiền thưởng không trả hết.


1

Python dài dòng!

Python: 98,45 byte

(157 * 0,85) - 35 = 98,45 byte

Phiên bản này đọc từ stdin và thu thập cả hai phần thưởng:

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 mà không có bất kỳ khoản thưởng nào:import sys;r=[x[1]for x in sys.stdin];print(1-r.index('~')/len(r))
Blender

Tốt đẹp! Điều đó được tăng gấp ba bởi dòng mới tùy chọn mặc dù, phải không? Ngoài ra, có phải Python 3 - chỉ vì toán tử chia?
Nicholas Clark

Các dòng mới tùy chọn là tùy thuộc vào bạn để bao gồm. Về phần, vâng, nhưng bạn đã xử lý printnhư một hàm nên tôi giả sử bạn đang sử dụng Python 3.
Blender

1

Awk, 72 ký tự - 15% - 35 = 26,2

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

Chạy mẫu:

(Ban đầu 1;chỉ được sử dụng trong các lần chạy mẫu này để hiển thị xe tăng có thể đọc được của con người.)

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 ký tự - 15% - 35 = 43,2

(88 ký tự trong hai khối mã + 4 ký tự tùy chọn dòng lệnh.)

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

Giả định error_reportingđược đặt thành mặc định.

(Không phải là một vấn đề lớn, chỉ muốn sử dụng -R-Emột lần. Bây giờ chỉ -Bcòn lại.)

Chạy mẫu:

(Ban đầu echo"$argn\n";chỉ được sử dụng trong các lần chạy mẫu này để hiển thị xe tăng có thể đọc được của con người.)

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 byte

{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}

Tôi đã tạo QBIC để làm cho QBasic cạnh tranh hơn, nhưng nó vẫn cần một số cải tiến. Cho đến bây giờ, không có phím tắt cho bẫy lỗi, THEN(đó là một sự giám sát khá lớn về phía tôi) và input$. Họ sẽ được thêm vào trong thời gian ngắn.

Tôi không thể đạt được tiền thưởng 0, quá tốn kém ... Tôi đã quản lý để in tỷ lệ phần trăm.

Mẫu trong / đầu ra:

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

Chương trình đọc đầu vào tương tác. Khi nó phát hiện đáy hồ (_ ), nó sẽ in tỷ lệ phần trăm và thoát. Đã thử nghiệm cho các container đầy đủ và những cái trống là tốt.

Chỉnh sửa: Để hiển thị cách QBIC đã được mở rộng trong năm ngoái, đây là chương trình tương tự được viết cho trình thông dịch hiện tại:

{_?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 byte, tỷ lệ phần trăm in, là một số điểm 74.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.