Ile wody zostało?

29

Tutaj, w Kalifornii, mamy suszę, więc musimy wiedzieć, ile wody nam pozostało, abyśmy mogli zaoszczędzić jak najwięcej wody.

Ponieważ ilość wody jest ograniczona, twój kod będzie musiał być jak najkrótszy.

Przykłady

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

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

Output: 1
|  |
|__|

Output: 0 (or bonus)

Specyfikacja

Dane wejściowe będą składały się wyłącznie ze wszystkich: |_ ~i nowych linii. Wszystkie powyższe ~są uważane za powietrze; _, przestrzenie poniżej ~i ~same w sobie są uważane za wodę. Procent pozostałej wody to komputer water / (air + water). Twój wynik musi być dokładny do 4 miejsc po przecinku (chyba że wybierzesz premię procentową). Wejście zawsze będzie prostokątne. ~Będzie tylko na jednej linii, jeśli na dowolny. Jeśli chcesz, dane wejściowe mogą opcjonalnie zawierać także wiersz końcowy.

Premia

Jeśli wybierzesz oba bonusy, premia -15% zostanie zastosowana przed premią -35

-35 bajtów Premia: Jeśli kod wypisuje „Ta koza suszy z ręki”, zamiast 0, gdy wyjście ma wartość 0

-15% Premia: Jeśli wydasz procent.

Aby to zrobić, należy przesunąć miejsce dziesiętne o dwa miejsca w lewo, przyciąć początkowe zera i dodać %na końcu. Zera końcowe (maks. 2) są dozwolone, o ile nie wpływają na wartość. 0.5-> dowolny z:50.00% 50% 50.0%

Downgoat
źródło
28
Ponieważ woda ma ograniczone zapasy, twój kod będzie musiał być jak najkrótszy. ” Ech, w porządku, ma sens… tak myślę?
Fatalize
14
@Fatalize: Poza stanem wiedza nie jest powszechna, ale komputery oparte na logice płynów są niezwykle popularne w Kalifornii. Słyszałem, że starają się obecnie sprawdzić, czy uda im się wypracować alternatywę na bazie migdałów.
JohnE,
10
@JohnE, co prawdopodobnie wyjaśnia, dlaczego teraz jest tam susza
hargasinski,
1
Wiecie, że komputery z płynami nie zużywają wody, prawda? Podobnie jak komputery elektryczne nie powodują niedoborów elektronów.
user253751,
Czy to: |~~~|(brak podkreślenia) prawidłowe dane wejściowe?
edc65,

Odpowiedzi:

16

Pyth - 17 46 45 52 * .85 - 35 = 9,2 bajtów

