ม้วนตัวอักษรเป็นม้วนวน


22

เขียนโปรแกรมหรือฟังก์ชั่นที่เมื่อได้รับnจะพิมพ์nตัวอักษรเกลียวที่ประกอบด้วยตัวอักษรละตินABCDEFGHIJKLMNOPQRSTUVWXYZซ้ำตามความจำเป็น เกลียวนี้ควรวิ่งผ่านตัวอักษรไปข้างหน้าเท่านั้น

เกี่ยวข้องกับSpiral Spiralถึงแม้ว่าเกลียวจะวิ่งผ่านตัวอักษรไปข้างหน้าและข้างหลังและเกลียวก็คงที่

กรณีทดสอบ

4   AB
    DC

40   UVWXYZ
     TGHIJA
    NSFABKB
    MREDCLC
    LQPONMD
    KJIHGFE

0

10  GHIJ
    FAB
    EDC

1000    UVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ
        TGHIJKLMNOPQRSTUVWXYZABCDEFGHIJA
        SFABCDEFGHIJKLMNOPQRSTUVWXYZABKB
        REZCDEFGHIJKLMNOPQRSTUVWXYZABCLC
        QDYBMNOPQRSTUVWXYZABCDEFGHIJCDMD
        PCXALEFGHIJKLMNOPQRSTUVWXYZKDENE
        OBWZKDEFGHIJKLMNOPQRSTUVWXALEFOF
        NAVYJCDMNOPQRSTUVWXYZABCDYBMFGPG
        MZUXIBCLCDEFGHIJKLMNOPQREZCNGHQH
        LYTWHABKBABCDEFGHIJKLMNSFADOHIRI
        KXSVGZAJAZGHIJKLMNOPQROTGBEPIJSJ
        JWRUFYZIZYFUVWXYZABCDSPUHCFQJKTK
        IVQTEXYHYXETQRSTUVWXETQVIDGRKLUL
        HUPSDWXGXWDSPUVWXYZYFURWJEHSLMVM
        GTORCVWFWVCROTGHIJAZGVSXKFITMNWN
        FSNQBUVEVUBQNSFABKBAHWTYLGJUNOXO
        ERMPATUDUTAPMREDCLCBIXUZMHKVOPYP
        DQLOZSTCTSZOLQPONMDCJYVANILWPQZQ
        CPKNYRSBSRYNKJIHGFEDKZWBOJMXQRAR
        BOJMXQRARQXMLKJIHGFELAXCPKNYRSBS
        ANILWPQZQPWVUTSRQPONMBYDQLOZSTCT
        ZMHKVOPYPONMLKJIHGFEDCZERMPATUDU
        YLGJUNOXONMLKJIHGFEDCBAFSNQBUVEV
        XKFITMNWVUTSRQPONMLKJIHGTORCVWFW
        WJEHSLMLKJIHGFEDCBAZYXWVUPSDWXGX
        VIDGRKJIHGFEDCBAZYXWVUTSRQTEXYHY
        UHCFQPONMLKJIHGFEDCBAZYXWVUFYZIZ
        TGBEDCBAZYXWVUTSRQPONMLKJIHGZAJA
        SFAZYXWVUTSRQPONMLKJIHGFEDCBABKB
        REDCBAZYXWVUTSRQPONMLKJIHGFEDCLC
        QPONMLKJIHGFEDCBAZYXWVUTSRQPONMD
                                LKJIHGFE

