แนะนำตัวอักษร


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 คู่ที่แตกต่างกันแทนค่าที่คุณเสนอ เช่นแทน 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
โอ้ว้าว! ฉันคิดว่าเมนโดทำสิ่งนี้! ดีมาก :) โดยปกติแล้วเขาจะชนะคำถามเมทริกซ์ของฉันดีที่เห็นคนอื่นใช้ภาษานี้ ฉันพยายามที่จะเรียนรู้ด้วยเหมือนกัน
Magic Octopus Urn

12

JavaScript (ES6), 108 107 94 87 ไบต์

บันทึกขนาดใหญ่ถึง 13 ไบต์ขอบคุณ Titus!
บันทึกอีก 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 ไบต์)
Arnauld

ตามที่ 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}

1
ฉันเชื่อว่าเนื่องจากคุณต้องการimageส่วนแพคเกจของ bytecount ของคุณจะต้องมีการโหลดแพคเกจภาพ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 ไบต์

บันทึก 2 ไบต์ขอบคุณLuis Mendo

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's
แต่นี่มีความคิดมากมายที่ฉันโพสต์ด้วยตัวเอง

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.