Tia sẽ đánh?


31

Một tia laser bắn ra một chùm tia thẳng theo một trong bốn hướng trực giao, được chỉ định bởi <>^v. Xác định xem nó sẽ bắn trúng mục tiêu Otrên lưới hình chữ nhật.

Mỗi trong số này sẽ đạt (True):

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

>O.
...

v....
O....

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

Những cái này sẽ bỏ lỡ (Sai):

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

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


.O.
...
.v.

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

Đầu vào: Một lưới hình chữ nhật .có kích thước tối thiểu 2x2, với chính xác một mục tiêu Ovà một laser là một trong số đó <>^v. Các dòng có thể là một danh sách các chuỗi, một mảng 2D hoặc danh sách các ký tự lồng nhau hoặc một chuỗi được phân tách bằng một dòng mới với một dòng mới tùy chọn.

Đầu ra : Một giá trị trung thực nhất quán nếu tia laser chiếu vào mục tiêu và giá trị sai lệch nhất quán nếu nó bỏ lỡ.

Tôi sẽ xem xét các bài nộp không sử dụng biểu thức thông thường (hoặc khớp chuỗi dựa trên mẫu có sẵn) làm danh mục riêng. Nếu bạn đặt (no regex)sau tên ngôn ngữ, câu trả lời của bạn sẽ xuất hiện riêng trong bảng thành tích.



6
Tôi đã hy vọng bạn sẽ bao gồm gương với /\ . Có thể cho một câu hỏi khác ...
vsz

2
@Mego ... điều này làm cho thử thách này đơn giản hơn rất nhiều và cho phép các cách tiếp cận rất khác nhau.
Martin Ender

2
@Mego Tôi không đồng ý; theo logic đó, thử thách chào thế giới đơn giản là một bản sao của hàng tá thử thách khác cùng một lúc. Dù sao, cảm ơn vì đã thông báo cho tôi về sức mạnh mà bây giờ tôi phải đóng / mở lại các thử thách golf mã, tôi đã không nhận ra điều đó.
aditsu

5
@Mego Mặc dù câu hỏi này là một trường hợp đặc biệt của câu hỏi khác, tôi không tin đó là một bản sao vì các câu trả lời sử dụng các cách tiếp cận hoàn toàn khác nhau. Về câu hỏi đó, tất cả họ đều tính toán đường đi của chùm tia. Cổng có thể di chuyển con đường từ bất cứ nơi nào đến bất cứ nơi nào mà dường như không cho phép một lối tắt, và phản xạ rất khó xử lý. Câu trả lời ở đây thay vì chủ yếu kiểm tra hoặc khớp một số thuộc tính của chuỗi đầu vào. Chắc chắn, bạn có thể sao chép câu trả lời theo dõi đường dẫn từ thử thách khác và loại bỏ các bit thừa, nhưng phương pháp này là quá mức cần thiết và đưa ra một giải pháp dài không cần thiết.
xnor

Câu trả lời:


27

Ốc , 19 byte

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

Thông số kỹ thuật cho cái này có thể được thực hiện theo nghĩa đen nhất có thể, không cần suy nghĩ.


6
Bạn có thể thêm một lời giải thích về cách thức này hoạt động?
Vụ kiện của Quỹ Monica

5
@QPaysTaxes Cho đến khi frageum có được nó, hy vọng điều này sẽ có ích: Ốc sên là một ngôn ngữ phù hợp với mô hình 2D. udlrđặt hướng của ốc lên / xuống / trái / phải. |hoạt động giống như trong regex thông thường và )không cần dấu ngoặc đơn mở. Vì vậy, đoạn mã khá trực tiếp dịch thành "Tìm một trong số đó v<>^và đặt hướng thích hợp, sau đó thử tìm một O theo hướng đó."
FryAmTheEggman

Vâng, những gì Eggman nói. Điều khác duy nhất ,là giống như *của regex.
frageum