กฎระเบียบ

  • การป้อนข้อมูลของคุณจะเป็นจำนวนเต็มไม่ลบ0 <= n <= 1000แต่ในทางทฤษฎีรหัสของคุณควรจัดการกับจำนวนเต็มไม่ลบ
  • รูปแบบผลลัพธ์ของคุณอาจอยู่ในรูปแบบใด ๆ ก็ได้โดยมีตัวคั่นหากจำเป็น
  • การหมุนและการสะท้อนนั้นเทียบเท่ากัน
  • ตัวอักษรของคุณอาจเป็นตัวพิมพ์ใหญ่หรือตัวพิมพ์เล็ก
  • ช่องว่างในเกลียวของคุณอาจเต็มไปด้วยโมฆะที่ไม่ใช่ตัวอักษรที่คุณเห็นว่าเหมาะสม
  • เกลียวตัวเองอาจมีรูปร่างที่คุณเห็นว่าเหมาะสม เกลียวรูปสี่เหลี่ยมผืนผ้าทำงานได้ดีที่สุดกับโซลูชัน ASCII แต่โซลูชันแบบกราฟิกอาจสั้นลงด้วยวนวงกลม
  • อนุญาตการนำหน้าและเว้นวรรคและบรรทัดใหม่
  • นี่คือรหัสกอล์ฟ คำตอบที่สั้นที่สุดในหน่วยไบต์ (หรือเทียบเท่า) ชนะ

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


ผู้แก้ไขส่วนใหญ่จะไม่อนุญาตให้พิมพ์สตริงที่ยาวเกินไป
t-clausen.dk

@ t-clausen.dk ฉันไปด้วยจำนวนเต็มสูงสุด 32 บิตมาตรฐานที่ลงชื่อแล้ว หากคุณมีข้อเสนอแนะที่ดีกว่าสำหรับขอบเขตบนฉันมีความสุขที่จะแก้ไขมันมา
Sherlock9

Nice และหากิน :-)
Joffan

คำตอบ:


12

โลโก้129 87 ไบต์

วิธีการแก้ปัญหากราฟิกดำเนินการเป็นฟังก์ชั่น

นี้ถูกสร้างขึ้นบนCalormen.com ของล่ามโลโก้ Sฟังก์ชั่นใช้เวลาจำนวนตัวอักษรที่เป็นพารามิเตอร์และดึงพวกเขาในเกลียว ฟังก์ชั่นผลตัวอักษรในแนวตั้งเพื่อป้องกันไม่ให้พวกเขาจากการหมุนเกลียว . ฉันตัดสินใจว่ามันดูดีกว่า (และออกไป42 ไบต์ ) เพื่อละเว้นการแก้ไขการวางแนวตัวอักษร ฉันยังกระชับระยะห่างซึ่งไม่ได้เปลี่ยนจำนวนไบต์ หากคุณต้องม้วนตัวอักษรขึ้นมามันจะมีลักษณะเช่นนี้อยู่ดีT

อัปเดตเวอร์ชัน (ม้วนตัวอักษร)

TO S:r
PU IF:r[REPEAT:r[LABEL CHAR((REPCOUNT-1)%26)+65
RT 99/SQRT(REPCOUNT)FD 12]]END

การภาวนา

เรียกใช้ดังนี้: S การวนซ้ำ

ตัวอย่างผลลัพธ์

S 1000

เอาต์พุตตัวอย่างสำหรับการวนซ้ำ 1,000 ครั้ง

เวอร์ชันเก่า (ตัวอักษรตั้งตรงเสมอ)

TO T:l:h
RT:h
LABEL CHAR(:l%26)+65
LT:h
END
TO S:r
PU IF:r[REPEAT:r[T REPCOUNT-1 90-HEADING
RT 95/SQRT(REPCOUNT)FD 15]]END

เอาท์พุทเก่าออกเพื่อประหยัดพื้นที่ ดูได้ที่นี่


อย่าถามว่าฉันคิดเลขได้อย่างไร ฉันพยายามค้นหาสูตรออนไลน์ แต่ส่วนใหญ่แก้ปัญหาด้วยการรักษาค่าคงที่มุมเลี้ยวและเพิ่มความยาวเซกเมนต์ในขณะที่ฉันต้องการรักษาค่าคงที่ความยาวเซกเมนต์และเปลี่ยนมุม การทดลองและข้อผิดพลาดดูเหมือนจะนำไปสู่สูตรที่มั่นคง การปรับ95จะเปลี่ยนความหนาแน่นของเกลียวและการเปลี่ยนแปลง15จะปรับระยะห่างเชิงเส้นของตัวอักษร
GuitarPicker

