Ne kadar su kaldı?


29

Burada Kaliforniya'da kuraklıktayız, bu yüzden ne kadar su kaldığını bilmemiz gerekir, böylece mümkün olduğunca fazla su tasarrufu yapabiliriz.

Su temini sınırlı olduğundan, kodunuzun mümkün olduğunca kısa olması gerekecektir.

Örnekler

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

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

Output: 1
|  |
|__|

Output: 0 (or bonus)

Şartname

Girdi yalnızca hepsinden oluşacaktır: |_ ~ve yeni satırlar. Yukarıda ~her şey hava olarak kabul edilir; _, aşağıdaki boşluklar ~ve ~kendisi su olarak kabul edilir. Kalan su yüzdesi bilgisayardır water / (air + water). Çıktınızın 4 ondalık basamağa kadar doğru olması gerekir (yüzde bonusu almadığınız sürece). Giriş her zaman dikdörtgen olacaktır. ~Herhangi keşke, tek bir satırda olacaktır. İsteğe bağlı olarak, giriş isteğe bağlı olarak bir izleyen satır beslemesine de sahip olabilir.

Bonus

Her iki bonus için de giderseniz, -35% 'den önce% -15 bonus uygulanır

-35 byte Bonus: Eğer kodunuz Çıktı 0 iken 0 yerine "Bu kuraklık keçiyi elden çıkarır " yazıyorsa

-15% Bonus: Eğer bir yüzde verirseniz.

Bunu yapmak için, ondalık basamağı iki basamak sola kaydırın, baştaki sıfırları %kesin ve sonuna bir a ekleyin . Sondaki sıfırlar (en fazla 2), değeri etkilemedikleri sürece izin verir. 0.5-> herhangi biri:50.00% 50% 50.0%


28
Su kaynağı sınırlı olduğu için, kodunuzun mümkün olduğunca kısa olması gerekecek. ” Tamam, mantıklı ... Sanırım?
Aralık’ta

14
@Fatalize: Devlet dışında yaygın bir bilgi değildir, ancak akışkan mantık tabanlı bilgisayarlar Kaliforniya'da oldukça popülerdir. Bugünlerde badem temelli bir alternatif bulabileceklerini görmeye çalıştıklarını duydum.
JohnE

10
@JohnE muhtemelen şu anda neden bir kuraklık olduğunu açıklıyor
hargasinski

1
Akışkan bilgisayarların su kullanmadığını biliyorsunuz , değil mi? Tıpkı elektrikli bilgisayarların elektron kıtlığına neden olmaması gibi.
kullanıcı253751

Bu: |~~~|(alt çizgi yok) geçerli girdi mi?
edc65

Yanıtlar:


16

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

İçinde #bir satır için girişi (yeni filtre meta-op ile birlikte!) Filtreler ~, sonra bunu girişe endeksler ve sonra bunu girişin uzunluğuna böler. ~İçinde hiçbiri yoksa, hata verir ve istisna yan tümcesini tetikler .xve dizeyi yazdırır.

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

Burada çevrimiçi deneyin .


10

Python 3, 37 bayt

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

Bonus yok. İzleyen bir yeni satır dahil, yeni satırlı bir girdi dizesi alır.

Formülün neden çalıştığına bir bakalım. Suyun kesri, türeteceğimiz hava kesiminin tamamlayıcısıdır.

frac_water = 1 - frac_air

Satırları Numaralandırma 0, 1, 2, ..., elimizdeki

frac_air = water_row_index / num_rows 

Her ikisi de her satırın genişliği ile çarpılırsa, karakter sayısındaki ifadeleri basitleştiren yeni satırları sayarak aynı şey geçerlidir.

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

Su satır başlangıç giriş dizesi arayarak bulunursa xiçin |~ve karakter sayısı sadece uzunluğudur.

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

Son olarak, su girişi olmamasını sağlamak için, |~aramadan önce sonuna kadar başlayan ve su seviyesi 0 gibi görünmesini sağlayan kurgusal bir su sırası ekleriz .

Bonuslar buna değmez gibiydi. İpte en iyisi 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 bayt

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

Çevrimiçi deneyin

Bu sürüm iki ikramiye alır. Bu çözümün çalışması için girdi , takip eden bir yeni hatta sahip olmalıdır .

