Wie viel Wasser ist noch übrig?

29

Hier in Kalifornien sind wir in einer Dürre, daher müssen wir wissen, wie viel Wasser wir noch haben, damit wir so viel Wasser wie möglich sparen können.

Da die Wasserversorgung begrenzt ist, muss Ihr Code so kurz wie möglich sein.

Beispiele

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

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

Output: 1
|  |
|__|

Output: 0 (or bonus)

Spezifikation

Die Eingabe besteht ausschließlich aus: |_ ~und Zeilenumbrüchen. Alle oben genannten ~gelten als Luft; _Räume darunter ~und ~selbst gelten als Wasser. Der Prozentsatz des verbleibenden Wassers stammt vom Computer water / (air + water). Ihre Ausgabe muss auf 4 Dezimalstellen genau sein (es sei denn, Sie streben den Prozentbonus an). Die Eingabe ist immer rechteckig. Das ~steht nur in einer Zeile, wenn überhaupt. Die Eingabe kann optional auch einen nachgestellten Zeilenvorschub enthalten.

Bonus

Wenn Sie sich für beide Boni entscheiden, wird der Bonus von -15% vor dem Bonus von -35 angewendet

-35 byte Bonus: Wenn Ihr Code "This drought goat out of hand" anstelle von 0 ausgibt, wenn die Ausgabe 0 ist

-15% Bonus: Wenn Sie ein Prozent ausgeben.

Dazu verschieben Sie die Dezimalstelle um zwei Stellen nach links, kürzen führende Nullen und fügen %am Ende ein hinzu. Nachgestellte Nullen (max. 2) sind zulässig, solange sie den Wert nicht beeinflussen. 0.5-> eines von:50.00% 50% 50.0%

Downgoat
quelle
28
" Weil die Wasserversorgung begrenzt ist, muss Ihr Code so kurz wie möglich sein. "
Fatalize
14
@Fatalize: Außerhalb des Staates ist das nicht allgemein bekannt, aber Computer auf der Basis von Fluidic Logic sind in Kalifornien äußerst beliebt. Ich höre, sie versuchen zu sehen, ob sie heutzutage eine mandelbasierte Alternative finden können.
JohnE
10
@ JohnE das erklärt wahrscheinlich, warum es dort jetzt eine Dürre gibt
Hargasinski
1
Ihr Jungs wissen , dass fluidischen Computer nicht aufbrauchen Wasser, nicht wahr? Genauso wie elektrische Computer keinen Elektronenmangel verursachen.
user253751
Ist dies: |~~~|(kein Unterstrich) gültige Eingabe?
EDC65

Antworten:

16

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

