Berapa banyak air yang tersisa?

29

Di sini, di California, kita sedang mengalami kekeringan sehingga kita perlu tahu berapa banyak air yang tersisa sehingga kita dapat menghemat air sebanyak mungkin.

Karena persediaan air terbatas, kode Anda harus sesingkat mungkin.

Contohnya

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

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

Output: 1
|  |
|__|

Output: 0 (or bonus)

Spesifikasi

Input hanya akan terdiri dari semua: |_ ~dan baris baru. Semua di atas ~dianggap udara; _, ruang di bawah ~, dan ~itu sendiri dianggap air. Persentase air yang tersisa adalah komputer water / (air + water). Output Anda harus akurat hingga 4 tempat desimal (kecuali Anda memilih bonus persen) Input akan selalu berbentuk persegi panjang. Hanya ~akan berada di satu baris, jika ada. Input secara opsional dapat juga memiliki umpan garis tambahan jika Anda mau.

Bonus

Jika Anda memilih kedua bonus, bonus -15% diterapkan sebelum bonus -35

-35 byte Bonus: Jika kode Anda mencetak " kambing kekeringan ini keluar dari tangan", bukannya 0 ketika Output adalah 0

-15% Bonus: Jika Anda menghasilkan persen.

Untuk melakukan ini, Anda akan menggeser tempat desimal dua tempat ke kiri, memotong nol di depan, dan menambahkan a %ke ujung. Nol trailing (maks 2) dibolehkan selama tidak mempengaruhi nilainya. 0.5-> salah satu dari:50.00% 50% 50.0%

Downgoat
sumber
28
" Karena persediaan air terbatas, kode Anda harus sesingkat mungkin. " Uhhh oke, masuk akal ... kurasa?
Fatalkan
14
@Fatalize: Ini bukan pengetahuan umum di luar negara bagian, tetapi komputer berbasis logika yang mengalir sangat populer di California. Saya dengar mereka berusaha melihat apakah mereka dapat menemukan alternatif berbasis almond akhir-akhir ini.
JohnE
10
@ JohnE yang mungkin menjelaskan mengapa ada kekeringan di sana sekarang
hargasinski
1
Kalian tahu bahwa komputer yang mengalir tidak menggunakan air, bukan? Sama seperti komputer listrik tidak menyebabkan kekurangan elektron.
user253751
Apakah ini: |~~~|(tidak ada garis bawah) input yang valid?
edc65

Jawaban:

16

Pyth - 17 46 45 52 * .85 - 35 = 9,2 byte