2 byte tasarruf için @Martin Büttner sayesinde.

Açıklama:

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)

Anonim bir işlev olarak. Şablon dizgilerini kullanarak, önemli olan ve bayt sayısına dahil edilen yeni bir satır var.

Düzenle 1 byte kaydedilen 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'

Daha az golf oynadı

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

Test pasajı

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
Güzel test pasajı ve her zaman olduğu gibi harika kod! Bir öneri: Sen yerini alabilir p=~iile p=i, &&-pbirlikte &&p-qve 1+~phiç 1+p1 bayt kaydedin.
user81655 21:15

@ user81655 güzel öneri, teşekkürler
edc65

4

Par , 57 * 85% - 35 = 13.45 bayt

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

açıklama

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

için +1 içerir -p

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

Yorumlarla:

$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 versiyonu, bonus yok: 27

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

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

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

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

2

Javascript, 59.3

Umarım ekstra ondalık basamaklar iyidir. Sonunda hiçbir yeni satır olmadığını varsayar.

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 bayt

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

Kullanım örneği: f "| |\n|~~|\n| |\n|__|"-> 0.75.

lbu, özel bir uzunluk işlevidir, çünkü yapı, lengthtamsayı değerlerini döndürür, ancak bölme için kayan nokta değerlerine ihtiyacımız vardır ( genericLengthbu özelliği de sağlayan, ancak daha uzun, gerekli olması gerekir import Data.List). fgirişi isatırlara (-> s) ve ardından ilk elemanın içinde bir satır bulunan tüm satırları içeren bir liste olduğu (ve hariç bırakılan) bir çifte böler ~. İkinci öğe, kalan satırları içeren bir listedir. Sonuç, ikinci elemanın uzunluğunun bölüs .

Bonuslar işe yaramaz.


1

Python ayrıntılıdır!

Python: 98.45 bayt

(157 x 0.85) - 35 = 98.45 bayt

Bu sürüm stdin'den okur ve her iki bonusu toplar:

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
Herhangi bir bonus olmadan 66:import sys;r=[x[1]for x in sys.stdin];print(1-r.index('~')/len(r))
Blender

Güzel! Bu isteğe bağlı takip eden yeni hatta tetiklenir, öyle değil mi? Ayrıca, bölüm operatörü nedeniyle Python 3-sadece mı?
Nicholas Clark,

İsteğe bağlı izleyen yeni satır eklemek size kalmış. Bölünmeye gelince, evet, ama zaten printbir işlev gibi davranıyorsunuz, bu yüzden Python 3'ü kullandığınızı varsaydım.
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"}

Örnek çalışma:

(Başlangıç 1;yalnızca bu örnek çalışmalarda “insan tarafından okunabilir” tankı görüntülemek için kullanılır.)

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

(İki kod bloğunda 88 karakter + 4 karakter komut satırı seçenekleri.)

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

Varsayım error_reporting, varsayılan olarak ayarlanmıştır.

(Büyük bir anlaşma değil, sadece kullanmak istedi -Rve-E kez . Şimdi sadece -Bkaldı.)

Örnek çalışma:

(İlk olarak echo"$argn\n";yalnızca bu örnek çalışmalarda “insan tarafından okunabilir” tankı görüntülemek için kullanılır.)

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 bayt

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

QBasic'i daha rekabetçi hale getirmek için QBIC'i yarattım, ancak yine de birkaç geliştirmeye ihtiyacı var. Şu andan itibaren, hata ayıklama için hiçbir kısayol yoktur, THEN(bu benim açımdan oldukça büyük bir gözetimdir) veinput$ . Yakında eklenecekler.

0 bonusu bile alamadım, çok pahalı ... Yüzdeleri basmayı başardım.

Örnek giriş / çıkış:

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

Program girişi etkileşimli olarak okur. Gölün dibini tespit ettiğinde (_ ) , yüzdeyi yazdırır ve çıkar. Dolu kaplarda ve boş kaplarda test edilmiştir.

Düzenleme: QBIC'in geçen yıl boyunca nasıl genişletildiğini göstermek için, şu anki tercüman için yazılmış aynı program:

{_?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 bayt, yazdırma yüzdeleri, 74 puandır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.