Pandu Alfabet

20

Pandu Alfabet

Diberikan array arah, di mana arah didefinisikan sebagai berikut:

NW  N  NE
W   .   E
SW  S  SE

Atau sebagai indeks (Anda dapat menggunakan indeks ini untuk arah alih-alih string di atas):

0 1 2
3 . 4
5 6 7

Anda dapat memilih salah satu format, mendukung keduanya tidak diperlukan oleh tantangan. Hasilkan String alfabet yang sesuai yang mewakili jalur yang digambar, dimulai dengan A. Jumlah arah tidak akan pernah melebihi 25, yang berarti bahwa itu tidak akan pernah bisa melewati Z, sehingga Anda tidak harus menangani skenario ini. Tidak ada format input lain yang akan diterima kecuali Anda dapat menjelaskan mengapa format ini tidak berfungsi karena keterbatasan bahasa. Ini lebih mudah dijelaskan dengan menggunakan contoh yang dikerjakan secara verbal.


Jadi, mari kita lihat contoh cepat:

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

Selalu mulai dengan A.

A

Pergi ke Timur ke B.

A-B

Pergi Tenggara ke C.

A-B 
   \
    C

Pergi ke Utara ke D.

A-B D
   \|
    C

Kembali ke Selatan ke E, menimpa C.

A-B D
   \|
    E

Terus ke Selatan selama 2 siklus ke F dan G.

A-B D
   \|
    E
    |
    F
    |
    G

Pergi ke Barat Laut ke H.

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

Pergi ke Barat ke I.

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

Berakhir ke Utara di titik J.

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

Nilai akhir yang akan Anda kembalikan adalah dengan membaca grafik terakhir dari kiri ke kanan, atas ke bawah:

ABD
JE
IHF
G

Yang menghasilkan:

ABDJEIHFG

Ini adalah , kemenangan byte-count terendah.

Guci Gurita Ajaib
sumber
1
Terkait
FlipTack
1
Bisakah kita mengambil sebagai input 7 pasangan nilai yang berbeda, bukan nilai yang Anda usulkan. misalnya bukannya 0 kita dapatkan [-1 -1] atau untuk 1 kita mendapatkan [-1 0]?
rahnema1
@ rahnema1 tidak, inputnya seperti yang dijelaskan.
Magic Gurita Guci
Bisakah kita mengembalikan array karakter bukan string
Kritixi Lithos
2
Apakah mungkin bahwa Anda dapat kembali kasus tes di mana nilai-nilai berakhir ke kiri dari Asehingga Atidak akan hasil pertama dicetak?
Suever

Jawaban:

6

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

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

Cobalah di MATL Online

Penjelasan

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
Suever
sumber
1
Oh wow! Saya pikir Mendo melakukan ini! Bagus :) Biasanya dia memenangkan pertanyaan matriks saya, senang melihat orang lain menggunakan bahasa ini. Saya mencoba untuk belajar nit juga.
Magic Octopus Mm
12

JavaScript (ES6), 108 107 94 87 byte

Menyimpan 13 byte kekalahan, terima kasih kepada Titus!
Disimpan 7 byte lebih, terima kasih kepada 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]));

Bagaimana itu bekerja

Rumus (d += d > 3) * 9 - d % 3 * 8 - 28menerjemahkan petunjuk 0..7ke dalam offset berikut:

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

Kami menggunakan offset ini untuk memindahkan pointer pke array satu dimensi rdan menulis huruf pada posisi yang dihasilkan.

Kami beralih [i = 9, ...a]bukan hanya auntuk memasukkan huruf awal 'a'. Karena kita menginisialisasi iuntuk 9pada saat yang sama, kami memperkenalkan khusus offset 54 (hasil dari rumus di atas untuk d = 9). Setelah iterasi pertama, psama 646 + 54 = 700, yang meninggalkan hanya cukup ruang untuk mendukung hingga 25 bergerak ke North-West: 25 * -28 = -700. Itu sebabnya pdiinisialisasi ke 646.

Maka kita hanya harus bergabung dengan array untuk mendapatkan string terakhir kita. Nilai yang tidak terdefinisi di antara huruf diabaikan begitu saja join().

Arnauld
sumber
d+=d>3,p+=d*9-d%3*8-28menghemat 11 byte.
Titus
@Titus Terima kasih, tempat yang bagus! (Sekarang saya dapat menginisialisasi idalam definisi array, menghemat 2 byte lebih)
Arnauld
Seperti yang ditentukan OP bahwa huruf kecil diperbolehkan, mungkin Anda dapat menyimpan 7 byte mulai dari 9 dan menggunakan (++i).toString(36)(masih tidak berusaha memahami matematika Anda, tetapi tampaknya berhasil)
edc65
@ edc65 Sialan benar. Terima kasih!
Arnauld
5

Oktaf, 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}

Cobalah secara Online

Terima kasih kepada Suever 2 byte yang disimpan!

Jawaban sebelumnya 103 byte:

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

Cobalah secara Online!

Pertama coba 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}

Beberapa Penjelasan

@(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}
rahnema1
sumber
1
Saya percaya bahwa karena Anda memerlukan imagepaket bagian dari bytecount Anda harus memuat paket gambarpkg load image
Suever
Terima kasih, tidak perlu memuat jika paket terpasang dengan benar, Anda dapat mengujinya di Octave Online
rahnema1
Saya percaya itu hanya karena Octave Online menelepon pkg load *di awal. ideone.com mungkin menjadi pilihan yang lebih baik
Suever
paket harus diinstal dengan cara ini pkg install -auto image-1.0.0.tar.gzsehingga dapat dimuat secara otomatis. Silakan lihat manual
rahnema1
Oke, mungkin baik-baik saja. Saya baru saja pergi dari apa yang saya lihat sebelumnya di sini.
Suever
5

MATLAB, 87 85 byte

menyimpan 2 byte berkat Luis Mendo

function a=f(s);i='()*BD\]^'-67;[~,a]=unique([0 cumsum(i(s+1))],'last');a=[a'+64,''];
gnovice
sumber
'%&''?AYZ['-64trik yang bagus ... sebenarnya 66 byte jika Anda menulis ulang dalam oktaf
rahnema1
4

PHP, 93 byte

Beroperasi pada larik tunggal seperti jawaban Kodos Johnson .
Tetapi ini memiliki lebih banyak ide yang saya posting sendiri.

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

mengambil angka dari argumen baris perintah. Jalankan dengan -nr.

memindahkan kursor

perhitungan awal:

$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

bermain golf:

$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

menggabungkan tugas tidak menyimpan apa pun, tetapi jenis meningkatkan keterbacaan:

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

kerusakan

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
Titus
sumber
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)
ovs
sumber
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);

Ini berjalan di baris perintah dengan -rbendera dan mengambil array char (string) indeks sebagai argumen.

Kodos Johnson
sumber
Anda dapat menghemat 5 byte mudah dengan ""<$n=$argv[1][$i]alih - alih($n=$argv[1][$i])!=null
Titus
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="")
ixodesbeta
sumber