เหลือน้ำเท่าไหร่?


29

ที่นี่ในแคลิฟอร์เนียเราอยู่ในฤดูแล้งดังนั้นเราจำเป็นต้องรู้ว่ามีน้ำเหลืออยู่เท่าไหร่เพื่อที่เราจะได้อนุรักษ์น้ำให้ได้มากที่สุด

เนื่องจากน้ำมี จำกัด การใช้รหัสของคุณจะต้องสั้นที่สุด

ตัวอย่าง

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

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

Output: 1
|  |
|__|

Output: 0 (or bonus)

สเปค

ข้อมูลที่ป้อนจะประกอบด้วย: |_ ~และบรรทัดใหม่ทั้งหมดเท่านั้น เหนือสิ่ง~อื่นใดถือว่าเป็นอากาศ _พื้นที่ด้านล่าง~และ~ถือว่าเป็นน้ำ water / (air + water)เปอร์เซ็นต์ของน้ำด้านซ้ายเป็นเครื่องคอมพิวเตอร์โดย ผลลัพธ์ของคุณจะต้องแม่นยำถึงทศนิยม 4 ตำแหน่ง (เว้นแต่คุณจะได้รับโบนัสเป็นเปอร์เซ็นต์) อินพุตจะเป็นรูปสี่เหลี่ยมผืนผ้าเสมอ ~จะเป็นในหนึ่งบรรทัดถ้าที่ใด ๆ อินพุตอาจเป็นทางเลือกที่มีฟีดบรรทัดต่อท้ายหากคุณต้องการ

โบนัส

หากคุณไปสำหรับทั้งสองโบนัสโบนัส -15% จะถูกนำไปใช้ก่อนที่จะ -35 โบนัส

โบนัส -35 ไบต์:หากรหัสของคุณพิมพ์ " แพะฤดูแล้งนี้อยู่นอกมือ" แทนที่จะเป็น 0 เมื่อผลลัพธ์เป็น 0

-15% โบนัส:ถ้าคุณส่งออกร้อยละ

ในการทำเช่นนี้คุณจะเลื่อนตำแหน่งทศนิยมสองตำแหน่งไปทางซ้ายตัดค่าศูนย์นำหน้าและเพิ่ม a %ไปยังจุดสิ้นสุด ศูนย์ต่อท้าย (สูงสุด 2) จะอนุญาตตราบเท่าที่พวกเขาไม่ส่งผลกระทบต่อค่า 0.5-> ใด ๆ ของ:50.00% 50% 50.0%


28
" เนื่องจากน้ำมีอยู่อย่าง จำกัด รหัสของคุณจะต้องสั้นที่สุดเท่าที่จะเป็นไปได้ " เอ่อไม่เป็นไร ...
ทำให้เสียชีวิต

14
@ สรุป: มันไม่ใช่ความรู้ทั่วไปนอกรัฐ แต่คอมพิวเตอร์ที่ใช้ตรรกะเป็นพื้นฐานนั้นได้รับความนิยมอย่างมากในแคลิฟอร์เนีย ฉันได้ยินมาว่าพวกเขากำลังพยายามดูว่าพวกเขาสามารถใช้อัลมอนด์ทดแทนได้หรือไม่
JohnE

10
@JohnE ที่อาจอธิบายได้ว่าทำไมมีความแห้งแล้งในตอนนี้
hargasinski

1
พวกคุณรู้ไหมว่าคอมพิวเตอร์แบบฟลูอิติกไม่ใช้น้ำใช่มั้ย เช่นเดียวกับคอมพิวเตอร์ไฟฟ้าไม่ทำให้อิเล็กตรอนขาดแคลน
user253751

นี่คือ: |~~~|(ไม่มีขีดล่าง) อินพุตที่ถูกต้อง?
edc65

คำตอบ:


16

Pyth - 17 46 45 52 * .85 - 35 = 9.2 ไบต์

กรองอินพุต (ด้วย#meta-op ตัวกรองใหม่!) สำหรับบรรทัดที่มี~อยู่แล้วทำดัชนีนั้นไปยังอินพุตจากนั้นหารด้วยความยาวของอินพุต หากไม่มีด้วย~จะเกิดข้อผิดพลาดและทริกเกอร์ข้อยกเว้น.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 ไบต์ที่บันทึกแล้วขอบคุณ @ user81655

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

น้อย golfed

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 ไบต์
user81655

@ 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

Python เป็น verbose!

Python: 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))
Blender

ดี! ที่ได้รับการสะดุดโดยขึ้นบรรทัดใหม่ไม่จำเป็นแม้ว่ามันไม่ได้หรือไม่ นอกจากนี้ยังเป็น 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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.