アルファベットを導く


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

FとGの両方まで南に2サイクル進みます。

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つの異なるペアを取ることができます。たとえば、0の代わりに[-1 -1]を取得するか、1の場合に[-1 0]を取得しますか?
rahnema1

@ rahnema1いいえ、入力は説明どおりです。
魔法のタコUr

私たちは、文字の配列の代わりに文字列を返すことができます
KritixiのLithos

2
最初の結果が出力されないような値がにあるテストケースを返すことは可能ですか?AA
-Suever

回答:


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
ああすごい!メンドーがこれをしたと思った!いいね:)。通常、彼は私のマトリックスの質問に勝ちます。この言語を使用している他の人に会えてうれしいです。私も学習しようとしています。
魔法のタコUr

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を1次元配列に移動rし、結果の位置に文字を書き込みます。

開始文字「a」を挿入するため[i = 9, ...a]だけaではなく、繰り返します。同時に初期化iするため9、54の特別なオフセットを導入します(上の式の結果d = 9)。最初の反復の後、pequals 646 + 54 = 700により、北西への最大25の移動をサポートするのに十分なスペースが残ります25 * -28 = -700。それpがに初期化される理由です646

次に、配列を結合して、最終的な文字列を取得するだけです。文字間の未定義の値は、単に無視されjoin()ます。


d+=d>3,p+=d*9-d%3*8-2811バイトを節約します。
タイタス

@タイタスありがとう、素敵なスポット!(私は今、初期化することができるi配列定義に、2バイト以上の保存)
アルノー

OPは小文字を許可するように指定しているため、9から始まる7バイトを節約できます(++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}

オンラインで試す

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バイトカウントのパッケージ部分が必要なので、イメージパッケージをロードする必要があると思います-Suever pkg load image
1

パッケージが正しくインストールされている場合のおかげで、負荷に必要あなたはそれをテストすることはできませんオクターブオンライン
rahnema1

それは、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

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フラグを指定してコマンドラインで実行され、引数としてインデックスの文字配列(文字列)を取ります。


あなたが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="")
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.