Quanta acqua è rimasta?


29

Qui in California, siamo in una siccità, quindi dobbiamo sapere quanta acqua ci rimane in modo da poter conservare quanta più acqua possibile.

Poiché l'acqua è limitata, il codice dovrà essere il più corto possibile.

Esempi

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

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

Output: 1
|  |
|__|

Output: 0 (or bonus)

specificazione

L'input sarà costituito esclusivamente da: |_ ~e newline. Tutti sopra quelli ~sono considerati aria; _, gli spazi sottostanti ~e ~sono considerati acqua. La percentuale di acqua rimasta è di computer water / (air + water). L'output deve essere accurato con 4 cifre decimali (a meno che non si scelga il bonus percentuale). L'input sarà sempre rettangolare. L' ~sarà solo su una sola riga, se in una qualsiasi. Se lo desideri, l'input può anche avere un feed di riga finale.

indennità

Se scegli entrambi i bonus, il bonus del -15% viene applicato prima del bonus di -35

Bonus di -35 byte: se il tuo codice stampa "Questa capra siccità sfuggita di mano", invece di 0 quando l'output è 0

-15% di bonus: se ottieni una percentuale.

Per fare ciò, dovresti spostare la posizione decimale di due posizioni a sinistra, tagliare gli zeri iniziali e aggiungere un %alla fine. Gli zeri finali (massimo 2) sono consentiti purché non influiscano sul valore. 0.5-> uno qualsiasi di:50.00% 50% 50.0%


28
" Dato che l'acqua ha una disponibilità limitata, il tuo codice dovrà essere il più breve possibile. "
Fatalizza il

14
@Fatalize: non è una conoscenza comune al di fuori dello stato, ma i computer basati sulla logica fluida sono estremamente popolari in California. Ho sentito che stanno cercando di vedere se riescono a trovare un'alternativa a base di mandorle in questi giorni.
Giovanni,

10
@JohnE che probabilmente spiega perché ora c'è una siccità
Hargasinski,

1
Voi sapete che i computer fluidici non consumano l'acqua, giusto? Proprio come i computer elettrici non causano carenza di elettroni.
user253751

È: |~~~|(nessun carattere di sottolineatura) input valido?
edc65,

Risposte:


16

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

Filtra l'input (con il nuovo #filtro meta-op!) Per una linea con ~dentro, quindi lo indicizza all'input e poi lo divide per la lunghezza dell'input. Se non ce ne sono ~, si verifica un errore e attiva la clausola tranne .xe stampa la stringa.

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

Provalo online qui .


10

Python 3, 37 byte

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

Nessun bonus. Accetta una stringa di input con newline, inclusa una newline finale.

Diamo un'occhiata al motivo per cui la formula funziona. La frazione di acqua è il complemento della frazione di aria, che deriveremo.

frac_water = 1 - frac_air

Numerando le righe 0, 1, 2, ..., abbiamo

frac_air = water_row_index / num_rows 

Lo stesso vale se entrambi vengono moltiplicati per la larghezza di ogni riga, contando le nuove righe, che semplificano le espressioni nel numero di caratteri.

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

L'inizio acqua fila si trova cercando la stringa di input xper |~, e il numero di caratteri è solo la lunghezza.

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

Infine, al fine di far funzionare gli ingressi senza acqua, aggiungiamo una fila di acqua fittizia dall'inizio |~alla fine prima della ricerca, il che fa sembrare che il livello dell'acqua sia 0.

I bonus non sembravano valerne la pena. Il migliore che ho ottenuto su quello di stringa è 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"?

Provalo online

Questa versione ottiene entrambi i bonus. L'input deve avere una nuova riga finale affinché questa soluzione funzioni.

Grazie a @Martin Büttner per aver salvato 2 byte.

Spiegazione:

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)

Come una funzione anonima. Utilizzando le stringhe di modello, esiste una nuova riga significativa e inclusa nel conteggio dei byte

Modifica 1 byte salvato 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'

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

Snippet di prova

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
Bellissimo frammento di prova e ottimo codice come sempre! Un suggerimento: È possibile sostituire p=~icon p=i, &&-pcon &&p-qe 1+~pper 1+psalvare 1 byte.
user81655

@ user81655 bel suggerimento, grazie
edc65

4

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

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

Spiegazione

`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

include +1 per -p

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

Con commenti:

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

  • Versione 26 + 1 byte, nessun bonus: 27

    $S[$w|=/~/]++}{$_=$S[1]/$.
    
  • Versione 34 + 1 byte, con bonus del 15%: 29.75

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

    $S[$w|=/~/]++}{$_=$w?$S[1]/$.:'This drought goat out of hand'
    
  • Versione 69 + 1 byte, entrambi i bonus: 24.50

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

2

Javascript, 59.3

Spero che i decimali extra siano OK. Non presuppone che la nuova riga finale.

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

Esempio di utilizzo: f "| |\n|~~|\n| |\n|__|"-> 0.75.

lè una funzione di lunghezza personalizzata, necessaria perché build in lengthrestituisce valori interi, ma abbiamo bisogno di valori in virgola mobile per la divisione ( genericLengthche fornisce anche questa funzione, ma è più lunga, per non parlare del necessario import Data.List). fdivide l'input iin righe (-> s) e quindi in una coppia in cui il primo elemento è un elenco con tutte le righe fino a (ed escluso) il primo con a ~in esso. Il secondo elemento è un elenco con il resto delle righe. Il risultato è la lunghezza del secondo elemento divisa per la lunghezza di s.

I bonus non pagano.


1

Python è prolisso!

Python: 98,45 byte

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

Questa versione legge da stdin e raccoglie entrambi i 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)

2
66 senza alcun bonus:import sys;r=[x[1]for x in sys.stdin];print(1-r.index('~')/len(r))
Blender il

Bello! Ciò viene comunque innescato dalla nuova riga finale opzionale, non è vero? Inoltre, è Python 3 solo a causa dell'operatore di divisione?
Nicholas Clark,

La nuova riga finale opzionale spetta a te includere. Per quanto riguarda la divisione, sì, ma stai già trattando printcome una funzione, quindi ho pensato che stavi usando Python 3.
Blender il

1

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

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

Esecuzione di esempio:

(Iniziale 1;utilizzato solo in queste serie di esempi per visualizzare il serbatoio "leggibile dall'uomo".)

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 caratteri - 15% - 35 = 43,2

(88 caratteri in due blocchi di codice + 4 caratteri opzioni della riga di comando.)

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

Presuppone error_reportingè impostato sul valore predefinito.

(Non è un grosso problema, volevo solo usare il -Re -Euna volta. Ora solo -Blasciato.)

Esecuzione di esempio:

(Iniziale echo"$argn\n";utilizzato solo in queste serie di esempi per visualizzare il serbatoio "leggibile dall'uomo".)

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}

Ho creato QBIC per rendere QBasic più competitivo, ma necessita ancora di numerosi miglioramenti. A partire da ora, non ci sono scorciatoie per il trapping degli errori THEN(che è una svista abbastanza grande da parte mia) e input$. Saranno aggiunti a breve.

Non riuscivo a ottenere il bonus 0, troppo costoso ... Sono riuscito a stampare le percentuali.

Esempio di ingresso / uscita:

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

Il programma legge l'input in modo interattivo. Quando rileva il fondo del lago ( _) stampa la percentuale e si chiude. Testato per contenitori pieni e anche vuoti.

Modifica: per mostrare come QBIC è stato ampliato nell'ultimo anno, ecco lo stesso programma scritto per l'interprete attuale:

{_?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, percentuale di stampa, è un punteggio di 74.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.