Hướng dẫn bảng chữ cái


20

Hướng dẫn bảng chữ cái

Đưa ra một mảng các hướng, trong đó các hướng được xác định như sau:

NW  N  NE
W   .   E
SW  S  SE

Hoặc dưới dạng chỉ mục (bạn có thể sử dụng các chỉ mục này cho chỉ đường thay vì các chuỗi ở trên):

0 1 2
3 . 4
5 6 7

Bạn có thể chọn một trong hai định dạng, không hỗ trợ cả hai định dạng. Tạo Chuỗi bảng chữ cái tương ứng đại diện cho đường dẫn đã vẽ, bắt đầu bằng A. Số lượng hướng sẽ không bao giờ vượt quá 25, nghĩa là nó không bao giờ có thể đi qua Z, vì vậy bạn không phải xử lý tình huống này. Không có định dạng đầu vào nào khác được chấp nhận trừ khi bạn có thể giải thích tại sao các định dạng này không hoạt động do giới hạn ngôn ngữ. Điều này là dễ dàng hơn để giải thích bằng cách sử dụng một ví dụ làm việc rõ ràng.


Vì vậy, hãy xem xét một ví dụ nhanh:

[E,SE,N,S,S,S,NW,W,N] or [4,7,1,6,6,6,0,3,1]

Luôn luôn bắt đầu với A.

A

Đi về phía đông đến B.

A-B

Đi về hướng Đông Nam đến C.

A-B 
   \
    C

Đi về phía Bắc đến D.

A-B D
   \|
    C

Quay trở lại Nam để E, ghi đè C.

A-B D
   \|
    E

Tiếp tục Nam trong 2 chu kỳ đến cả F và G.

A-B D
   \|
    E
    |
    F
    |
    G

Đi về hướng Tây Bắc đến H.

A-B D
   \|
    E
    |
  H F
   \|
    G

Đi về phía Tây

A-B D
   \|
    E
    |
I-H F
   \|
    G

Kết thúc về phía Bắc tại điểm J.

A-B D
   \|
J   E
|   |
I-H F
   \|
    G

Giá trị cuối cùng bạn sẽ trả về là bằng cách đọc biểu đồ cuối cùng từ trái sang phải, từ trên xuống dưới:

ABD
JE
IHF
G

Kết quả là:

ABDJEIHFG

Đây là , byte thấp nhất.



1
Chúng tôi có thể lấy 7 cặp giá trị đầu vào thay vì giá trị đề xuất của bạn không. ví dụ thay vì 0 chúng ta nhận được [-1 -1] hay với 1 chúng ta nhận được [-1 0]?
rahnema1

@ rahnema1 không, đầu vào như mô tả.
Bạch tuộc ma thuật Urn

Chúng ta có thể trả lại một loạt các ký tự thay vì một chuỗi
Kritixi Lithos

2
Có thể rằng bạn có thể trả về một trường hợp thử nghiệm nơi các giá trị kết thúc với trái của Anhư vậy Asẽ không được kết quả đầu tiên in?
Suever

Câu trả lời:


6

MATL , 64 58 57 50 46 40 37 36 35 30 byte

O'!":<TUV '59-G)hYsIH$6#u64+c!

Dùng thử tại MATL Online

Giải trình

O           % Push the number 0 to the stack
'!":<TUV '  % String literal
59-         % Converts this string literal into [-26 -25 -1 1 25 26 27 -27]. These
            % are deltas for the linear indexes into the matrix corresponding to each
            % of the directions. Note that the -27 is at the end since a 0 index wraps
            % around to the end
i)          % Grab the input and use it to index into the delta array 
h           % Horizontally concatenate this with the 0 (our starting point)
Ys          % Take the cumulative sum to get the absolute linear index (location) of
            % each successive letter
IH$6#u      % Find the index of the last (sorted) occurrence of each location
64+         % Add 64 to this index to create ASCII codes
c!          % Convert to character, transpose, and display

