การนับจุดสิ้นสุดของศิลปะ ASCII


14

คุณควรเขียนโปรแกรมหรือฟังก์ชั่นที่ได้รับสตริงที่แสดงถึง ASCII art เป็น input และ output หรือคืนค่าจำนวน endpoints ใน input

อินพุตจะประกอบด้วยอักขระspace - | +(ที่มีจุดปลาย 0, 2, 2 และ 4 ตามลำดับ) และการแบ่งบรรทัด เช่น:

-|++-
  +

อักขระสองตัวที่อยู่ติดกันถูกเชื่อมต่อและทำให้สูญเสีย 1 จุดปลายในแต่ละกรณีในกรณีต่อไปนี้:

--  -+  +- |  |  +  +  ++
           |  +  |  +

ตัวอย่างแรกมี

2+2+2+2+1+
    3        = 12

ปลายทาง

อินพุต

  • การป้อนข้อมูลจะเป็นสตริงที่ประกอบด้วยพื้นที่ตัวอักษร-, |, +และขึ้นบรรทัดใหม่
  • ความยาวอินพุตสามารถมีความยาวได้ 0 และอินพุตใด ๆ ที่ตรงกับคำอธิบายข้างต้นนั้นถูกต้อง (ในอินพุตของ regex คือ[ -+|\n]*)
  • ขึ้นบรรทัดใหม่ต่อท้ายเป็นตัวเลือก

เอาท์พุต

  • จำนวนเต็มที่ไม่ใช่ลบเดียวคือจำนวนของจุดปลาย

ตัวอย่าง

เอาต์พุตอยู่หลังแถวสุดท้ายของอินพุต

+
4 

-|++-
  +
12 

+--+
|  |
+--+
8 

  |  |
  +--+-- |||
12 

--++
 |||--
10 

<empty input>
0 


|
|     
2 

--
++--
 ++
   --+
  +++ || 

 ----
30 

นี่คือรหัสกอล์ฟเพื่อให้รายการที่สั้นที่สุดชนะ

คำตอบ:


11

หอยทาก 29

A
\+|\-)lr!\-|(\+|\|)n!\|}!\+

ฉันเพิ่มความคิดเห็นในบรรทัดด้วย,,เพื่อที่จะทำให้เป็นรุ่นที่มีความคิดเห็น

A                    ,, Count all accepting paths
        \+ | \- )    ,, Literal '+' or '-'        
        lr           ,, Set direction to left or right
        !\-          ,, Assert next char is not '-'
    |                ,, Or...
        ( \+ | \| )  ,, Literal '+' or '|'
        n            ,, Turn 90 degrees right or left (from initial direction right)
        !\|          ,, Assert next char is not '|'
}                    ,, Group everything previous
!\+                  ,, Assert next char is not '+'

5

JavaScript (ES6), 168

การใช้สตริงแม่แบบการขึ้นบรรทัดใหม่ทั้งหมดมีความสำคัญและนับ

ทดสอบการเรียกใช้ตัวอย่างข้อมูลด้านล่างใน Firefox (Chrome ยังไม่รองรับ...)

f=s=>`
${s}
`.split`
`.map((r,y,s,v=c=>c>' '&c!='-',h=c=>c>' '&c<'|')=>[...r].map((c,x)=>t+=(v(c)?2-v(s[y-1][x])-v(s[y+1][x]):0)+(h(c)?2-h(r[x-1])-h(r[x+1]):0)),t=0)&&t

// Less golfed
u=s=>{
  s = ('\n' + s + '\n').split('\n'); // split in rows, adding a blank line at top and one at bottom
  t = 0; // init counter
  v = c => c>' ' & c!='-'; // function to check if a character has vertical end points
  h = c => c>' ' & c<'|'; // function to check if a character has horizontal end points
  s.forEach( (r,y) =>
    [...r].forEach( (c,x) => {
     if (v(c)) // if current character has vertical endpoints, check chars in previous and following row
        t += 2 - v(s[y-1][x]) - v(s[y+1][x]); 
     if (h(c))  // if current character has horizontal endpoints, check previous and following chars in row
        t += 2 - h(r[x-1]) - h(r[x+1]);
    })
  )  
  return t
}

//TEST
out=x=>O.innerHTML+=x+'\n'

;[
 [`+`,4]
,[`-|++-
  +`,12]
,[`+--+
|  |
+--+`,8]
,[`  |  |
  +--+-- |||`,12]
,[`--++
 |||--`,10]
,[``,0]
,[`
|
|`,2]
,[`
--
++--
 ++
   --+
  +++ || 

 ----`,30]
].forEach(t=>{ r=f(t[0]),k=t[1],out('Test '+(r==k?'OK':'Fail')+'\n'+t[0]+'\nResult:'+r+'\nCheck:'+k+'\n') })
<pre id=O></pre>


