ลำแสงจะชนหรือไม่


31

<>^vหน่อเลเซอร์ลำแสงตรงในหนึ่งในสี่ทิศทางมุมฉากแสดงโดย ตรวจสอบว่ามันจะถึงเป้าหมายOในตารางสี่เหลี่ยม

แต่ละรายการจะถูกตี (True):

.....
...O.
.....
...^.
.....

>O.
...

v....
O....

...........
...........
O.........<
...........

สิ่งเหล่านี้จะพลาด (เท็จ):

......
......
.^..O.

......
.....>
O.....
......
......


.O.
...
.v.

.....<.
..O....

อินพุต:ตารางสี่เหลี่ยมจัตุรัส.ขนาดอย่างน้อย 2x2 โดยมีเป้าหมายOเดียวและเลเซอร์หนึ่งอันที่เป็นหนึ่งใน<>^vนั้น บรรทัดสามารถเป็นรายการของสตริงอาร์เรย์ 2 มิติหรือรายการของอักขระที่ซ้อนกันหรือสตริงที่คั่นด้วยการขึ้นบรรทัดใหม่เดี่ยวด้วยการขึ้นบรรทัดใหม่ที่เป็นทางเลือก

เอาท์พุท : ค่าความจริงที่สอดคล้องกันหากลำแสงเลเซอร์ไปถึงเป้าหมายและค่าที่ผิดพลาดหากมันหายไป

ฉันจะพิจารณาการส่งที่ไม่ใช้นิพจน์ทั่วไป (หรือการจับคู่สตริงตามรูปแบบในตัว) เป็นหมวดหมู่แยก หากคุณใส่(no regex)ชื่อภาษาคำตอบของคุณจะปรากฏแยกต่างหากในกระดานแต้มนำ



6
ผมหวังว่าคุณจะมีกระจกด้วยและ/ \ อาจเป็นคำถามอื่น ...
vsz

2
@Mego ... ซึ่งทำให้ความท้าทายนี้ง่ายขึ้นมากและช่วยให้วิธีการที่แตกต่างกันมาก
Martin Ender

2
@ ฉันไม่เห็นด้วย; จากเหตุผลดังกล่าวความท้าทายธรรมดาในโลกสวัสดีจึงเป็นความท้าทายซ้ำซ้อนกันหลายสิบรายการในเวลาเดียวกัน อย่างไรก็ตามขอบคุณที่แจ้งให้ฉันทราบเกี่ยวกับพลังที่ฉันต้องปิด / เปิดรหัสท้าทายกอล์ฟฉันไม่ได้ตระหนักถึงเรื่องนั้น
aditsu

5
@Mego ถึงแม้ว่าคำถามนี้จะเป็นกรณีพิเศษของอีกคำถามหนึ่ง แต่ฉันไม่เชื่อว่ามันจะเป็นล่อลวงเพราะคำตอบใช้วิธีการที่แตกต่างกันโดยสิ้นเชิง ในคำถามนั้นพวกเขาทั้งหมดคำนวณเส้นทางของลำแสง พอร์ทัลสามารถย้ายเส้นทางจากที่ใดก็ได้ไปยังที่ใด ๆ ซึ่งไม่อนุญาตให้มีทางลัดและตัวสะท้อนแสงนั้นมีความยุ่งยากในการจัดการ คำตอบที่นี่ส่วนใหญ่จะตรวจสอบหรือจับคู่กับคุณสมบัติของสตริงอินพุตแทน แน่นอนว่าคุณสามารถคัดลอกคำตอบการติดตามเส้นทางจากความท้าทายอื่นและลบบิตเพิ่มเติม แต่วิธีนี้มากเกินไปและให้ทางออกที่ไม่จำเป็น
xnor

คำตอบ:


27

หอยทาก , 19 ไบต์

\>|\<l|\^u|\vd).,\O

ข้อมูลจำเพาะสำหรับอันนี้สามารถนำไปใช้ได้จริงโดยไม่ต้องคิด


6
คุณสามารถเพิ่มคำอธิบายเกี่ยวกับวิธีการทำงานของมันได้หรือไม่?
คดีของกองทุนโมนิกา