13

Võng mạc, 56 52 42 38 31 30 byte

Đã lưu 1 byte nhờ @ MartinBüttner

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

Lạm dụng tính chất của hình chữ nhật. Yêu cầu đầu vào để có một dòng mới.

Dùng thử trực tuyến

Giải trình

Điều này hoạt động trong ba phần:

  • Phù hợp >
  • Phù hợp <
  • Phù hợp ^vđiều này là do logic cho ^vthực sự giống nhau, chỉ là các nhân vật.

Xác thực <

Cái này đơn giản:

O.*<

Điều này phù hợp với một O, tùy chọn theo sau là ký tự không phải dòng mới, sau đó một<

Xác thực >

Cách này cũng giống như cách trước, ngoại trừ cách khác. Đầu tiên a >được khớp, sau đóO

Xác nhận ^v

Điều này là khó khăn để chơi golf và quảng cáo đầu vào luôn luôn hợp lệ. Đầu tiên, chúng tôi phù hợp cho dù đó là vhoặc một O:

[vO]

Nếu đó là một ^, nhân vật đầu tiên gặp phải phải là a O. Vì vậy, điều này phù hợp với nhân vật đầu tiên phù hợp. Tiếp theo, chúng tôi đếm số lượng .s theo sau dòng mới:

(.*\n)

Tiếp theo, điều này có thể đi vào hai phần, tôi sẽ trình bày phần đầu tiên:

Vì vậy, trước tiên, chúng tôi khớp cho đến sau O, sử dụng:

[^O]*O

Tùy chọn này phù hợp với tất cả các Oký tự không cho đến khi Ogặp phải, nếu điều này thành công, thì nó vẫn tiếp tục ... nếu không, thì điều sau đây xảy ra ...

Bây giờ, nó cố gắng tìm ^cách sử dụng:

[^^]*\^

^là một nhân vật đặc biệt trong regex vì vậy nó cần phải được trốn thoát. [^^]phù hợp với tất cả các ký tự ngoại trừ ^, điều này hoạt động giống như trên, nếu điều này thành công, thì điều sau đây xảy ra ...

Vì vậy, bây giờ, một trong những điều trên đã khớp với thành công, \1kiểm tra và xem nếu nhóm bắt giữ từ trước (.*\n), nhóm chụp này đã lưu trữ số lượng .s có sau vhoặc Otừ trước đó, vì vậy bây giờ \1chỉ cần kiểm tra xem số lượng dấu chấm trong tương tự.


Bạn có thể lưu một byte bằng cách sử dụng thay vì \n(Retina có thể xử lý mã nguồn theo ISO 8859-1.)
Martin Ender

@ MartinBüttner nghĩ chỉ là \ n thay thế, cảm ơn vì tiền boa!
Hạ cấp

không nó hoạt động ở bất cứ đâu trong mã nguồn. Sau khi chia tệp thành các dòng, điều đầu tiên Retina làm là thay thế mọi nơi, trước khi thực hiện bất kỳ phân tích cú pháp nào nữa.
Martin Ender

9

Java (không có biểu thức chính quy), 413 412 246 242 212 211 209 198 byte

Cạnh tranh trong các thử thách chơi gôn bằng java có ý nghĩa ít hơn là tham gia cuộc đua Công thức 1 trên xe đạp, nhưng tôi không phải lúc nào cũng nghĩ rằng điều đó có ý nghĩa.

Đây là giải pháp java cực kỳ dài của tôi

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]);}

và vô lương tâm

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]);
}

Có vẻ như toàn bộ khái niệm của tôi đã sai, đây là giải pháp ngắn hơn của tôi

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

và phiên bản không linh hoạt

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

EDIT Tôi viết lại mã để tìm kiếm 'O', bây giờ nó chứa một vòng lặp ngắn hơn nhiều và tôi cũng đã sử dụng đề xuất @Frozn để thay thế một số ký tự bằng các giá trị ascii của chúng.

