Керівництво алфавітом


20

Керівництво алфавітом

Дано масив напрямків, де напрямки визначаються наступним чином:

NW  N  NE
W   .   E
SW  S  SE

Або як індекси (ви можете використовувати ці індекси для вказівок замість рядків вище):

0 1 2
3 . 4
5 6 7

Ви можете вибрати будь-який формат, підтримка обох не вимагається викликом. Створіть відповідний рядок алфавіту, який представляє намальований шлях, починаючи з А. Кількість напрямків ніколи не перевищить 25, це означає, що він ніколи не може пройти повз Z, тому вам не доведеться обробляти цей сценарій. Інші формати введення не приймаються, якщо ви не зможете пояснити, чому ці формати не працюють через мовне обмеження. Це простіше пояснити, використовуючи дослівно розроблений приклад.


Отже, давайте розглянемо короткий приклад:

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

Завжди почніть з А.

A

Ідіть на схід до Б.

A-B

Ідіть на південний схід до С.

A-B 
   \
    C

Ідіть на північ до D.

A-B D
   \|
    C

Поверніться на південь до E, замінивши C.

A-B D
   \|
    E

Продовжуйте Південь протягом 2 циклів до F і G.

A-B D
   \|
    E
    |
    F
    |
    G

Ідіть на північний захід до H.

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

Ідіть на захід до мене.

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

Кінець на північ у точці Дж.

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

Кінцеве значення, яке ви повернете, - читаючи підсумковий графік зліва направо, зверху вниз:

ABD
JE
IHF
G

Результат:

ABDJEIHFG

Це , виграє найменший байт.



1
Чи можемо ми взяти за вхід 7 окремих пари значень замість запропонованих значень. наприклад, замість 0 отримаємо [-1 -1] або для 1 отримаємо [-1 0]?
rahnema1

@ rahnema1 ні, введення як описано.
Magic Octopus Urn

Чи можемо ми повернути масив символів замість рядка
Kritixi Lithos

2
Чи можливо ви можете повернути тестовий випадок, коли значення закінчуються зліва від Aтакого, що Aне буде надруковано перший результат?
Suever

Відповіді:


6

MATL , 64 58 57 50 46 40 37 36 35 30 байт

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

Спробуйте в MATL Online

Пояснення

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
Ух ти! Я думав, Мендо зробив це! Приємно :). Зазвичай він виграє мої матричні запитання, добре бачити когось іншого, хто використовує цю мову. Я також намагаюся навчитися ніт.
Чарівний восьминога Урна

12

JavaScript (ES6), 108 107 94 87 байт

Збережено колосальних 13 байтів, завдяки Тіту!
Збережено ще 7 байт, завдяки 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]));

Як це працює

Формула (d += d > 3) * 9 - d % 3 * 8 - 28переводить вказівки 0..7в такі компенсації:

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

Ми використовуємо ці зсуви для переміщення вказівника pв одновимірний масив rі записуємо літери в отримані позиції.

Ми повторюємо, [i = 9, ...a]а не просто aдля того, щоб вставити початкову літеру "a". Так як ми ініціалізації , iщоб 9в той же самий час, ми вводимо спеціальний зміщення 54 (результат наведеної вище формули d = 9). Після першої ітерації pодно 646 + 54 = 700, що залишає тільки досить місця , щоб підтримати до 25 ходів на Північно-Заході: 25 * -28 = -700. Ось чому pініціалізовано до 646.

Тоді нам просто потрібно приєднатися до масиву, щоб отримати остаточний рядок. Не визначені значення між літерами просто ігноруються join().


d+=d>3,p+=d*9-d%3*8-28економить 11 байт.
Тит

@Titus Спасибі, приємне місце! (Зараз я можу ініціалізуватися iу визначенні масиву, заощаджуючи ще 2 байти)
Арнольд,

Оскільки в ОП було вказано, що малі регістри дозволені, можливо, ви можете зберегти 7 байт, починаючи з 9 і використовуючи (++i).toString(36)(все ще не намагаючись зрозуміти свою математику, але, здається, працює)
edc65

@ edc65 Чорт праворуч. Спасибі!
Арнольд

5

Октава, 145 138 131 123 105 103 90 87 85 байт

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

Спробуйте в Інтернеті

Завдяки збереженому 2 байтам Suever !

Попередня відповідь 103 байти:

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

Спробуйте в Інтернеті!

Спочатку спробуйте 145 байт

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

Деякі пояснення

@(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
Я вважаю, що оскільки вам потрібна imageпакунка, частина вашого рахунку має завантажувати пакет зображеньpkg load image
Suever

Дякую, не потрібно завантажувати, якщо пакет правильно встановлений, ви можете протестувати його в Octave Online
rahnema1

Я вважаю, що це лише тому, що Octave Online дзвонить pkg load *на початку. ideone.com може бути кращим вибором
Suever

пакунок повинен бути встановлений таким чином, pkg install -auto image-1.0.0.tar.gzщоб він міг автоматично завантажуватися. Перегляньте інструкцію
rahnema1

Гаразд, можливо, це добре. Я щойно збирався від того, що бачив тут.
Suever

5

MATLAB, 87 85 байт

врятував 2 байти завдяки Луїсу Мендо

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

'%&''?AYZ['-64хороший трюк ... насправді 66 байт, якщо ви перепишете в октаву
rahnema1

4

PHP, 93 байти

Операція на одному масиві, як відповідь Кодоса Джонсона .
Але в цьому є стільки ідей, які я опублікував самостійно.

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

бере числа з аргументів командного рядка. Бігайте з -nr.

переміщення курсору

початковий розрахунок:

$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

гольф:

$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

злиття завдань нічого не економить, але щось покращує читабельність:

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

зламатися

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

Пітон 2, 180 178 176 байт

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 байт

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

Це запускається в командному рядку з -rпрапором і приймає масив char (рядок) індексів як аргумент.


Ви можете зберегти 5 простих байтів, ""<$n=$argv[1][$i]а не($n=$argv[1][$i])!=null
Тит

1

R, 160 байт

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="")
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.