Скільки води залишилось?


29

Тут, у Каліфорнії, ми перебуваємо в посуху, тому нам потрібно знати, скільки води у нас залишилось, щоб ми могли зберегти якомога більше води.

Оскільки вода обмежена, ваш код повинен бути якомога коротшим.

Приклади

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

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

Output: 1
|  |
|__|

Output: 0 (or bonus)

Специфікація

Вхід буде складатися виключно з усіх: |_ ~та нових рядків. Всі вище ~'s вважаються повітряними; _, проміжки внизу ~, а ~сам по собі вважається водою. Відсоток залишеної води складає комп'ютер water / (air + water). Вихід повинен бути точним до 4 знаків після коми (якщо ви не ходите на відсотковий бонус). Вхід завжди буде прямокутним. Заповіт ~буде лише в одному рядку, якщо він є. Якщо ви хочете, вхід може також мати канал подання рядка.

Бонус

Якщо ви отримуєте обидва бонуси, бонус -15% застосовується перед бонусом -35

-35 байт Бонус: Якщо ваш код друкує "Ця посуха коза з рук", а не 0, коли вихід 0

-15% бонус: якщо ви виведете відсоток.

Для цього слід зрушити десяткове місце на два місця ліворуч, обрізати ведучі нулі та додати а %до кінця. Останні нулі (макс. 2) дозволяються до тих пір, поки вони не впливають на значення. 0.5-> будь-який з:50.00% 50% 50.0%


28
" Оскільки подача води обмежена, ваш код повинен бути якомога коротшим ". Ой гаразд, має сенс ... я думаю?
Фаталізувати

14
@Fatalize: Це не загальновідомі знання за межами штату, але плідні комп'ютери на основі логіки надзвичайно популярні в Каліфорнії. Я чую, що вони намагаються зрозуміти, чи зможуть вони сьогодні розробити мигдальну альтернативу.
JohnE

10
@JohnE, можливо, пояснює, чому зараз там посуха
hargasinski

1
Ви, хлопці, знаєте, що плідні комп’ютери не використовують воду, правда? Так само, як електричні комп'ютери не викликають нестачі електронів.
користувач253751

Це: |~~~|(без підкреслення) дійсний ввід?
edc65

Відповіді:


16

Pyth - 17 46 45 52 * .85 - 35 = 9.2 байт

Фільтрує вхід (За допомогою нового #мета-опції фільтра!) Для рядка з ~ним, потім індексує його до входу, а потім ділить його на довжину введення. Якщо таких немає ~, вона помиляється і запускає винятковий пункт .xі друкує рядок.

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

Спробуйте його онлайн тут .


10

Python 3, 37 байт

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

Без бонусів. Приймає рядок введення з новими рядками, включаючи зворотний новий рядок.

Давайте розберемося, чому працює формула. Частка води - це доповнення частки повітря, яку ми отримаємо.

frac_water = 1 - frac_air

Нумерація рядків у 0, 1, 2, ...нас є

frac_air = water_row_index / num_rows 

Те ж саме, якщо обидва помножити на ширину кожного рядка, рахуючи нові рядки, які спрощуються до виразів у кількості символів.

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

Початок водяного рядка знаходимо шляхом пошуку вхідного рядка xдля |~, а кількість символів - це лише довжина.

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

Нарешті, для того, щоб введення води не працювало, |~перед пошуком ми додаємо вигаданий рядок води до кінця, завдяки чому він виглядає так, що рівень води дорівнює 0.

Бонуси, здавалося, не варті того. Найкраще, що я отримав на рядковій, це 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 байт

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

Спробуйте в Інтернеті

Ця версія отримує обидва бонуси. Для введення цього рішення повинен міститись зворотний новий рядок.

Дякуємо @Martin Büttner за збереження 2-х байт.

Пояснення:

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)

Як анонімна функція. Використовуючи рядки шаблону, є новий рядок, який є значущим і включений до числа байтів

Редагуйте 1 байт, збережений 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'