9

Javascript (ES6), 203 201 ไบต์

n=>{for(a=[],i=d=k=z=0,p=526,j=1;i<n;){p+=[1,32,-1,-32][d&3];j--||(((z^=1)||k++),j=k,d++);(a[y=p>>5]=(a[y]||Array(32).fill` `))[p&31]=String.fromCharCode(65+(i++%26))}return a.map(r=>r.join``).join`
`}

การสาธิต

การสาธิตด้านล่างควรรันในแบบเต็มหน้า


7

R, 46 หรือ 51 ไบต์ขึ้นอยู่กับระยะห่าง

s=1:scan();plot(s*sin(s),s*cos(s),pch=letters)

ป้อนคำอธิบายรูปภาพที่นี่

(พล็อตเวอร์ชั่นที่อัปเดตแล้ว: เกลียวสีเทาไม่ได้ถูกพล็อตตามค่าเริ่มต้น แต่ฉันเพิ่มเข้าไปหลังจากเพื่อแสดงให้เห็นว่าตัวอักษรวางอยู่บนเกลียวอย่างแน่นอน)

เกลียวไม่ใช่ระยะห่างคงที่ดังนั้นฉันหวังว่ามันจะโอเค หากจำเป็นต้องมีการเว้นวรรคคงที่ให้เริ่มด้วยs=(1:scan())^.5แทนและเพิ่ม 5 ไบต์ลงในผลรวม จากนั้นผลลัพธ์จะเป็นด้านล่าง (n = 150):

ป้อนคำอธิบายรูปภาพที่นี่


3
พื้นที่ว่างของเกลียวของคุณขึ้นอยู่กับคุณอย่างสมบูรณ์ ฉันมีสองข้อเสนอแนะ แต่: 1) ให้เกลียวที่สอง มันเพิ่มไปยังคำตอบของคุณแม้ว่าจะน้อยกอล์ฟ; 2) คุณสามารถวาดเส้นเกลียวที่ผ่านตัวอักษรในภาพเกลียวแรกของคุณ เพียงเพื่อทำให้เกลียวตัวอักษรชัดเจนขึ้น
Sherlock9 9

6

Python 3.5, 180 157 152 147 141 ไบต์

-6 เนื่องจาก Sherlock9

r=[[]]
for x in range(int(input())):
 r=len(r[-1])<len(r[0])and r or[*zip(*r[::-1]),[]];r[-1]+=[chr(x%26+65)]
print(*map(''.join,r),sep='\n')

-5 เนื่องจาก Kap

R=range
def g(n):
 r=[[]]
 for x in R(n):
  if len(r[-1])==len(r[0]):r=[*zip(*r[::-1]),[]]
  r[-1]+=[chr(x%26+65)]
 print(*map(''.join,r),sep='\n')

โซลูชั่นที่ปรับปรุงใหม่, python 3.x:

R=range
def g(n):
 r=[[]]
 for x in R(n):
  if len(r[-1])==len(r[0]):r=list(zip(*r[::-1]))+[[]]
  r[-1]+=[chr(x%26+65)]
 print(*map(''.join,r),sep='\n')

โซลูชันก่อนหน้า:

R=range
def g(n):
 r=[]
 for x,f in zip(R(n),(j<1for i in R(n)for j in R(i//2+1))):
  if f:r=list(zip(*r[::-1]))+[[]]
  r[-1].append(chr(x%26+65))
 print(*map(''.join,r),sep='\n')

คำอธิบาย

rเป็นรายการของรายการที่มีเกลียว แนวคิดพื้นฐานคือมีการเพิ่มตัวอักษรใหม่ในแถวล่างของเกลียว ( r[-1].append(chr(x%26+65))) เมื่อแถวด้านล่างเต็มเกลียวหมุนวนตามเข็มนาฬิกา 90 และแถวว่างใหม่จะถูกเพิ่มไปที่ด้านล่าง ( r = list(zip(*r[::-1]))+[[]])

เคล็ดลับคือการคิดออกเมื่อหมุนเกลียว ในการแก้ปัญหาแรกเครื่องกำเนิด(j<1for i in R(n)for j in R(i//2+1))สร้างลำดับของค่าจริง / เท็จที่บอกเวลาที่จะหมุนเกลียว ในโซลูชันที่แก้ไขแล้วฉันเปลี่ยนวิธีการกำหนดrค่าเริ่มต้น ตอนนี้เมื่อความยาวของแถวล่างเท่ากับความยาวของแถวบนสุดเกลียวจะต้องหมุน


คุณสามารถแทนที่if len(r[-1])==len(r[0]):r=list(zip(*r[::-1]))+[[]]ด้วยif len(r[-1])==len(r[0]):r=[*zip(*r[::-1]),[]]เพื่อบันทึก 5 ไบต์
R. Kap

เนื่องจากคุณใช้เพียงrangeครั้งเดียวคุณสามารถลบRเพื่อบันทึกไบต์ได้ คุณยังสามารถบันทึกไบต์ด้วยการแปลงคำตอบของคุณเป็นโปรแกรมเต็มแม้ว่า[*zip(*r[::-1]),[]]คุณจะต้องใช้งานrange(int(input()))ต่อไป
Sherlock9 9

นอกจากนี้for x in range(int(input())):r=len(r[-1])<len(r[0])and r or[*zip(*r[::-1]),[]];r[-1]+=[chr(x%26+65)]เนื่องจากคุณกำลังตรวจสอบเมื่อบรรทัดสุดท้ายเท่ากับหรือมากกว่ากับบรรทัดแรก
Sherlock9

สองสิ่ง: 1) คุณสามารถทำให้ for วนหนึ่งบรรทัดยาวได้โดยการแยก statement ด้วย semicolons; และ 2) คุณยังไม่ได้กำหนดnในรุ่นนี้ ไม่ว่าคุณจะต้องใช้int(input())หรือห่อในการสำรองข้อมูลในฟังก์ชั่น
Sherlock9

2 ไบต์จากการกลั่นforวนลูป:for x in range(int(input())):r=len(r[-1])<len(r[0])and r or[*zip(*r[::-1]),[]];r[-1]+=[chr(x%26+65)]
Sherlock9

5

MATL , 21 18 ไบต์

X^Xk1YL1Y2y)wG>~*c

อินพุต0ออกด้วยข้อผิดพลาด (ซึ่งได้รับอนุญาตโดยค่าเริ่มต้น )

ลองออนไลน์!

คำอธิบาย

X^Xk   % Input n implicitly. Take square root and round up
1YL    % Square matrix of that size containing a spiral of numbers
1Y2    % Predefined literal: string "AB···YZ"
y      % Duplicate the spiral matrix onto the top
)      % Apply as an index inth the string. Gives 2D array of chars
w      % Swap: move copy of the spiral matrix to top
G>~    % Set entries that exceed the input to 0, and the rest to 1 
*      % Multiply. This makes unwanted entries equal to 0
c      % Convert to char. 0 is shown as a space. Display implicitly

5

Python 2, 84 82 ไบต์

ฉันใช้ Turtle อีกครั้ง มันสนุกมาก! : D

from turtle import*
up()
for i in range(input()):write(chr(i%26+65));rt(9);fd(9+i)

ลองออนไลน์

น่าเสียดาย Trinket.io มีผ้าใบขนาดเล็กที่น่ากลัว ฉันเปลี่ยน9+iเป็น9+i/9และปรับจุดเริ่มต้นของเต่าเพื่อวัตถุประสงค์ในการจับภาพหน้าจอนี้เพื่อให้ได้ผลลัพธ์มากขึ้น:

เอาท์พุต


หนึ่งไบต์จากถ้าคุณลบช่องว่างจากการนำเข้า: from turtle import*และอีกอันจากการเปลี่ยนจากwhileเป็นfor i in range(input())
Sherlock9

4

Pyth, 32 ไบต์

JS@Q2ju+.t_G)Hc<*GQQ.u+NY.iJJZ]Y

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

