หมุนวนตัวอักษร!


13

ดูที่สตริงต่อไปนี้ สังเกตรูปแบบหรือไม่

ABEFNOPEFGH
DC GQI
MHRJ
LKJI SK
DTL
CUM
BAZYXWV N
EO
DP
CQ
BAZYXWVUTSR

บางคนอาจสังเกตเห็นว่ามันเป็นเกลียวของตัวอักษรโดยที่ระยะทางระหว่างแถว / คอลัมน์ค่อยๆเพิ่มขึ้น 1 ช่องว่าง / บรรทัดใหม่

คำจำกัดความที่เข้มงวด

  • ลองมีตัวนับcซึ่งเริ่มเป็น 0
  • เราเขียนออกมาเป็นครั้งแรกC + 1Aตัวอักษรของตัวอักษรจากซ้ายไปขวา:
  • จากนั้นจากบนลงล่างต่อไป(C + 1) (C + 2) / 2ตัวอักษร (เพิ่ม):BAB

  • จากซ้ายไปขวาถัดไป(c + 1) (c + 2) / 2 (เพิ่มC):

    AB
     C
    
  • และจากล่างขึ้นบนจะใช้ตัวอักษรc + 1ถัดไป(เพิ่มD):

    AB
    DC
    
  • ถึงจุดสิ้นสุดของรอบ ดังนั้นขอเพิ่มc (ซึ่งกลายเป็น 1) จากนั้นก็เริ่มจากขั้นตอนแรกความแตกต่างเพียงอย่างเดียวคือแทนที่จะใช้ตัวอักษรc + 1ตัวแรกเราใช้ตัวอักษรc + 1ตัวถัดไปโดยเริ่มจากองค์ประกอบสุดท้ายของวงจรนี้ ( Dในกรณีนี้ ดังนั้นเราจึงดำเนินการต่อEFG...) เมื่อถึงรอบมันกลับมาจากZA

งาน

รับจำนวนเต็มN (ซึ่งเป็นค่าบวกสำหรับการจัดทำดัชนี 1 หรือไม่เป็นลบสำหรับการจัดทำดัชนี 0) ให้ส่งออกรอบแรกNของเกลียว

กฎระเบียบ

  • คุณสามารถใช้ตัวพิมพ์เล็กหรือตัวพิมพ์ใหญ่ แต่ตัวเลือกของคุณจะต้องสอดคล้องกัน (ใช้เพียงหนึ่งตัวเท่านั้นไม่อนุญาตให้ใช้การผสม)

  • คุณสามารถรับอินพุตและให้เอาต์พุตผ่านวิธีการมาตรฐานใดๆ ในภาษาการเขียนโปรแกรมใด ๆในขณะที่สังเกตว่าช่องโหว่เหล่านี้ถูกห้ามใช้โดยปริยาย

  • รูปแบบเอาต์พุตที่ยอมรับได้: สตริงหลายรายการของสตริงที่แทนบรรทัดรายการที่มีรายการอักขระหลายรายการแต่ละรายการแทนหนึ่งบรรทัดหรืออะไรก็ได้ที่คุณเห็นว่าเหมาะสม ในกรณีที่คุณไม่ได้เลือกรูปแบบแรกควรรวมรหัสของคุณในรูปแบบที่สวยงาม

  • นี่คือดังนั้นโค้ดที่สั้นที่สุดเป็นไบต์ (ในแต่ละภาษา) ซึ่งเป็นไปตามข้อกำหนดที่ชนะ!


กรณีทดสอบ

จำนวนเต็มอินพุทจะถูกคั่นด้วยเอาต์พุตที่สอดคล้องกันผ่านบรรทัดใหม่และการทดสอบจะถูกคั่นด้วยเครื่องหมายขีดกลาง โปรดทราบว่าสิ่งเหล่านี้มีการจัดทำดัชนี 1

1

AB
กระแสตรง

--------

2

ABEF
DC G
MH
LKJI 

--------

3

ABEFNOP
DC GQ
MHR
LKJI
DT
จุฬาฯ
BAZYXWV

-------

4

ABEFNOPEFGH
DC GQI
MHRJ
LKJI SK
DTL
CUM
BAZYXWV N
EO
DP
CQ
BAZYXWVUTSR