Kết quả là 30 byte khác cắn bụi.

Một đề xuất khác từ @Frozn và chúng tôi là một vài byte gần hơn với giải pháp Python

Một lần viết lại khác thả một vòng lặp và kết hợp hai câu lệnh if


1
+1 Bạn có thể xóa khoảng trống giữa return(để lưu một byte. Không gian không cần thiết khi giá trị trả về của bạn nằm trong dấu ngoặc đơn (hoặc dấu ngoặc kép cho Chuỗi). Nguồn từ các mẹo chơi gôn mã Java.
Kevin Cruijssen

@KevinCruijssen không tiết kiệm nhiều, nhưng cảm ơn :)
user902383

Mỗi một chút (hoặc tôi nên nói byte) giúp tôi đoán. ;) Bên cạnh đó, tôi không nghĩ Java sẽ chiến thắng thử thách chơi gôn. Mặc dù vậy, tôi vẫn thích thực hiện các thử thách chơi gôn mã trong Java, đặc biệt là vì tôi hiện đang làm việc với Java tại nơi làm việc.
Kevin Cruijssen

Bạn có thể thay thế các ký tự theo giá trị ASCII của họ: 'O' = 79, '>' = 62, '<' = 60, '^' = 94. Đối với 'v' là 118 nhưng điều đó không rút ngắn mã.
Frozn

@Frozn như Kevin đã nói, trong mỗi byte được tính.
dùng902383

7

MATL (không có biểu thức chính quy), 26 25 24 22 byte

'>v<^'XJymfX!tZpYswJm)

Hãy thử trực tuyến!

Phiên bản sửa đổi cho tất cả các trường hợp thử nghiệm

Giải trình

        % 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 Bây giờ để tìm ra cách thoát khỏiJ
Suever

Tôi không biết MATL, vì vậy đây có thể là một câu hỏi ngớ ngẩn, nhưng tại sao lại là 0 số nguyên tố?
Neil

3
@Neil Đó là thư 'O', không phải số 0. Mã ASCII cho thư 'O'79
Luis Mendo

Ugh, tôi đoán tôi vẫn sẽ bị lừa nếu bạn đang tìm kiếm số lẻ thay thế.
Neil

5

CJam (không có biểu thức chính quy), 25

Các phiên bản trước đó đã sai, điều này sẽ phải làm ngay bây giờ:

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

Dùng thử trực tuyến

Giải trình:

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

Tôi đã thử một vài công thức toán học để phân biệt giữa các chuỗi "tốt" và "xấu" và với mỗi loại công thức tôi đã thử cắm nhiều số khác nhau. Tôi đã kết thúc với những điều HbI%trên.

Các chuỗi "tốt" cho lưới ban đầu là "> O" và "O <" và chúng cho kết quả 17
chuỗi "tốt" cho lưới được chuyển đổi là "vO" và "O ^" và chúng cho kết quả 15
"xấu" các chuỗi cho cả hai lưới là: ">", "<", "^", "v", "O", "", "O>", "Ov", "<O", "^ O" và chúng cho kết quả 8, 6, 4, 10, 7, 0, 1, 3, 1, 3


3

Python 3 (không có regex), 184 byte.

Hoan hô hack hack!

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) (không có biểu thức chính quy), 358 byte

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)

Phải sử dụng linechange vui nhộn trong khai báo để buộc phiên bản trực tuyến thực thi nó (việc gán giá trị cho các biến đầu vào không ảnh hưởng đến việc tính toán độ dài)

Hãy thử trực tuyến!



2

JavaScript (ES6), 78 byte

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

Tất nhiên. Hóa ra nguyên tắc tương tự như câu trả lời của Ruby.


2

Ruby, 71 55 54 byte

Giải pháp Regex, có nghĩa là có thể sẽ dễ dàng bị Retina hoặc Perl đánh bại.