5
@QPaysTaxes จนกว่า feersum จะไปถึงมันหวังว่าสิ่งนี้จะช่วยได้: หอยทากเป็นภาษาที่จับคู่รูปแบบ 2D udlrกำหนดทิศทางของหอยทากเป็นขึ้น / ลง / ซ้าย / ขวา |ทำงานเหมือนที่ทำใน regex ปกติและ)ไม่ต้องการวงเล็บเปิดที่ตรงกัน ดังนั้นรหัสแปลโดยตรงไปที่ "ค้นหาหนึ่งv<>^และกำหนดทิศทางที่เหมาะสมแล้วลองค้นหา O ในทิศทางนั้น"
FryAmTheEggman

ใช่สิ่งที่ Eggman พูด สิ่งเดียวที่,เป็น*ของ regex
feersum

13

เรตินา, 56 52 42 38 31 30 ไบต์

บันทึกแล้ว 1 ไบต์ขอบคุณ @ MartinBüttner

O.*<|>.*O|[vO](.*¶)[^O]*[O^]\1

ละเมิดคุณสมบัติของสี่เหลี่ยม ต้องการอินพุตเพื่อให้มีบรรทัดใหม่ต่อท้าย

ลองออนไลน์

คำอธิบาย

การทำงานในสามส่วนนี้:

  • การจับคู่ >
  • การจับคู่ <
  • การจับคู่^และvนี่เป็นเพราะตรรกะสำหรับ^และvเหมือนกันจริงๆเพียงแค่ตัวละคร

การตรวจสอบ <

มันง่ายมาก:

O.*<

ซึ่งตรงกับOตัวเลือกตามด้วยตัวอักษรที่ไม่ใช่บรรทัดใหม่และ a<

การตรวจสอบ >

นี่เป็นวิธีเดียวกับวิธีก่อนหน้านี้ยกเว้นวิธีอื่น ๆ ก่อน>จะจับคู่แล้วO

กำลังตรวจสอบ^และv

นี่เป็นเรื่องยากที่จะเล่นกอล์ฟและทำการโฆษณาข้อมูลที่ถูกต้องอยู่เสมอ อันดับแรกเราจับคู่กันไม่ว่าจะเป็นvหรือO:

[vO]

ถ้ามันเป็นที่ตัวอักษรตัวแรกที่พบที่ควรจะเป็น^ Oดังนั้นนี่จะจับคู่อักขระตัวแรกที่ตรงกัน ต่อไปเราจะนับจำนวนของการ.ติดตามจนถึงบรรทัดใหม่:

(.*\n)

ต่อไปนี้สามารถแบ่งออกเป็นสองส่วนฉันจะครอบคลุมส่วนแรก:

ดังนั้นก่อนอื่นเราจะจับคู่กันจนถึงสิ่งต่อไปนี้Oโดยใช้:

[^O]*O

ตัวเลือกนี้ตรงกับOตัวละครที่ไม่ใช่ทั้งหมดจนกว่าOจะพบถ้ามันประสบความสำเร็จแล้วมันจะดำเนินต่อไป ... หากไม่ใช่จะมีสิ่งต่อไปนี้เกิดขึ้น ...

ตอนนี้มันพยายามค้นหาการ^ใช้:

[^^]*\^

^เป็นอักขระพิเศษใน regex ดังนั้นจึงจำเป็นต้องหลบหนี [^^]ตรงกับตัวละครทั้งหมดยกเว้น^การทำงานเช่นเดียวกับข้างต้นหากประสบความสำเร็จแล้วต่อไปนี้เกิดขึ้น ...

ดังนั้นตอนนี้ข้อใดข้อหนึ่งข้างต้นได้จับคู่สำเร็จการ\1ตรวจสอบและดูว่ากลุ่มการดักจับจากก่อนหน้า(.*\n)นี้กลุ่มการดักจับนี้เก็บจำนวนของ.s หลังจากทั้งก่อนvหรือหลังOก่อนดังนั้นตอนนี้\1เพียงตรวจสอบว่าจำนวนจุดใน เหมือนกัน.


คุณสามารถบันทึกไบต์ได้โดยใช้แทน\n(Retina สามารถจัดการซอร์สโค้ดใน ISO 8859-1 ได้)
Martin Ender