1
Tuyệt vời! Tôi nghĩ Mendo đã làm điều này! Tốt đẹp :). Thường thì anh ta thắng câu hỏi ma trận của tôi, thật tốt khi thấy người khác sử dụng ngôn ngữ này. Tôi cũng đang cố gắng nới lỏng nit.
Bạch tuộc ma thuật Urn

12

JavaScript (ES6), 108 107 94 87 byte

Đã tiết kiệm được 13 byte, nhờ Titus!
Đã lưu thêm 7 byte, nhờ edc65!

let f =

a=>[i=9,...a].map(d=>r[p+=(d+=d>3)*9-d%3*8-28]=(++i).toString(36),r=[],p=646)&&r.join``

console.log(f([4,7,1,6,6,6,0,3,1]));

Làm thế nào nó hoạt động

Công thức (d += d > 3) * 9 - d % 3 * 8 - 28dịch các hướng 0..7thành các phần bù sau:

0   1   2       -28 -27 -26
3   x   4  -->   -1  x   +1
5   6   7       +26 +27 +28

Chúng tôi sử dụng các offset này để di chuyển con trỏ pvào mảng một chiều rvà viết các chữ cái ở các vị trí kết quả.

Chúng tôi lặp đi lặp lại [i = 9, ...a]thay vì chỉ ađể chèn chữ cái bắt đầu 'a'. Bởi vì chúng ta khởi tạo iđến 9cùng một lúc, chúng tôi giới thiệu một đặc biệt bù đắp 54 (kết quả của công thức trên cho d = 9). Sau lần lặp đầu tiên, pbằng 646 + 54 = 700, để lại không gian vừa đủ để hỗ trợ tối đa 25 di chuyển đến Tây Bắc : 25 * -28 = -700. Đó là lý do tại sao pđược khởi tạo 646.

Sau đó, chúng ta chỉ cần tham gia vào mảng để có được chuỗi cuối cùng của chúng tôi. Các giá trị không xác định ở giữa các chữ cái chỉ đơn giản là bị bỏ qua bởi join().


d+=d>3,p+=d*9-d%3*8-28tiết kiệm 11 byte.
Tít

@Titus Cảm ơn, chỗ tốt đẹp! (Bây giờ tôi có thể khởi tạo iđịnh nghĩa mảng, tiết kiệm thêm 2 byte)
Arnauld

Như OP đã chỉ định rằng chữ thường được cho phép, có thể bạn có thể lưu 7 byte bắt đầu từ 9 và sử dụng (++i).toString(36)(vẫn không cố hiểu toán của bạn, nhưng có vẻ như nó hoạt động)
edc65

@ edc65 Chết tiệt. Cảm ơn!
Arnauld

5

Octave, 145 138 131 123 105 103 90 87 85 byte

