Alfabeyi Yönlendir


20

Alfabeyi Yönlendir

Yol tariflerinin aşağıdaki gibi tanımlandığı bir yol tarifleri dizisi verildiğinde:

NW  N  NE
W   .   E
SW  S  SE

Veya dizinler olarak (yukarıdaki dizeler yerine bu dizinleri yol tarifleri için kullanabilirsiniz):

0 1 2
3 . 4
5 6 7

Her iki formatı da seçebilirsiniz, her ikisini de desteklemek zor değildir. A ile başlayarak çizilen yolu temsil eden ilgili alfabe dizesini oluşturun. Yol sayısı hiçbir zaman 25'i geçmeyecektir, yani asla geçemeyeceği anlamına gelir, bu Znedenle bu senaryoyu işlemeniz gerekmez. Bir dil sınırlaması nedeniyle bu biçimlerin neden çalışmadığını açıklayamazsanız, başka girdi biçimleri kabul edilmez. Bu ayrıntılı bir örnek kullanarak açıklamak daha kolaydır.


Şimdi hızlı bir örneğe bakalım:

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

Her zaman A ile başlayın.

A

Doğu'ya B'ye gidin.

A-B

Güney Doğu C

A-B 
   \
    C

Kuzeyden D'ye gidin.

A-B D
   \|
    C

C üzerine yazarak Güney'e E geri dönün.

A-B D
   \|
    E

Hem F hem de G'ye 2 döngü boyunca güneye devam edin.

A-B D
   \|
    E
    |
    F
    |
    G

Kuzey Batı'dan H'ye gidin.

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

Batı'ya I.

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

Kuzey noktasında J noktasında bitirin.

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

Döndüreceğiniz son değer, soldan sağa, yukarıdan aşağıya doğru son grafiği okuyarak olur:

ABD
JE
IHF
G

Sonuçlanan:

ABDJEIHFG

Bu , en düşük bayt sayısı kazanır.



1
Önerilen değerleriniz yerine giriş 7 ayrı değer çiftini alabilir miyiz? örneğin 0 yerine [-1 -1] veya 1 için [-1 0] elde ederiz?
rahnema1

@ rahnema1 hayır, giriş tarif edildiği gibidir.
Sihirli Ahtapot Urn

Dize yerine karakter dizisi döndürebilir miyiz
Kritixi Lithos

2
O değerleri sona nerede bir test vakası dönebilmek mümkün mü solun içinde Aböyle Ailk sonuç basılmaz?
Suever

Yanıtlar:


6

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

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

MATL Online'da deneyin

açıklama

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
Vay canına! Mendo'nun bunu yaptığını sanmıştım! Güzel :). Genellikle matris sorularımı kazanır, bu dili kullanan başka birini görmek güzel. Ben de nit öğrenmeye çalışıyorum.
Sihirli Ahtapot Urn

12

JavaScript (ES6), 108 107 94 87 bayt

Titus sayesinde 13 bayt kurtardı!
Edc65 sayesinde 7 bayt daha kaydetti!

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

Nasıl çalışır

Formül (d += d > 3) * 9 - d % 3 * 8 - 28, talimatları 0..7aşağıdaki ofsetlere çevirir :

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

İşaretçiyi ptek boyutlu diziye taşımak rve harfleri sonuçtaki konumlara yazmak için bu ötelemeleri kullanırız .

Başlangıç ​​harfini 'a' eklemek [i = 9, ...a]yerine tekrarlıyoruz a. Aynı zamanda başlangıç ​​yaptığımız iiçin 954 özel bir ofset (yukarıdaki formülün sonucu) sunuyoruz d = 9. İlk yineleme sonra peşittir 646 + 54 = 700Kuzey-Batı 25 hamle kadar destekleyecek yeterli boşluk bırakır,: 25 * -28 = -700. Bu yüzden pilklendirilir 646.

Sonra son dizemizi almak için diziye katılmak zorundayız. Harfler arasındaki tanımlanmamış değerler tarafından dikkate alınmaz join().


d+=d>3,p+=d*9-d%3*8-2811 bayt kaydeder.
Titus

@Titus Teşekkürler, güzel nokta! (Şimdi idizi tanımında başlatabilirim , 2 bayt daha kaydedebilirim )
Arnauld

OP'nin küçük harflere izin verildiğini belirttiği gibi, belki 9'dan başlayarak ve kullanarak 7 bayt kaydedebilirsiniz (++i).toString(36)(hala matematiğinizi anlamaya çalışmıyorsunuz, ancak işe yarıyor gibi görünüyor)
edc65

@ edc65 Lanet olsun. Teşekkürler!
Arnauld

5

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

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

Çevrimiçi Deneyin

Sayesinde Suever 2 kurtardı bayt!

Önceki cevap 103 bayt:

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

Çevrimiçi Deneyin!

İlk 145 bayt deneyin

@(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}

Bazı Açıklamalar

@(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
imageBayt hesabınızın paket kısmına ihtiyaç duyduğunuzdan , görüntü paketini yüklemesi gerektiğine inanıyorumpkg load image
Suever

Teşekkürler, paket düzgün bir şekilde yüklendiyse yüklemeye gerek yoktur Octave Online'da
rahnema1

Bunun sadece Octave Online'ın pkg load *başlangıçta araması nedeniyle olduğuna inanıyorum . ideone.com daha iyi bir seçim olabilir
Suever

paket bu şekilde kurulmalıdır, pkg install -auto image-1.0.0.tar.gzböylece otomatik olarak yüklenebilir Lütfen el kitabına bakınız
rahnema1

Tamam o zaman belki iyi. Daha önce burada gördüklerimin dışına çıkıyordum .
Suever

5

MATLAB, 87 85 bayt

Luis Mendo sayesinde 2 bayt tasarruf etti

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

'%&''?AYZ['-64güzel hile ... oktav yeniden yazarsanız aslında 66 bayt
rahnema1

4

PHP, 93 bayt

Kodos Johnson'ın yanıtı gibi tek bir dizide çalışıyor .
Ancak bunun çok daha fazla fikri var.

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

komut satırı bağımsız değişkenlerinden sayı alır. İle çalıştırın -nr.

imleci hareket ettirme

ilk hesaplama:

$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

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

Ödevleri birleştirmek hiçbir şey kazandırmaz, ancak okunabilirliği geliştirir:

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

Yıkmak

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

Piton 2, 180 178 176 bayt

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 bayt

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

Bu, -rbayrakla komut satırında çalışır ve bağımsız değişken olarak bir dizin dizini (dize) alır.


Bunun ""<$n=$argv[1][$i]yerine 5 kolay bayt kaydedebilirsiniz($n=$argv[1][$i])!=null
Titus

1

R, 160 bayt

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="")
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.