-------
5

ABEFNOPEFGHFGHIJ
DC GQIK
MHRJL
LKJI SKM
DTLN
CUMO
BAZYXWV NP
EOQ
DPR
CQS
BAZYXWVUTSR T
RU
QV
PW
วัว
NMLKJIHGFEDCBAZY

------

6

ABEFNOPEFGHFGHIJSTUVWX
DC GQIKY
MHRJLZ
LKJI SKMA
DTLNB
CUMOC
BAZYXWV NPD
EOQE
DPRF
CQSG
BAZYXWVUTSR TH
RUI
QVJ
PWK
OXL
NMLKJIHGFEDCBAZY M
SN
RO
QP
PQ
หรือ 
NMLKJIHGFEDCBAZYXWVUTS

ฉันคิดว่า testcase ควรจะเป็น n = 1,2,3,5,6
TFeld

คำตอบ:


9

ถ่าน 31 ไบต์

F⮌…⁰NB⁺²⊘×ι⁺³ι⭆α§α⁺λ÷×ι⊕×ι⁺⁹⊗ι⁶

ลองออนไลน์! การเชื่อมโยงคือการใช้รหัสเวอร์ชันอย่างละเอียด หมายเหตุ: deverbosifier ส่งออกตัวคั่นต่อท้ายด้วยเหตุผลบางอย่าง คำอธิบาย:

F⮌…⁰NB

วาดกล่องตามขนาดย้อนกลับ (ใหญ่ไปหาเล็กที่สุด)

⁺²⊘×ι⁺³ι

คำนวณขนาดของกล่อง

⭆α§α⁺λ

วาดเส้นขอบของกล่องโดยใช้ตัวอักษรหมุน

÷×ι⊕×ι⁺⁹⊗ι⁶

คำนวณตัวอักษรที่จะปรากฏที่ด้านบนซ้ายของกล่อง (ดัชนี 0)


6

Python 2 , 176 ไบต์

n=input()
k=n*-~n/2+1
a=eval(`[[' ']*k]*k`)
x=y=z=0
for s in range(4*n+4):exec s/4*(s/4+1)/2*"if'!'>a[y][x]:a[y][x]=chr(z%26+65);z+=1\nx+=abs(2-s%4)-1;y+=s%2-s%4/3*2\n"
print a

ลองออนไลน์!

คำอธิบาย

เราสร้างอาร์เรย์ของช่องว่างที่มีขนาดพอเหมาะจากนั้นเลื่อนมาเป็นแบบนี้โดยเริ่มจากมุมบนซ้าย:

  • 1 ขั้นตอน→, 1 ขั้นตอน↓, 1 ขั้นตอน←, 1 ขั้นตอน↑

  • 3 ขั้นตอน→, 3 ขั้นตอน↓, 3 ขั้นตอน←, 3 ขั้นตอน↑

  • 6 ขั้นตอน→, 6 ขั้นตอน↓, 6 ขั้นตอน←, 6 ขั้นตอน↑

  • 10 ขั้นตอน→, 10 ขั้นตอน↓, 10 ขั้นตอน←, 10 ขั้นตอน↑

  • ...

ทุกครั้งที่เราพบเซลล์ว่างเราใส่ตัวอักษรไว้ที่นั่นแล้ววนไปที่ตัวอักษรถัดไปในตัวอักษร

ในรหัสs%4คือทิศทาง (→↓←↑) และเราก้าวไปหลายครั้ง:

TriangularNumber(s/4) = s/4*(s/4+1)/2.

โอกาสตีกอล์ฟ

  • มีวิธีที่สั้นเพื่อ map s%4ไป1,0,-1,0กว่าabs(2-s%4)-1?

  • มีวิธีที่สั้นเพื่อ map s%4ไป0,1,0,-1กว่าs%2-s%4/3*2?

เครดิต

  • Mr. Xcoder บันทึกไบต์

2
+1 ว้าวนี่มันยอดเยี่ยมมาก เอาฉันสักครู่เพื่อคิดออกว่ามันทำงานอย่างไร ฉันพบว่าจดชวเลขสำหรับ21/(s%4+3)%3-1: s%2-2*(s%4>2)( 179 ไบต์ ) มันอาจจะยังสามารถเล่นกอล์ฟได้
Mr. Xcoder

