引导字母


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。

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
我们能否将7个不同的值对代替您的建议值作为输入。例如,我们得到[-1 -1]而不是0,或者得到1 [-1 0]?
rahnema1年

@ rahnema1不,输入如上所述。
魔术章鱼缸

我们可以返回字符数组而不是字符串

2
有没有可能是其中的值结束的你可以返回一个测试用例A,从而A不会在第一个结果打印?
Suever

Answers:


6

MATL64 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
哇!我以为Mendo做到了!不错:)。通常他会赢得我的矩阵式问题,很高兴看到其他人使用这种语言。我也想学习尼特。
魔术章鱼缸

12

JavaScript(ES6),108 107 94 87字节

感谢Titus,节省了多达13个字节!
多亏了edc65,节省了7个字节!

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”。由于我们同时初始化i9,因此引入了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个字节)
Arnauld

如OP指定允许使用小写字母,也许您可​​以保存从9开始使用的7个字节(++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}

1
我相信,由于您需要image字节计数的包部分,因此必须加载图像包pkg load image
Suever

谢谢,如果正确安装了软件包,则无需加载,您可以在Octave Online中
rahnema1'1

我相信那只是因为Octave Online pkg load *刚开始打电话。ideone.com可能是一个更好的选择
Suever

软件包应该以这种方式安装,这样pkg install -auto image-1.0.0.tar.gz它才能自动加载。请参阅手册
rahnema1

好吧,也许很好。我只是离开了以前在这里看到的东西。
Suever

5

MATLAB, 87 85字节

Luis Mendo节省了2个字节

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

'%&''?AYZ['-64好招...如果以八度重写,则实际上为66个字节
rahnema1'1

4

PHP,93字节

Kodos Johnson的答案那样在单个阵列上进行操作。
但这还有很多想法,我自己发表了。

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

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标志的命令行中运行,并采用索引的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="")
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.