Менше гольфу

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

Фрагмент тесту

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
Прекрасний тестовий фрагмент та чудовий код, як завжди! Одне з пропозицій: Ви можете замінити p=~iз p=i, &&-pз &&p-qі 1+~pдо , 1+pщоб зберегти 1 байт.
користувач81655

@ user81655 приємна пропозиція, спасибі
edc65

4

Пар , 57 * 85% - 35 = 13,45 байт

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

Пояснення

`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 байт

включає +1 для -p

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

З коментарями:

$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 байт версія, без бонусу: 27

    $S[$w|=/~/]++}{$_=$S[1]/$.
    
  • 34 + 1 байт версія, з 15% бонусом: 29,75

    $S[$w|=/~/]++}{$_=100*$S[1]/$..'%'
    
  • 61 + 1 байт версія, з -35 бонусом: 27

    $S[$w|=/~/]++}{$_=$w?$S[1]/$.:'This drought goat out of hand'
    
  • 69 + 1 байт версія, обидва бонуси: 24.50

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

2

Javascript, 59.3

Я сподіваюся, що додаткові десяткові знаки в порядку. Передбачає відсутність нового рядка.

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 байт

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

Приклад використання: f "| |\n|~~|\n| |\n|__|"-> 0.75.

l- це спеціальна функція довжини, яка необхідна, оскільки збірка lengthповертає цілочисельні значення, але нам потрібні значення з плаваючою комою для поділу (є і те, genericLengthщо забезпечує цю функцію, але це довше, не кажучи вже про необхідне import Data.List). fрозбиває введення iна рядки (-> s), а потім на пару, де перший елемент - це список з усіма рядками до (і виключаючи) першого з а ~в ньому. Другий елемент - це список з рештою рядків. В результаті виходить довжина другого елемента, поділена на довжину s.

Бонуси не окупаються.


1

Пітон багатослівний!

Пітон: 98,45 байт

(157 * 0,85) - 35 = 98,45 байт

Ця версія читає з stdin та збирає обидва бонуси:

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 без жодних бонусів:import sys;r=[x[1]for x in sys.stdin];print(1-r.index('~')/len(r))
Блендер

Приємно! Хоча, це потрапляє в необов'язковий кінцевий новий рядок, чи не так? Крім того, це Python 3-тільки через оператора поділу?
Ніколас Кларк

Необов'язковий новий рядок потрібно включити. Що стосується поділу, так, але ви вже ставитесь printдо цієї функції, тому я припустив, що ви використовуєте Python 3.
Blender

1

Awk, 72 символи - 15% - 35 = 26,2

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

Проба зразка:

(Первісна, що 1;використовується лише в цих зразках, використовується для відображення резервуара, "читабельного для людини".

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 символи - 15% - 35 = 43,2

(88 символів у двох блоках коду + параметри командного рядка з 4 символами.)

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

Припущення error_reportingвстановлено за замовчуванням.

(Не велика справа, просто хотіли використати -Rі -Eодин раз. Тепер -Bзалишилося лише .)

Проба зразка:

(Первісна, що echo"$argn\n";використовується лише в цих зразках, використовується для відображення резервуара, "читабельного для людини".

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 байт

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

Я створив QBIC, щоб зробити QBasic більш конкурентоспроможним, але він все ще потребує декількох удосконалень. На сьогоднішній день не існує ярликів для вилучення помилок THEN(що з мого боку досить великий контроль) та input$. Вони будуть додані незабаром.

Я не міг потрапити на бонус 0, занадто дорого ... Мені вдалося надрукувати відсотки.

Зразок вводу / виводу:

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

Програма читає вхід інтерактивно. Коли він виявить дно озера ( _), він роздруковує відсоток і закриває. Тестовано для повних контейнерів та порожніх.

Редагувати: Щоб показати, як QBIC було розширено за останній рік, ось та сама програма, написана для поточного перекладача:

{_?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 байт, відсоток друку - це оцінка 74.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.