@ MartinBüttnerคิดว่า\ n เป็นเพียงการทดแทนขอขอบคุณเคล็ดลับ!
Downgoat

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

9

Java (ไม่มี regex), 413 412 246 242 212 211 209 198 ไบต์

การแข่งขันในสนามกอล์ฟที่ท้าทายด้วยจาวานั้นมีเหตุผลน้อยกว่าการมีส่วนร่วมในการแข่งขัน Formula 1 บนจักรยาน แต่ฉันไม่ได้คิดเสมอไปว่าจะมีเหตุผลใด ๆ

นี่คือ Java solution รุ่นที่ยาวมากของฉัน

boolean l(char[][]w){int[]t={},l={};for(int y=0;y<w.length;y++)for(int x=0;x<w[0].length;x++){if(w[y][x]=='O')t=new int[]{x,y};if(w[y][x]=='<')l=new int[]{x,y,1};if(w[y][x]=='>')l=new int[]{x,y,2};if(w[y][x]=='v')l=new int[]{x,y,3};if(w[y][x]=='^')l=new int[]{x,y,4};};return(l[2]==1&&l[1]==t[1]&&l[0]>t[0])||(l[2]==2&&l[1]==t[1]&&l[0]<t[0])||(l[2]==3&&l[0]==t[0]&&l[1]<t[1])||(l[2]==4&&l[0]==t[0]&&l[1]>t[1]);}

และ ungolfed

boolean l(char[][] w) {
    int[] t = {}, l = {};
    for (int y = 0; y < w.length; y++)
        for (int x = 0; x < w[0].length; x++) {
            if (w[y][x] == 'O')
                t = new int[] { x, y };
            if (w[y][x] == '<')
                l = new int[] { x, y, 1 };
            if (w[y][x] == '>')
                l = new int[] { x, y, 2 };
            if (w[y][x] == 'v')
                l = new int[] { x, y, 3 };
            if (w[y][x] == '^')
                l = new int[] { x, y, 4 };
        }
    ;
    return (l[2] == 1 && l[1] == t[1] && l[0] > t[0])
            || (l[2] == 2 && l[1] == t[1] && l[0] < t[0])
            || (l[2] == 3 && l[0] == t[0] && l[1] < t[1])
            || (l[2] == 4 && l[0] == t[0] && l[1] > t[1]);
}

ดูเหมือนว่าแนวคิดทั้งหมดของฉันผิดนี่คือคำตอบสั้น ๆ ของฉัน

boolean z(char[][]w){int x=0,y=0,i=0,a=w.length,b=w[0].length;for(;w[y][x]!=79;)if(++y==a){y=0;x++;}for(;i<(a<b?b:a);)if(i<b&w[y][i]==(i<x?62:60)|i<a&w[i][x]==(i++<y?'v':94))return 1<2;return 1>2;}

และเวอร์ชันที่ไม่ดี

oolean z(char[][] w) {
        int x = 0, y = 0, i = 0, a = w.length, b = w[0].length;
        for (; w[y][x] != 79;)
            if (++y == a) {
                y = 0;
                x++;
            }
        for (; i < (a < b ? b : a);)
            if (i < b & w[y][i] == (i < x ? 62 : 60) | i < a
                    & w[i][x] == (i++ < y ? 'v' : 94))
                return 1 < 2;
        return 1 > 2;
    }

แก้ไข ฉันเขียนโค้ดใหม่เพื่อค้นหา 'O' ตอนนี้มันมีลูปเดี่ยวสั้นกว่ามากและฉันยังใช้ @Frozn ข้อเสนอแนะเพื่อแทนที่อักขระบางตัวด้วยค่า ascii

เป็นผลให้อีก 30 ไบต์กัดฝุ่น

ข้อเสนอแนะอื่น ๆ จาก @Frozn และเรามีจำนวนไบต์ที่ใกล้เคียงกับโซลูชัน Python มากขึ้น

การเขียนอีกอันหนึ่งปล่อยหนึ่งลูปและรวมสองคำสั่งถ้ารวมกัน