Filtruje dane wejściowe (z nowym #meta-op!) Dla linii z ~nim zawartej, następnie indeksuje je do danych wejściowych, a następnie dzieli je przez długość danych wejściowych. Jeśli nie ma żadnych ~, powoduje to błąd i wyzwala klauzulę wyjątku .xi wypisuje ciąg.

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

Wypróbuj online tutaj .

Maltysen
źródło
10

Python 3, 37 bajtów

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

Brak bonusów. Pobiera ciąg wejściowy z nowymi liniami, w tym końcowymi nowymi liniami.

Zobaczmy, dlaczego formuła działa. Ułamek wody stanowi uzupełnienie ułamka powietrza, który otrzymamy.

frac_water = 1 - frac_air

0, 1, 2, ...Mamy numerację rzędów

frac_air = water_row_index / num_rows 

To samo dotyczy sytuacji, gdy oba są pomnożone przez szerokość każdego wiersza, licząc znaki nowego wiersza, które upraszczają wyrażenia w liczbie znaków.

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

Początek wiersz woda znajduje wyszukując ciąg wejściowy xdla |~, a liczba znaków jest tylko długość.

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

Na koniec, aby umożliwić wejście bez wody, dołączamy fikcyjny początek rzędu wody |~przed zakończeniem wyszukiwania, co sprawia, że ​​wygląda na to, że poziom wody wynosi 0.

Bonusy wydawały się nie warte zachodu. Najlepsze, co mam na pierwszym ciągu, to 73-35 = 38:

lambda x:['This drought goat out of hand',1-x.find('|~')/len(x)]['~'in x]
xnor
źródło
7

CJam, 19 17 16 58 * 0,85 - 35 = 14,3 bajtów

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

Wypróbuj online

Ta wersja otrzymuje oba bonusy. Dane wejściowe muszą mieć końcowy znak nowej linii, aby to rozwiązanie działało.

Dzięki @Martin Büttner za oszczędność 2 bajtów.

Wyjaśnienie:

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
źródło
5

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

Jako funkcja anonimowa. Używając ciągów szablonów, nowa linia jest znacząca i jest uwzględniona w liczbie bajtów

Edytuj 1 bajt zapisany 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'

Mniej golfa

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

Testowy fragment kodu

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
źródło
1
Piękny fragment testowy i świetny kod jak zawsze! Jedna z propozycji: Można wymienić p=~iz p=i, &&-pz &&p-qi 1+~pdo 1+pzaoszczędzić 1 bajt.
user81655,
@ user81655 fajna sugestia, dzięki
edc65
4

Par , 57 * 85% - 35 = 13,45 bajtów

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

Wyjaśnienie

`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
źródło
3

Perl, 70-15% - 35 = 24,5 bajtów

zawiera +1 dla -p

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

Z komentarzami:

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

  • Wersja 26 + 1 bajtów, bez premii: 27

    $S[$w|=/~/]++}{$_=$S[1]/$.
    
  • Wersja 34 + 1 bajtowa, z 15% premią: 29,75

    $S[$w|=/~/]++}{$_=100*$S[1]/$..'%'
    
  • Wersja 61 + 1 bajtowa, z premią -35: 27

    $S[$w|=/~/]++}{$_=$w?$S[1]/$.:'This drought goat out of hand'
    
  • Wersja 69 + 1 bajtowa, oba bonusy: 24,50

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

JavaScript, 59,3

Mam nadzieję, że dodatkowe miejsca po przecinku są OK. Nie zakłada końca nowej linii.

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
źródło
1

Haskell, 56 bajtów

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

Przykład użycia: f "| |\n|~~|\n| |\n|__|"-> 0.75.

ljest funkcją o niestandardowej długości, która jest niezbędna, ponieważ wbudowana funkcja lengthzwraca wartości całkowite, ale potrzebujemy wartości zmiennoprzecinkowych do podziału (istnieje genericLengthrównież ta funkcja, ale jest ona dłuższa, nie mówiąc już o wymaganym import Data.List). fdzieli dane wejściowe ina linie (-> s), a następnie na parę, w której pierwszy element jest listą ze wszystkimi liniami do (i z wyłączeniem) pierwszego z literą ~w nim. Drugi element to lista z resztą wierszy. Wynikiem jest długość drugiego elementu podzielona przez długość s.

Bonusy się nie opłaca.

nimi
źródło
1

Python jest pełny!

Python: 98,45 bajtów

(157 * 0,85) - 35 = 98,45 bajtów

Ta wersja czyta ze standardowego wejścia i zbiera oba bonusy:

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
źródło
2
66 bez żadnych bonusów:import sys;r=[x[1]for x in sys.stdin];print(1-r.index('~')/len(r))
Blender
Miły! Potrafi się to jednak potknąć opcjonalnym końcowym znakiem nowej linii, prawda? Czy jest to tylko Python 3 z powodu operatora dzielenia?
Nicholas Clark,
Opcjonalny końcowy znak nowej linii zależy od Ciebie. Jeśli chodzi o podział, tak, ale już traktujesz printjak funkcję, więc założyłem, że używasz Python 3.
Blender
1

Awk, 72 znaki - 15% - 35 = 26,2

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

Przykładowy przebieg:

(Początkowo 1;używany tylko w tych próbkach, aby wyświetlić zbiornik „czytelny dla człowieka”).

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%
człowiek w pracy
źródło
1

PHP, 92 znaki - 15% - 35 = 43,2

(88 znaków w dwóch blokach kodu + 4 znaki opcji wiersza poleceń).

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

Zakłada się, że error_reportingjest ustawiona domyślnie.

(Nie jest to wielka sprawa, po prostu chciałem użyć -Ri -Eraz. Teraz tylko -Bzostało.)

Przykładowy przebieg:

(Początkowo echo"$argn\n";używany tylko w tych próbkach, aby wyświetlić zbiornik „czytelny dla człowieka”).

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%
człowiek w pracy
źródło
0

QBIC - 116-15 % = 98,6 bajtów

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

Stworzyłem QBIC, aby QBasic był bardziej konkurencyjny, ale nadal wymaga kilku ulepszeń. Na chwilę obecną nie ma skrótów do pułapkowania błędów THEN(co jest dość dużym niedopatrzeniem z mojej strony) i input$. Zostaną dodane wkrótce.

Nie mogłem trafić do premii 0, zbyt kosztowne ... Udało mi się wydrukować procenty.

Przykładowe wejście / wyjście:

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

Program odczytuje dane wejściowe interaktywnie. Po wykryciu dna jeziora ( _) drukuje procent i wychodzi. Testowane na pełne i puste pojemniki.

Edycja: Aby pokazać, w jaki sposób QBIC został rozszerzony w ciągu ostatniego roku, oto ten sam program napisany dla bieżącego tłumacza:

{_?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 bajtów, procent drukowania, to wynik 74.

Steenbergh
źródło