ลองออนไลน์

มันทำงานอย่างไร

JS@Q2ju+.t_G)Hc<*GQQ.u+NY.iJJZ]Y  Program. Input: Q
  @Q2                             Yield sqrt(Q)
JS                                Unary range, J=[1, 2, 3, ..., floor(sqrt(q))]
                         .iJJ     Interleave J with itself, yielding [1, 1, 2, 2, 3, 3, ...
                                  floor(sqrt(Q)), floor(sqrt(Q))]
                    .u+NY    Z    Cumulatively reduce by addition with base case 0,
                                  yielding [0, 1, 2, 4, 6, 9, 12, 16, 20...]
                *GQ               Repeat the lower-case alphabet Q times
               <   Q              Truncate to legth Q
              c                   Split the above at the indices in the above list
      u                       ]Y  Reduce the above, with base case [[]]:
          _G                       Reverse
        .t  )                      Transpose
       +     H                     Add the next arm of the spiral
     j                            Join on newlines and implicitly print

3

TSQL, 386 362 358 306 ไบต์

โปรดทราบว่า TSQL ไม่มีวิธีในการหมุนข้อความ สคริปต์นี้เริ่มต้นจาก A และคำนวณทิศทางที่ควรวางตัวอักษรถัดไป (ขวา, ลง, ซ้าย, ซ้าย, ซ้าย, ขึ้น, ขึ้น, ขึ้นไปขวา ... )

สคริปต์สามารถจัดการได้สูงสุด 7744 ตัวอักษร

แข็งแรงเล่นกอล์ฟ:

DECLARE @z INT = 7744

DECLARE @ INT=2+SQRT(@z-1)DECLARE @o varchar(max)=REPLICATE(SPACE(@-1)+char(10),@-1);WITH C as(SELECT 0i,@/2a,@/2b UNION ALL SELECT i+1,a+z/2,b+z%2FROM(SELECT*,IIF(a>@/2*2-b,IIF(a<b,2,-1),IIF(a>b,-2,1))z FROM C)t WHERE i<@z-1)SELECT @o=STUFF(@o,@*a-@+b,1,char(i%26+65))FROM c OPTION(maxrecursion 0)PRINT @o

Ungolfed:

DECLARE @z INT = 7744

DECLARE @ INT=2+SQRT(@z-1)
DECLARE @o varchar(max)=REPLICATE(SPACE(@-1)+char(10),@-1)

;WITH C as
(
  SELECT
    0i,@/2a,@/2b
  UNION ALL
  SELECT
    i+1,a+z/2,b+z%2
    FROM 
      (SELECT*,
         IIF(a>@/2*2-b,
           IIF(a<b,2,-1),
             IIF(a>b,-2,1))z FROM C)t
  WHERE
    i<@z-1
)
SELECT 
  @o=STUFF(@o,@*a-@+b,1,char(i%26+65))
FROM c  
OPTION(maxrecursion 0)

PRINT @o

ซอ



0

PHP , 219 ไบต์

for($q=ceil(sqrt($a=$argn))**2,$d=1,$x=$y=$w=0;$i<$q;$i++,${yx[$w%2]}+=[-1,1][$d&1],$i%$d?:$d+=$w++&1)$e[$c[]=$x-!($a&1)][$l[]=$y]=$i<$a?chr(65+$i%26):" ";for($k=min($c);$e[$k];print join($e[+$k++])."\n")ksort($e[+$k]);

ลองออนไลน์!

PHP, 260 ไบต์

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

for($y=$x=$d=$i=0;$i<$m=ceil(sqrt($n=$argv[1]))**2;$i++){$a[$y][$x]=$i<$n?chr($i%26+65):" ";$d=$y==$x&$y<1?0:(1-$y==$x&$x>0?1:($y==$x&$y>0?2:($y==-$x&$x<0?3:$d)));$d>2?$y--:($d>1?$x--:($d>0?$y++:$x++));}ksort($a);foreach($a as$r){ksort($r);echo join($r)."\n";}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.