1
+1 คุณสามารถลบช่องว่างระหว่างreturnและ(เพื่อบันทึกไบต์ได้ พื้นที่ไม่จำเป็นเมื่อค่าส่งคืนของคุณอยู่ในวงเล็บ (หรือเครื่องหมายคำพูดสำหรับสตริง) แหล่งที่มาจากเคล็ดลับการเขียนโค้ด Java
Kevin Cruijssen

@KevinCruijssen ไม่ประหยัดมาก แต่ขอบคุณ :)
user902383

ทุก ๆ เล็กน้อย (หรือฉันควรจะบอกว่าไบต์) ช่วยฉันเดา ;) นอกจากนี้ฉันไม่คิดว่า Java จะได้รับรางวัลการแข่งขันกอล์ฟ ฉันยังคงชอบที่จะทำสิ่งที่ท้าทายกอล์ฟโค้ดใน Java แต่โดยเฉพาะอย่างยิ่งเมื่อฉันทำงานกับ Java ในที่ทำงาน
Kevin Cruijssen

คุณสามารถแทนที่ตัวอักษรโดยค่า ASCII ของพวกเขา'O' = 79, '>' = 62, ,'<' = 60 '^' = 94สำหรับ 'v' มันคือ 118 แต่นั่นไม่ย่อรหัส
Frozn

@ Frozn อย่างที่ Kevin พูดในทุก ๆ ไบต์
user902383

7

MATL (ไม่มี regex), 26 25 24 22 ไบต์

'>v<^'XJymfX!tZpYswJm)

ลองออนไลน์!

รุ่นที่แก้ไขสำหรับกรณีทดสอบทั้งหมด

คำอธิบาย

        % Implicitly grab input
'>v<^'  % String literal indicating the direction chars
XJ      % Store in the J clipboard
y       % Copy the input from the bottom of the stack
m       % Check to see which of the direction chars is in the input. The
        % result is a 1 x 4 logical array with a 1 for the found direction char
f       % Get the 1-based index into '>v<^' of this character
X!      % Rotate the input board 90 degrees N times where N is the index. This
        % Way we rotate the board so that, regardless of the direction char,
        % the direction char should always be BELOW the target in the same column
t       % Duplicate
Zp      % Determine if any elements are prime ('O' is the only prime)
Ys      % Compute the cumulative sum of each column
w       % Flip the top two stack elements
J       % Grab '>v<^' from clipboard J
m       % Create a logical matrix the size of the input where it is 1 where
        % the direction char is and 0 otherwise
)       % Use this to index into the output of the cumulative sum. If the 
        % direction char is below 'O' in a column, this will yield a 1 and 0 otherwise
        % Implicitly display the result

@LuisMendo ทีนี้ลองหาวิธีกำจัดJ
Suever

ฉันไม่รู้ MATL ดังนั้นนี่อาจเป็นคำถามที่งี่เง่า แต่ทำไม 0 สำคัญ?
นีล

3
@Neil ตัวอักษรมันไม่ใช่จำนวน'O' 0รหัส ASCII สำหรับจดหมาย'O'คือ79
Luis Mendo

อืมฉันเดาว่าฉันคงถูกหลอกหากคุณกำลังมองหาเลขคี่แทน
Neil

5

CJam (ไม่มี regex), 25

เวอร์ชันก่อนหน้านี้ผิดนี่ต้องทำตอนนี้:

q~_z]{'.-HbI%}f%[HF].&~+,

ลองออนไลน์

คำอธิบาย:

q~         read and evaluate the input (given as an array of strings)
_z         copy and transpose
]          put the original grid and transposed grid in an array
{…}f%      map the block to each grid (applying it to each string in each grid)
  '.-      remove all dots (obtaining a string of 0 to 2 chars)
  Hb       convert to base H=17, e.g. ">O" -> 62*17+79=1133
  I%       calculate modulo I=18
[HF]       make an array [17 15]
.&         set-intersect the first array (mapped grid) with 17 and 2nd one with 15
~+         dump and concatenate the results
,          get the array length

ฉันลองสูตรทางคณิตศาสตร์สองสามข้อเพื่อแยกความแตกต่างระหว่างสตริง "ดี" และ "ไม่ดี" และสำหรับสูตรแต่ละประเภทฉันพยายามเสียบตัวเลขหลาย ๆ ตัว ฉันจบลงด้วยHbI%ข้างต้น