สิ่งที่ฉันต้องทำคือแยกแถวออกแล้วเพิ่มแถวว่างที่ด้านบนและแถวว่างที่ด้านล่าง รหัสของคุณไม่ได้แยกเลย คุณสามารถทำเช่น["",...s.split("\n"),""]นั้นได้นานกว่า @ETHproductions
edc65

อ้าใช่แล้วขอโทษด้วย
ETHproductions

3

Python 2, 123

l=[]
i=p=t=0
for c in input():
 l+=0,;h=c in'-+';t+=h>p;p=h;v=c in'|+';t+=v>l[i];l[i]=v;i+=1
 if' '>c:l=l[:i];i=0
print t*2

วิธีการหนึ่งรอบ ใช้เป็นอินพุตสตริงที่มีการแบ่งบรรทัด

สำหรับแนวนอนแนวความคิดคือการนับจำนวนของส่วนแนวนอนซึ่งแต่ละส่วนมีจุดปลายสองจุด ส่วนเริ่มต้นเมื่อใดก็ตามที่ตัวละครเป็นหนึ่งใน+-(บูลีนh) แต่คนก่อนหน้านี้ไม่ได้เป็น (บูลีนp)

+|สำหรับแนวดิ่งที่เราต้องการที่จะทำสิ่งเดียวกันกับการป้อนข้อมูลการขนย้ายที่กำลังมองหาที่วิ่ง น่าเสียดายที่การขนย้ายไพ ธ อนเป็นเรื่องที่ไม่น่าสนใจ มันต้องการอะไรซักอย่างmap(None,*s.split('\n'))เติมในช่องว่างด้วยNoneซึ่งมันก็ต้องรับมือด้วยเช่นกัน

แต่เรานับจำนวนแนวตั้งในขณะที่วนซ้ำในแนวนอน เราเก็บรายการlของดัชนีคอลัมน์ที่ยังคง "กำลังทำงาน" นั่นคือตำแหน่งที่อักขระก่อนหน้าในคอลัมน์นั้นเชื่อมต่อ จากนั้นเราทำสิ่งเดียวกันกับแนวนอนนับกลุ่มแนวตั้งเริ่มต้นใหม่ 0เมื่อเราตีขึ้นบรรทัดใหม่ที่เราตัดออกจากรายการทางด้านขวาของที่เรามีตั้งแต่กลุ่มทั้งหมดไปทางขวาหักและการตั้งค่าดัชนีปัจจุบัน


3

CJam, 66 62 61 bytes

q_N/_z,S*f.e|zN*"-|++"2$fe=1b"|-"{'++:R:a@+2ew{aR2m*&},,-}/2*

ลองใช้ออนไลน์ในล่าม CJam

ความคิด

เราสามารถคำนวณจุดปลายได้ดังนี้:

  1. นับจำนวน-s, |s และ+s ในอินพุต
  2. คูณตัวสุดท้ายด้วย 2 และเพิ่มผลลัพธ์
  3. นับจำนวน--s, -+s, +-s และ++s ในแถว
  4. นับจำนวนของ||s |+s, +|s และ++s ในคอลัมน์
  5. ลบผลลัพธ์จาก 3 และ 4 จากผลลัพธ์จาก 2
  6. ทวีคูณผลลัพธ์ตั้งแต่ 5 คูณ 2

รหัส

q        e# Read all input from STDIN.
_N/      e# Push a copy and split it at linefeeds.
_z,      e# Count the number of rows of the transposed array.
         e# This pushes the length of the longest row.
S*       e# Push a string of that many spaces.
f.e|     e# Perform vectorized logical OR with the rows.
         e# This pads all rows to the same length.
zN*      e# Transpose and join, separating by linefeeds.
"-|++"   e# Push that string.
2$       e# Copy the original input.
fe=      e# Count the occurrences of '-', '|', '+' and '+' in the input.
1b       e# Add the results.
"|-"{    e# For '|' and '-':
  '++    e#   Concatenate the char with '+'.
  :R     e#   Save the resulting string in R.
  :a     e#   Convert it into an array of singleton strings.
  @      e#   Rotate one of the two bottom-most strings on top of the stack.
         e#   This gets the transposed input for '|' and the original input for '-'.
  +      e#   Concatenate both arrays.
         e#   This pads the input with nonsense to a length of at least 2.
  2ew    e#   Push a overlapping slices of length 2.
  {      e#   Filter the slices; for each:
    a    e#     Wrap it in an array.
    R2m* e#     Push the second Cartesian power of R.
         e#     For '|', this pushes ["||" "|+" "+|" "++"].
    &    e#     Intersect.
  },     e#   If the intersection was non-empty, keep the slice.
  ,      e#   Count the kept slices.
  -      e#   Subtract the amount from the integer on the stack.
}/       e#
2*       e# Multiply the result by 2.
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.