Memfilter input (Dengan #meta-op filter baru !) Untuk sebuah baris dengan ~di dalamnya, kemudian mengindeks itu ke input, dan kemudian membaginya dengan panjang input. Jika tidak ada dengan ~, itu kesalahan, dan memicu klausa kecuali .xdan mencetak string.

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

Cobalah online di sini .

Maltysen
sumber
10

Python 3, 37 byte

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

Tidak ada bonus. Mengambil string input dengan baris baru, termasuk baris tambahan.

Mari kita lihat mengapa formula ini bekerja. Fraksi air adalah pelengkap fraksi udara, yang akan kita peroleh.

frac_water = 1 - frac_air

Penomoran baris 0, 1, 2, ..., kita miliki

frac_air = water_row_index / num_rows 

Hal yang sama berlaku jika keduanya dikalikan dengan lebar setiap baris, menghitung baris baru, yang menyederhanakan ekspresi dalam jumlah karakter.

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

Baris air mulai ditemukan dengan mencari string masukan xuntuk |~, dan jumlah karakter hanya panjang.

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

Akhirnya, agar input tanpa air berfungsi, kami menambahkan baris air fiksi mulai |~dari akhir sebelum pencarian, yang membuatnya terlihat seperti level air 0.

Bonus tampaknya tidak sepadan. Yang terbaik yang saya dapatkan pada string adalah 73-35 = 38:

lambda x:['This drought goat out of hand',1-x.find('|~')/len(x)]['~'in x]
Tidak
sumber
7

CJam, 19 17 16 58 * 0,85 - 35 = 14,3 byte

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

Cobalah online

Versi ini mendapatkan kedua bonus. Input harus memiliki garis belakang tambahan agar solusi ini berfungsi.

Terima kasih kepada @Martin Büttner karena telah menghemat 2 byte.

Penjelasan:

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.
Reto Koradi
sumber
5

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

Sebagai fungsi anonim. Menggunakan string template, ada baris baru yang signifikan dan termasuk dalam jumlah byte

Edit 1 byte disimpan 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'

Kurang golf

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

Cuplikan tes

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>

edc65
sumber
1
Cuplikan uji yang indah dan kode yang bagus seperti biasa! Satu saran: Anda bisa mengganti p=~idengan p=i, &&-pdengan &&p-qdan 1+~puntuk 1+pmenyimpan 1 byte.
user81655
@ user81655 saran yang bagus, terima kasih
edc65
4

Par , 57 * 85% - 35 = 13,45 byte

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

Penjelasan

`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
Ypnypn
sumber
3

Perl, 70 - 15% - 35 = 24,5 byte

termasuk +1 untuk -p

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

Dengan komentar:

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

  • Versi 26 + 1 byte, tanpa bonus: 27

    $S[$w|=/~/]++}{$_=$S[1]/$.
    
  • Versi 34 + 1 byte, dengan bonus 15%: 29,75

    $S[$w|=/~/]++}{$_=100*$S[1]/$..'%'
    
  • Versi 61 + 1 byte, dengan -35 bonus: 27

    $S[$w|=/~/]++}{$_=$w?$S[1]/$.:'This drought goat out of hand'
    
  • Versi 69 + 1 byte, keduanya bonus: 24,50

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

Javascript, 59.3

Saya berharap tempat desimal tambahan baik-baik saja. Diasumsikan tidak ada trailing newline.

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>

DankMemes
sumber
1

Haskell, 56 byte

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

Contoh penggunaan: f "| |\n|~~|\n| |\n|__|"-> 0.75.

ladalah fungsi panjang kustom, yang diperlukan, karena build lengthmengembalikan nilai integer, tetapi kita perlu nilai floating point untuk divisi (ada genericLengthyang juga menyediakan fitur ini, tetapi lebih lama, apalagi yang diperlukan import Data.List). fmembagi input imenjadi garis (-> s) dan kemudian menjadi pasangan di mana elemen pertama adalah daftar dengan semua garis hingga (dan tidak termasuk) yang pertama dengan ~di dalamnya. Elemen kedua adalah daftar dengan sisa baris. Hasilnya adalah panjang elemen kedua dibagi dengan panjang s.

Bonus tidak membuahkan hasil.

nimi
sumber
1

Python adalah kata kerja!

Python: 98,45 byte

(157 * 0.85) - 35 = 98.45 byte

Versi ini membaca dari stdin, dan mengumpulkan kedua bonus:

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)
Nicholas Clark
sumber
2
66 tanpa bonus apa pun:import sys;r=[x[1]for x in sys.stdin];print(1-r.index('~')/len(r))
Blender
Bagus! Namun itu tersandung oleh opsional trailing newline, bukan? Juga, apakah hanya Python 3 karena operator divisi?
Nicholas Clark
Baris tambahan tambahan opsional dapat Anda sertakan. Adapun divisi, ya, tapi Anda sudah memperlakukan printseperti fungsi jadi saya menganggap Anda menggunakan Python 3.
Blender
1

Awk, 72 karakter - 15% - 35 = 26.2

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

Contoh dijalankan:

(Awal 1;hanya digunakan dalam menjalankan sampel ini untuk menampilkan tangki "dibaca manusia".)

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%
manatwork
sumber
1

PHP, 92 karakter - 15% - 35 = 43.2

(88 karakter dalam dua blok kode + 4 opsi opsi baris perintah.)

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

Asumsi error_reportingdiatur ke default.

(Bukan masalah besar, hanya ingin menggunakan -Rdan -Esekali. Sekarang tinggal -Bpergi.)

Contoh dijalankan:

(Awal echo"$argn\n";hanya digunakan dalam menjalankan sampel ini untuk menampilkan tangki "dibaca manusia".)

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%
manatwork
sumber
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}

Saya telah menciptakan QBIC untuk membuat QBasic lebih kompetitif, tetapi masih perlu beberapa perbaikan. Sampai sekarang, tidak ada jalan pintas untuk menjebak kesalahan, THEN(yang merupakan pengawasan yang cukup besar di pihak saya) dan input$. Mereka akan ditambahkan segera.

Saya tidak bisa mendapatkan bonus 0, terlalu mahal ... Saya berhasil mencetak persentase.

Sampel dalam / output:

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

Program membaca input secara interaktif. Ketika mendeteksi dasar danau ( _) ia mencetak persentase dan berhenti. Diuji untuk kontainer penuh dan yang kosong juga.

Sunting: Untuk menunjukkan bagaimana QBIC telah diperluas selama setahun terakhir, inilah program yang sama yang ditulis untuk penerjemah saat ini:

{_?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, persentase pencetakan, adalah skor 74.

steenbergh
sumber