สตริง "ดี" สำหรับกริดดั้งเดิมคือ "> O" และ "O <" และพวกเขาให้ผลลัพธ์ 17
"ดี" สตริงสำหรับกริดที่ถูกเปลี่ยนเป็น "vO" และ "O ^" และพวกเขาให้ผลลัพธ์ 15
"ไม่ดี" สตริงสำหรับกริดทั้งสองคือ: ">", "<", "^", "v", "O", "", "O>", "Ov", "<O", "^ O" และพวกมันจะให้ ผลลัพธ์ 8, 6, 4, 10, 7, 0, 1, 3, 1, 3


3

Python 3 (ไม่มี regex), 184 ไบต์

ไชโยสำหรับการแฮ็ค eval!

def f(a,o=0,d={},q=''):
 for r in a:
  i=0
  for c in r:d[c]=o,i;i+=1;q=(c,q)[c in'O.']
  o+=1
 z,y=d['O'];e,j=d[q];return eval("z%se and y%sj"%(('><'[q<'v'],'=='),('==',q))[q in'><'])

3

TSQL (sqlserver 2012) (ไม่มี regex) 358 ไบต์

DECLARE @ varchar(1000)=
'......'+ CHAR(13)+CHAR(10)+
'......'+ CHAR(13)+CHAR(10)+
'...0..'+ CHAR(13)+CHAR(10)+
'...^..'+ CHAR(13)+CHAR(10)
;

WITH C as(SELECT
number n,SUBSTRING(@,number,1)a,1+min(IIF(SUBSTRING(@,number,1)=char(13),number,99))over()m
FROM master..spt_values
WHERE'P'=type and
SUBSTRING(@,number,1)in('>','<','^','v','0',char(13)))SELECT
IIF(c.n%c.m=d.n%c.m and c.a+d.a in('0^','v0')or
c.n/c.m=d.n/c.m and c.a+d.a in('>0','0<'),1,0)FROM c,c d
WHERE c.n<d.n and char(13)not in(c.a,d.a)

ต้องใช้การเปลี่ยนบรรทัดแบบขี้ขลาดในการประกาศเพื่อบังคับให้เวอร์ชันออนไลน์ดำเนินการ (การกำหนดค่าให้กับตัวแปรอินพุตไม่ส่งผลกระทบต่อการคำนวณความยาว)

ลองออนไลน์!



2

JavaScript (ES6), 78 ไบต์

s=>s.match(`>.*O|O.*<|(?=v)([^]{${l=s.search`\n`+1}})+O|(?=O)([^]{${l}})+\\^`)

Regexp แน่นอน กลายเป็นเหมือนกันในหลักการกับคำตอบของทับทิม


2

Ruby, 71 55 54 ไบต์

วิธีการแก้ปัญหา Regex ซึ่งหมายความว่ามันอาจจะถูกตีอย่างง่ายดายโดย Retina หรือ Perl

ส่งคืนหมายเลขดัชนี (ความจริง) หากมีการแข่งขัน

ขณะนี้มีเคล็ดลับคล้ายกับคำตอบ @Downgoat Retina จับคู่กับคานขึ้นลงในเวลาเดียวกัน