@(a){[~,k]=unique(cumsum([1 fix((z=a+(a>3))/3);1 mod(z,3)]'-1),'rows');[k'+64 '']}{2}

Dùng thử trực tuyến

Nhờ Suever lưu 2 byte!

Câu trả lời trước 103 byte:

@(a)[nonzeros(accumarray(cumsum([1 fix((z=a+(a>3))/3);1 mod(z,3)]'-1)+30,65:nnz(++a)+65,[],@max)')' '']

Dùng thử trực tuyến!

Lần đầu tiên thử 145 byts

@(a){[x y]=find(~impad(1,1,1));c=cumsum([0 0;([y x]-2)(++a,:)]);c=c-min(c)+1;n=nnz(a);[nonzeros(sparse(c(:,1),c(:,2),65:n+65,'unique')')' '']}{5}

Một số giải thích

@(a){
    [x y]=find([1 0 1]|[1;0;1]);                            %generate 2d coordinates corresponding to 1d input indices
    XY = [y x]-2;
    c=cumsum([0 0;XY(++a,:)]);                              %cumulative sum of coordinates to find position of characters
    c=c-min(c)+1;n=nnz(a);
    [nonzeros(sparse(c(:,1),c(:,2),65:n+65,'unique')')' ''] %using sparse matrix to place characters at specified positions
    }{5}

1
Tôi tin rằng vì bạn cần imagemột phần gói của bytecount của bạn phải tải gói hình ảnhpkg load image
Suever

Cảm ơn, không cần tải nếu gói được cài đặt đúng cách, bạn có thể kiểm tra gói trong Octave Online
rahnema1

Tôi tin rằng đó chỉ là do các cuộc gọi trực tuyến Octave pkg load *lúc đầu. ideone.com có ​​thể là lựa chọn tốt hơn
Suever

gói nên được cài đặt theo cách này pkg install -auto image-1.0.0.tar.gzđể nó có thể tải tự động Vui lòng xem hướng dẫn
rahnema1

Ok, có lẽ nó ổn. Tôi vừa mới đi ra khỏi những gì tôi đã thấy trước đây.
Suever

5

MATLAB, 87 85 byte

đã lưu 2 byte nhờ Luis Mendo

function a=f(s);i='()*BD\]^'-67;[~,a]=unique([0 cumsum(i(s+1))],'last');a=[a'+64,''];

'%&''?AYZ['-64mẹo hay ... thực sự là 66 byte nếu bạn viết lại trong quãng tám
rahnema1

4

PHP, 93 byte

Hoạt động trên một mảng duy nhất như câu trả lời của Kodos Johnson .
Nhưng điều này có rất nhiều ý tưởng mà tôi tự đăng.

for($r=[$c=A];""<$d=$argv[++$i];)$r[$p+=($d+=$d>3)*9-$d%3*8-28]=++$c;ksort($r);echo join($r);

lấy số từ các đối số dòng lệnh. Chạy với -nr.

di chuyển con trỏ

tính toán ban đầu:

$d+=$d>3;           // if $d>3, add 1
$p+= ($d/3-1|0)*26  // add/subtract 26 for line change
    +$d%3-1;        // add/substract 1 for column change

chơi gôn

$d+=$d>3;$p+=($d/3-1|0)*27+$d%3-1;          // +0: multiple of 3 instead of 26
$d+=$d>3;$p+=($d/3|0)*27-27+$d%3-1;         // +1: distribute `line-1`
$d+=$d>3;$p+=($d/3)*27-$d%3/3*27-27+$d%3-1; // +8: distribute `|0`
$d+=$d>3;$p+=$d*9-$d%3*9-27+$d%3-1;         // -8: `/3*27` -> `*9`
$d+=$d>3;$p+=$d*9-$d%3*8-28;                // -7: combine duplicates

hợp nhất các bài tập không làm mất gì cả, nhưng loại cải thiện khả năng đọc:

for(init;input loop;$p=$d...)$d+=$d>3;
for(init;input loop;)$p=($d+=$d>3)...;

phá vỡ

for($r=[$c=A];                  // init result, init letter
    ""<$d=$argv[++$i];)         // loop through command line arguments
    $r[
        $p+=($d+=$d>3)*9-$d%3*8-28  // move cursor
    ]=++$c;                         // increment letter, plot
ksort($r);                      // sort result by index
echo join($r);                  // print result

3

Python 2, 180 178 176 byte

def f(d,a=[[""]*26 for _ in[1]*26],x=0,y=0,j=66):
 a[0][0]="A"
 for i in d:y+=(i>4)-(i<3);x+=(`i`in'247')-(`i`in'035');a[y][x]=chr(j);j+=1
 return"".join("".join(i)for i in a)

2

PHP, 121 byte

$r[0]=chr(65);for(;($n=$argv[1][$i])!=null;)$r[$c+=[-27,-26,-25,-1,1,25,26,27][$n]]=chr($i+++66);ksort($r);echo join($r);

Điều này chạy trong dòng lệnh với -rcờ và lấy một mảng char (chuỗi) của các chỉ mục làm đối số.


Bạn có thể lưu 5 byte dễ dàng ""<$n=$argv[1][$i]thay vì($n=$argv[1][$i])!=null
Tít

1

R, 160 byte

a=scan()
e=f=26
x=matrix(0,51,51)
x[e,f]="A"
for(i in a){g=function(q)grepl(q,i)
T=T+1
f=f-g("N")+g("S")
e=e-g("W")+g("E")
x[e,f]=LETTERS[T]}
cat(x[x>0],sep="")
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.