Filtert die Eingabe (mit dem neuen #Filter Meta-Op!) Nach einer Zeile mit ~darin, indiziert diese dann für die Eingabe und dividiert diese durch die Länge der Eingabe. Wenn keine vorhanden sind ~, wird der Fehler gemeldet und die except-Klausel von ausgelöst, und .xdie Zeichenfolge wird gedruckt.

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

Probieren Sie es hier online aus .

Maltysen
quelle
10

Python 3, 37 Bytes

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

Keine Prämien. Nimmt eine Eingabezeichenfolge mit Zeilenumbrüchen an, einschließlich einer nachgestellten Zeile.

Schauen wir uns an, warum die Formel funktioniert. Die Wasserfraktion ist das Komplement der Luftfraktion, die wir ableiten werden.

frac_water = 1 - frac_air

0, 1, 2, ...Wir haben die Reihen nummeriert

frac_air = water_row_index / num_rows 

Dasselbe gilt, wenn beide mit der Breite jeder Zeile multipliziert werden, wobei die Zeilenumbrüche gezählt werden, was Ausdrücke in der Anzahl der Zeichen vereinfacht.

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

Der Wasserzeilenstart wird durch Durchsuchen der Eingabezeichenfolge gefunden xfür |~, und die Anzahl der Zeichen ist nur die Länge.

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

Zum Schluss fügen wir einen fiktiven Wasserreihenstart hinzu, damit kein Wasser eingespeist werden kann |~ vor der Suche an das Ende angehängt, sodass der Wasserstand 0 zu sein scheint.

Die Boni schienen es nicht wert zu sein. Das Beste, was ich an der Saite bekommen habe, ist 73-35 = 38:

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

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

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

Probieren Sie es online aus

Diese Version erhält beide Boni. Die Eingabe muss mit einem nachgestellten Zeilenumbruch versehen sein, damit diese Lösung funktioniert.

Vielen Dank an @Martin Büttner für die Einsparung von 2 Bytes.

Erläuterung:

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
quelle
5

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

Als anonyme Funktion. Unter Verwendung von Vorlagenzeichenfolgen gibt es eine Zeilenvorschubzeile, die wichtig ist und in der Byteanzahl enthalten ist

Bearbeite 1 Byte gespeichert dank @ user81655

p=>p.split`
`.map((r,i)=>r>'|~'?p=i:q=~i)&&q-p?(1+p/q)*100+'%':'This drought goat out of hand'

Weniger golfen

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

Testschnipsel

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
quelle
1
Wunderschönes Test-Snippet und großartiger Code wie immer! Ein Vorschlag: Man könnte ersetzen p=~imit p=i, &&-pmit &&p-qund 1+~pauf 1+p1 Byte zu speichern.
user81655
@ user81655 netter vorschlag, danke
edc65
4

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

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

Erläuterung

`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
quelle
3

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

beinhaltet +1 für -p

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

Mit Kommentaren:

$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 Byte Version, kein Bonus: 27

    $S[$w|=/~/]++}{$_=$S[1]/$.
    
  • 34 + 1-Byte-Version mit 15% Bonus: 29,75

    $S[$w|=/~/]++}{$_=100*$S[1]/$..'%'
    
  • 61 + 1-Byte-Version mit -35 Bonus: 27

    $S[$w|=/~/]++}{$_=$w?$S[1]/$.:'This drought goat out of hand'
    
  • 69 + 1-Byte-Version, beide Boni: 24,50

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

Javascript, 59.3

Ich hoffe, dass zusätzliche Dezimalstellen in Ordnung sind. Nimmt keine nachgestellte Newline an.

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
quelle
1

Haskell, 56 Bytes

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

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

list eine benutzerdefinierte Längenfunktion, die erforderlich ist, da das Build-In lengthganzzahlige Werte zurückgibt, wir jedoch Gleitkommawerte für die Division benötigen (es gibt genericLengthauch diese Funktion, aber sie ist länger, geschweige denn die erforderliche import Data.List). fTeilt die Eingabe iin Zeilen (-> s) und dann in ein Paar, wobei das erste Element eine Liste mit allen Zeilen bis (und mit Ausnahme) der ersten Zeile mit einem ~darin ist. Das zweite Element ist eine Liste mit den restlichen Zeilen. Das Ergebnis ist die Länge des zweiten Elements geteilt durch die Länge vons .

Die Boni zahlen sich nicht aus.

nimi
quelle
1

Python ist wortreich!

Python: 98,45 Bytes

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

Diese Version liest von stdin und sammelt beide Boni:

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
quelle
2
66 ohne Boni:import sys;r=[x[1]for x in sys.stdin];print(1-r.index('~')/len(r))
Blender
Nett! Das wird aber durch den optionalen abschließenden Zeilenumbruch ausgelöst, oder? Ist es wegen des Divisionsoperators auch nur Python 3?
Nicholas Clark
Die optionale abschließende Newline können Sie selbst einbeziehen. Was die Division betrifft, ja, aber Sie behandeln sie bereits printwie eine Funktion, und ich nahm an, dass Sie Python 3 verwenden.
Blender
1

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

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

Probelauf:

(Initiale 1; nur in diesen Probeläufen verwendet, um den "vom Menschen lesbaren" Tank anzuzeigen.)

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%
Mann bei der Arbeit
quelle
1

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

(88 Zeichen in zwei Codeblöcken + 4 Zeichen in der Befehlszeile)

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

Geht davon aus error_reporting ist auf Standard gesetzt.

(Keine große Sache, wollte nur das -Rund benutzen-E einmal . Jetzt nur-B übrig.)

Probelauf:

(Anfänglichecho"$argn\n"; nur in diesen Probeläufen verwendet, um den "vom Menschen lesbaren" Tank anzuzeigen.)

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%
Mann bei der Arbeit
quelle
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}

Ich habe QBIC entwickelt, um QBasic wettbewerbsfähiger zu machen, aber es bedarf noch einiger Verbesserungen. Ab sofort gibt es keine Abkürzungen für die Fehlerbehebung.THEN (was für mich ein ziemlich großes Versehen ist) und input$. Sie werden in Kürze hinzugefügt.

Ich konnte den 0-Bonus nicht knacken, zu teuer ... Ich habe es geschafft, Prozentsätze zu drucken.

Probe ein / ausgeben:

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

Das Programm liest die Eingabe interaktiv. Wenn der Grund des Sees _erkannt wird ( ), wird der Prozentsatz gedruckt und der Vorgang beendet. Auf volle und leere Container getestet.

Bearbeiten: Um zu zeigen, wie QBIC im letzten Jahr erweitert wurde, ist hier das gleiche Programm für den aktuellen Interpreter geschrieben:

{_?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 Bytes (Druckprozentsätze) ergeben eine Punktzahl von 74.

steenbergh
quelle