->m{m=~/>\.*O|O\.*<|(?=[vO])(.{#{??+m=~/\n/}})+[O^]/m}

2

JavaScript (ES6) (ไม่มี regex), 126 ไบต์

s=>([n,o,l,r,u,d]=[..."\nO<>^"].map(c=>1+s.indexOf(c)),l>o&l-o<n&l%n>o%n||r&&r<o&o-r<n&r%n<o%n||u>o&u%n==o%n||d&&d<o&d%n==o%n)

ไหน\nหมายถึงอักขระ newline ที่แท้จริง


2

Clojure (ไม่มี regex), 293 ไบต์

(defn z[f](let[v(sort(keep-indexed(fn[i v](if(some #{v}[\v\>\<\^\O])[(if(= v\O)\& v)i]))f))l(+(.indexOf f"\n")1)d((nth v 1)0)q((nth v 1)1)p((nth v 0)1)r(=(quot p l)(quot q l))i(> q p)](cond(= d\^)(and i(=(mod(- q p)l)0))(= d\v)(and(not i)(=(mod(- p q)l)0))(= d\>)(and(not i)r):else(and i r))))

รู้สึกไม่ดี วิธีแก้ปัญหาที่ตรงไปตรงมาค้นหาดัชนีของตัวละครที่เกี่ยวข้องและคำนวณว่าพวกมันอยู่ในบรรทัดเดียวกันหรือไม่

คุณสามารถลองได้ที่นี่https://ideone.com/m4f2ra


2

Python (ไม่มี regex), 105 ไบต์

def f(s):t=s.strip('.\n');return not['\n'in t,len(t)%(s.find('\n')+1)!=1,1]['>O<vO^'.find(t[0]+t[-1])//3]

ส่งคืนจริงหรือเท็จ

ก่อนอื่นแถบ '.' และ '\ n' จากท้ายเพื่อให้อักขระที่น่าสนใจ '0 <> v ^' เป็นอักขระตัวแรกและตัวสุดท้าย

'>O<vO^'.find(t[0]+t[-1])//3- ตรวจสอบว่าตัวละครนั้นเป็นข้อตกลงที่ถูกต้องหรือไม่ หาค่าเป็น 0 สำหรับ '> O' หรือ 'O <' ถึง 1 สำหรับ 'vO' หรือ 'O ^' และถึง -1 สำหรับสิ่งอื่นใด

'\n'in t- ตรวจสอบว่าอักขระอยู่ในแถวที่ต่างกันหรือไม่
len(t)%(s.find('\n')+1)!=1- ตรวจสอบว่าอักขระนั้นอยู่ในคอลัมน์ที่แตกต่างกันและ
1 - เป็นค่าเริ่มต้น

กลับnotค่าผลลัพธ์ที่เลือกจากรายการดังนั้นการreturnแสดงออกจึงเท่ากับ:

t[0]+t[-1] in '>0<' and '\n' not in t or t[0]+t[-1] in 'vO^' and len(t)%(s.find('\n')+1)==1

2

จูเลีย (ไม่มี regex), 98

a->(c=rotr90(a,findlast("i1Q/",sum(a-46)));
    f(n)=find(any(c.!='.',n));b=c[f(2),f(1)];
    (b'*b)[1]==97)

ฟังก์ชั่นการทำงานกับอาเรย์ของตัวอักษร, การทำให้เป็นมาตรฐานโดยการหมุน, การลบแถวและคอลัมน์ที่มีจุดเท่านั้นโดยการทำดัชนีช่วงและสุดท้ายตรวจสอบตำแหน่งของ 'O' โดยคำนึงถึงว่าเศษที่เหลือ b เป็นคอลัมน์หรือเวกเตอร์แถว

ลองออนไลน์


1

Python 2 (ไม่มี regex), 268 ไบต์

import numpy
def q(i):
 s=numpy.asmatrix(i)
 for n in s:
  n=n.tolist()[0]
  try:
   a=n.index("0")
   if n.index(">")<a or n.index("<")>a:return 1
  except:0
 for n in range(len(i)):
  c=[x[0] for x in s[:,n].tolist()]
  try:
   a=c.index("0")
   if c.index("v")<a or c.index("^")>a:return 1
  except:0
 return 0

ค่า Truthy และ Falsy ที่ส่งคืนโดยฟังก์ชันคือ 1 และ 0 ตามลำดับ

ฉันยังไม่มีโอกาสเล่นกอล์ฟ สุจริตฉันไม่หวังเกินไปสำหรับคนนี้ ...

ข้อเสนอแนะใด ๆ ที่จะได้รับการชื่นชมอย่างมาก!


1

C # (ไม่มี Regex) 282 ไบต์

bool F(char[,]b){int k=0,l=1,m=1,n=0,o=0;for(int x=0;x<b.GetLength(0);x++)for(int y=0;y<b.GetLength(1);y++){char i=b[x,y];if(i=='O'){k=x;l=y;}if(new[]{'<','>','^','v'}.Contains(i)){m=x;n=y;o=i;}}return(o==60&&k==m&&l<n)||(o==62&&k==m&&l>n)||(o==94&&l==n&&k<m)||(o==118&&l==n&&k>m);}

ทำงานเหมือนรุ่นจาวา แต่สามารถ transpiled และลดลงได้

ขยาย (รวมคำอธิบาย):

bool F(char[,] b)
{
    // declare variables for goal x, goal y, laser x, laser y, and laser direction respectively (laser direction is char code for directions)
    int k = 0, l = 0, m = 0, n = 0, o = 0;
    // go through each cell
    for (int x = 0; x < b.GetLength(0); x++)
    {
        for (int y = 0; y < b.GetLength(1); y++)
        {
            // get cell contents
            char i = b[x, y];
            // set goal position if goal
            if (i == 'O')
            {
                k = x;
                l = y;
            }
            // set laser position and direction if laser
            if (new[]{ '<', '>', '^', 'v' }.Contains(i))
            {
                m = x;
                n = y;
                o = i;
            }
        }
    }
    // check everything is on the same line and in right direction
    return (o == 60 && k == m && l < n) ||
           (o == 62 && k == m && l > n) ||
           (o == 94 && l == n && k < m) ||
           (o == 118 && l == n && k > m);
}

0

C (ANSI) (ไม่มี regex), 237 ไบต์

#define l b[1][i]
main(i,b,c,d,x,y,z,p)char **b;{for(y=z=i=0,x=1;z<2&&(l==10?x=0,++y:1);i++,x++)if(l>46){if(l!=79)p=l;if(!z++)c=x,d=y;}i--;x--;z=(c==x)*((p=='v')*(l==79)+(p==94)*(l==p))+(d==y)*((p==60)*(l==p)+(p==62)*(l==79));return z;}

ขยาย:

#define l b[1][i]
main(i,b,c,d,x,y,z,p)char **b;{
    for(y=z=i=0,x=1;z<2&&(l==10?x=0,++y:1);i++,x++)
        if(l>46){if(l!=79)p=l;if(!z++)c=x,d=y;}
    i--;x--;
    z=(c==x)*((p=='v')*(l==79)+(p==94)*(l==p))+(d==y)*((p==60)*(l==p)+(p==62)*(l==79));
    printf("%i\n",z);
    return z;
}

ฉันคิดว่าฉันใช้วิธีการที่แตกต่างกันอย่างเหมาะสมที่นี่เมื่อเทียบกับการใช้งาน Java หรือ C # ฉันได้พิกัดของ 'O' และลูกศร ((c, d) และ (x, y)) แล้วเปรียบเทียบกับพวกเขาเพื่อดูว่าลูกศรชี้ไปในทิศทางที่ถูกต้องหรือไม่

ส่งคืน 0 ถ้าเท็จและ 1 ถ้าเป็นจริง


0

Grime v0.1 , 31 ไบต์

n`\>.*a|a.*\<|\v/./*/a|a/./*/\^

ไม่ใช่ทางออกที่น่าสนใจมาก พิมพ์1สำหรับอินสแตนซ์ที่แท้จริงและ0สำหรับคนที่เป็นเท็จ ลองออนไลน์!

คำอธิบาย

เราเพียงแค่ค้นหาสี่เหลี่ยมอินพุตสำหรับรูปแบบขนาดเล็กที่สุด (n × 1 หรือ 1 × n) ที่มีเลเซอร์และเป้าหมายตามลำดับที่ถูกต้อง n`ธงทำให้ล่ามพิมพ์จำนวนของการแข่งขันของที่มีจะเป็นที่หนึ่งมากที่สุด ส่วนที่เหลือของบรรทัดประกอบด้วยสี่รูปแบบคั่นด้วย|-characters ซึ่งหมายถึงตรรกะหรือ OR: สี่เหลี่ยมผืนผ้าถูกจับคู่ถ้าตรงกับหนึ่งในรูปแบบ รูปแบบการทำงานดังต่อไปนี้:

\>.*a    Literal ">", horizontal row of any chars, one alphabetic char
a.*\<    One alphabetic char, horizontal row of any chars, literal "<"
\v/./*/a Literal "v", on top of vertical column of any chars, on top of one alphabetic char
a/./*/\^ One alphabetic char, on top of vertical column of any chars, on top of literal "^"
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.