Руководство по алфавиту

20

Руководство по алфавиту

Дан массив направлений, где направления определены следующим образом:

NW  N  NE
W   .   E
SW  S  SE

Или в качестве индексов (вы можете использовать эти индексы для направлений вместо строк выше):

0 1 2
3 . 4
5 6 7

Вы можете выбрать любой формат, поддержка обоих не требуется для участия в конкурсе. Сгенерируйте соответствующую строку алфавита, которая представляет нарисованный путь, начиная с A. Число направлений никогда не будет превышать 25, что означает, что оно никогда не может пройти мимо Z, поэтому вам не нужно обрабатывать этот сценарий. Никакие другие входные форматы не будут приняты, если вы не сможете объяснить, почему эти форматы не работают из-за языкового ограничения. Это легче объяснить, используя подробный пример.


Итак, давайте посмотрим на быстрый пример:

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

Всегда начинай с А.

A

Иди на восток к Б.

A-B

Идите на юго-восток до C.

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

Конец на север в точке J.

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

Последнее значение, которое вы бы вернули, читая последний график слева направо, сверху вниз:

ABD
JE
IHF
G

В результате чего:

ABDJEIHFG

Это , выигрывает наименьшее количество байт.

Урна волшебного осьминога
источник
1
Связанные
FlipTack
1
Можем ли мы принять в качестве входных данных 7 различных пар значений вместо предложенных вами значений. например, вместо 0 мы получаем [-1 -1] или для 1 мы получаем [-1 0]?
rahnema1
@ rahnema1 нет, ввод такой, как описано.
Волшебная Урна Осьминога
Можем ли мы вернуть массив символов вместо строки
Kritixi Lithos
2
Возможно ли, что вы можете вернуть тестовый случай, где значения заканчиваются слева от Aтакого, что Aне будет напечатан первый результат?
17

Ответы:

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
Suever
источник
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чтобы вставить начальную букву «а». Так как мы инициализации , iчтобы 9в то же самое время, мы вводим специальное смещение 54 (результат приведенной выше формулы d = 9). После первой итерации pравно 646 + 54 = 700, что оставляет только достаточно места , чтобы поддержать до 25 ходов на Северо-Западе: 25 * -28 = -700. Вот почему pинициализируется до 646.

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

Arnauld
источник
d+=d>3,p+=d*9-d%3*8-28экономит 11 байт.
Тит
@ Titus Спасибо, хорошее место! (Теперь я могу инициализировать iв определении массива, сохранив еще 2 байта)
Арно
Поскольку в OP указано, что строчные буквы разрешены, возможно, вы можете сохранить 7 байтов, начиная с 9 и используя (++i).toString(36)(все еще не пытаясь понять вашу математику, но, похоже, это работает)
edc65
@ edc65 Черт возьми. Благодарность!
Arnauld
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}

Попробуйте онлайн

Благодаря Suever 2 байта сохранены!

Предыдущий ответ 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}
rahnema1
источник
1
Я полагаю, что, поскольку вам нужна imageчасть пакета, ваш byountount должен загружать пакет изображений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,''];
gnovice
источник
'%&''?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
Titus
источник
3

Python 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флагом и принимает в качестве аргумента массив символов (строку) индексов.

Кодос Джонсон
источник
Вы можете сохранить 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="")
ixodesbeta
источник