Trả về số chỉ mục (trung thực) nếu có kết quả khớp.

Bây giờ với một mẹo tương tự như câu trả lời @Downgoat Retina, khớp với các chùm xuống và lên cùng một lúc.

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

2

JavaScript (ES6) (không có biểu thức chính quy), 126 byte

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)

Trường hợp \nđại diện cho nhân vật dòng chữ mới.


2

Clojure (không có regex), 293 byte

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

Không cảm thấy tuyệt vời. Giải pháp đơn giản, tìm chỉ mục của các ký tự tương ứng và tính toán nếu chúng nằm trên cùng một dòng.

Bạn có thể dùng thử tại đây https://ideone.com/m4f2ra


2

Python (không có regex), 105 byte

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]

trả về Đúng hay Sai

Đầu tiên, dải '.' và '\ n' từ cuối để các ký tự quan tâm, '0 <> v ^', là các ký tự đầu tiên và cuối cùng.

'>O<vO^'.find(t[0]+t[-1])//3- kiểm tra nếu các ký tự là một sự sắp xếp có khả năng hợp lệ. Đánh giá thành 0 cho '> O' hoặc 'O <', thành 1 cho 'vO' hoặc 'O ^' và -1 cho bất kỳ điều gì khác.

'\n'in t- kiểm tra xem các ký tự có ở các hàng khác nhau không
len(t)%(s.find('\n')+1)!=1- kiểm tra xem chúng có ở các cột khác nhau không và
1 - là mặc định

Các notđảo ngược kết quả được lựa chọn từ danh sách, vì vậy các returnbiểu hiện tương đương với:

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

Julia (không có biểu thức chính thức), 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)

Hàm hoạt động trên một mảng ký tự, chuẩn hóa bằng cách xoay, loại bỏ các hàng và cột chỉ chứa các dấu chấm bằng cách lập chỉ mục phạm vi và cuối cùng kiểm tra vị trí của 'O' có tính đến nếu phần còn lại là vectơ cột hoặc hàng sử dụng phép nhân ma trận.

Dùng thử trực tuyến


1

Python 2 (không có regex), 268 byte

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

Giá trị Truthy và Falsy được trả về bởi hàm lần lượt là 1 và 0.

Tôi chưa có cơ hội chơi gôn. Thành thật mà nói, tôi không quá hy vọng vào điều này ...

Bất kỳ đề xuất sẽ được đánh giá rất cao!


1

C # (Không có Regex), 282 byte

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);}

Hoạt động như phiên bản java nhưng được phiên mã và giảm

Mở rộng (Bao gồm giải thích):

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) (Không có biểu thức chính quy), 237 byte

#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;}

Mở rộng:

#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;
}

Tôi nghĩ rằng tôi đã thực hiện một cách tiếp cận khác biệt ở đây so với các triển khai Java hoặc C #. Tôi có tọa độ của 'O' và mũi tên ((c, d) và (x, y)) và sau đó so sánh chúng để xem mũi tên có chỉ đúng hướng hay không.

Trả về 0 nếu sai và 1 nếu đúng


0

Grime v0.1 , 31 byte

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

Không phải là một giải pháp rất thú vị. In 1cho các trường hợp trung thực, và 0cho những người giả mạo . Hãy thử trực tuyến!

Giải trình

Chúng tôi chỉ cần tìm kiếm hình chữ nhật đầu vào cho mẫu có kích thước tối thiểu (n × 1 hoặc 1 × n) có chứa tia laser và mục tiêu theo đúng thứ tự. Các n`lá cờ làm cho thông dịch viên in số lượng các trận đấu, trong đó sẽ luôn có ít nhất một. Phần còn lại của dòng bao gồm bốn mẫu được phân tách bằng |-char character, có nghĩa là logic OR: một hình chữ nhật được khớp nếu nó khớp với một trong các mẫu. Các mẫu hoạt động như sau:

\>.*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 "^"
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.