4

C,  305  281 ไบต์

ขอบคุณ @Mr Xcoder สำหรับบันทึกสี่ไบต์!

#define L(x,y)l[x][y]=a++%26+65;
#define F for(
c,i,j,a,p;f(n){char**l=calloc(8,i=a=n*n*4);F;i--;memset(l[i],32,a))l[i]=malloc(a);F c=a=p=i=0;c<n;++c){F i=p;i<c+p+!c;)L(j=0,c+i++)F p=i;j<=-~c*(c+2)/2;)L(j++,c+i)F;c+i-1;)L(j-1,c+--i)F i=0;i<=c;)L(j+~i++,0)}F i=0;i<j;)puts(l[i++]);}

ลองออนไลน์!


1
ครั้งแรกที่ผมเห็น#defineสำหรับfor((ที่จริงจะช่วยประหยัด bytes) +1 จากฉัน :)
Kevin Cruijssen

2

Python 2 , 262 260 254 245 ไบต์

lambda n:[[[' ',chr(65+(4*(i<j)+sum((i<j)*8+2+I*[5,9][i<j]+sum(2*R(I))for I in R(S(i,j)-1))+[i+j,-i-j][i<j])%26)][max(i,j)==S(i,j)*-~S(i,j)/2or i*j<1]for i in R(1+n*-~n/2)]for j in R(1+n*-~n/2)]
R=range
S=lambda x,y:int((8*max(x,y)+1)**.5+.99)/2

ลองออนไลน์!

วิธีการใหม่ที่มีคณิตศาสตร์มากขึ้น!

ส่งคืนรายการ char-list


เวอร์ชั่นเก่า:

Python 2 , 322 321 308 298 ไบต์

R=range
n=input()
w=1+n*-~n/2;r=[w*[' ']for _ in R(w)];r[0][0]='A';l=R(1,w*w*9);c=lambda:chr(65+l.pop(0)%26)
for i in R(n+1):
 w=1+i*-~i/2;W=w-i
 for x in R(W,w):r[0][x]=c()
 for y in R(1,w):r[y][w-1]=c()
 for x in R(1,w):r[w-1][w+~x]=c()
 for x in R(1,w-W):r[w+~x][0]=c()
for l in r:print`l`[2::5]

ลองออนไลน์!


@ Mr.Xcoder ไม่.49เพียงพอในกรณีนี้หรือไม่หรือมีอินพุตที่ใหญ่มาก?
Kevin Cruijssen

1
@KevinCruijssen ไม่แน่ใจว่า แต่งานนี้เพื่อตรวจสอบว่า260 ไบต์
Mr. Xcoder

ฉันไม่รู้จัก Python ดี แต่เป็นไปได้ที่จะสร้างตัวแปรอินไลน์i<jเนื่องจากคุณใช้สี่ครั้งหรือไม่
Kevin Cruijssen

1
245 bytesโดยการเล่นกอล์ฟ+1==1+จากวิธีการก่อนหน้านี้ของฉัน
Mr. Xcoder

1

Perl 5, 177 +2 (-nl) = 179 ไบต์

บันทึก 2 ไบต์ด้วย Xcali

sub n{chr 65+$c++%26}@O=(n);while($,++<$_){$_.=$"x$,for@O;push@O,($"x length$O[0])x$,;$O[0]=~s/ /n/eg;s/ $/n/e for@O;1while$O[-1]=~s/.*\K /n/e;s/^ /n/e for reverse@O}print for@O

ลองออนไลน์


คุณสามารถบันทึกไบต์โดยใช้แทน-1 $#Oนอกจากนี้การใช้$,แทน$nจะช่วยให้คุณลบพื้นที่ก่อนforใน$_.=$"x$n for@O
Xcali

ขอบคุณฉันกำลังมองหาการปรับปรุงอื่น ๆ แต่ไม่สามารถหาได้ในขณะนี้
Nahuel Fouilleul

บันทึกอีก 2 ไบต์เปลี่ยน regex s/ (?=\S)/n/eเป็นs/.*\K /n/e
Nahuel Fouilleul

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.