ทำชามซุปตัวอักษร


55

นี่คือสิ่งที่เราจะเรียกซุปชามตัวอักษร - รูปร่าง ASCII ศิลปะวงกลมประมาณกับ 26 ตัวอักษรภาษาอังกฤษตัวพิมพ์ใหญ่ (AZ) จัดเรียงตามเข็มนาฬิกาเพื่อสร้างปริมณฑล:

   XYZABC
 VW      DE
U          F
T          G
S          H
 RQ      JI
   PONMLK

เขียนโปรแกรมที่ใช้ตัวอักษร AZ และเอาท์พุทซุปตัวอักษรเดียวกันว่า "หมุน" เพื่อที่จะพูดดังนั้นตัวอักษรที่ป้อนจะปรากฏขึ้นเมื่อสิ่งที่Aทำในตัวอย่างด้านบนและรอบตัวอักษรที่เหลือเต็มรอบ ตามเข็มนาฬิกา

ดังนั้นเอาท์พุทสำหรับการป้อนข้อมูลAจะเป็นที่เดิมชามซุปตัวอักษร

และเอาต์พุตสำหรับอินพุตBจะเป็นอันนี้:

   YZABCD
 WX      EF
V          G
U          H
T          I
 SR      KJ
   QPONML

เช่นเดียวกันกับผลลัพธ์สำหรับH:

   EFGHIJ
 CD      KL
B          M
A          N
Z          O
 YX      QP
   WVUTSR

หรือสำหรับZ:

   WXYZAB
 UV      CD
T          E
S          F
R          G
 QP      IH
   ONMLKJ

สิ่งนี้ต้องใช้กับตัวอักษร 26 ตัว A ถึง Z

รายละเอียด:

  • คุณสามารถสันนิษฐานได้ว่าอินพุตเพียงอย่างเดียวจะเป็นตัวอักษร A ถึง Z
  • หากสะดวกคุณสามารถใช้ตัวพิมพ์เล็ก az สำหรับอินพุตและ / หรือเอาท์พุทคุณสามารถผสมและจับคู่ส่วนล่างและตัวพิมพ์ใหญ่ได้
  • ลำดับตัวอักษรต้องวนตามเข็มนาฬิกาไม่ใช่ทวนเข็มนาฬิกา
  • คุณต้องใช้ช่องว่างไม่ใช่อย่างอื่นเพื่อเยื้องและเติมชามซุป
  • อาจมีการนำหน้าหรือขึ้นบรรทัดใหม่หรือช่องว่างในเอาต์พุตตราบใดที่มีการจัดเรียงชามซุปอย่างเหมาะสม
  • โปรดทราบว่ารูปร่างชามกว้าง 12 ตัวอักษรสูง 7 เพื่อให้ดูเหมือนเป็นวงกลมโดยประมาณเป็นข้อความ โบลิ่งของคุณจะต้องมีรูปร่างเดียวกัน

นี่คือรหัสกอล์ฟเพื่อให้รหัสที่สั้นที่สุดชนะ!


12
ท้าทายมาก! ตอนแรกดูเหมือนง่าย แต่ไม่ใช่
Luis Mendo

คำตอบ:


22

05AB1E , 21 ไบต์

กำหนดโปรแกรม:AlphabeticCharเชือก

รหัส:

2AA¹k._•1못*Ć,ãiDΣ•Λ

ลองออนไลน์!


ชำรุด:

2AA¹k._•1못*Ć,ãiDΣ•Λ

2                       # <length>
 AA¹k._                 # <filler>
       •1못*Ć,ãiDΣ•    # <pattern>
                    Λ   # Invoke the canvas function.


คำอธิบาย:

ผ้าใบ ( Λ) ในบริบทนี้โดยเฉพาะอย่างยิ่งการทำงานเป็นฟังก์ชั่นที่มีลายเซ็นต่อไปนี้:

Λ:(ความยาว:ชัยนาท, พู้ที่ใส่:เชือก, แบบแผน:ชัยนาท)เชือก

พารามิเตอร์ในสถานการณ์เช่นนี้จำนวนการกำหนดทิศทาง ในรหัสหมายเลขนี้จะแสดงเป็นซึ่งเป็นรุ่นที่มีการบีบอัดของจำนวนขนาดใหญ่2232344565666667670012122คำสั่งจะแสดงในลักษณะดังต่อไปนี้:แบบแผน 2232344565666667670012122•1못*Ć,ãiDΣ•2232344565666667670012122


70162543


ซึ่งหมายความว่าจำนวนมากแสดงถึงรูปแบบของทิศทางต่อไปนี้:

[,,,,,,,,,,,,,,,,,,,,,,,,]

ด้วยบริบทลายเซ็นนี้ผ้าใบซ้ำผ่านรายการและเขียนอักขระจากในทิศทางปัจจุบันแบบแผนบรรจุความยาวแบบพู้ที่ใส่

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

AA¹k._

 A¹k # ค้นหา<index>ของอักขระอินพุตที่กำหนดในตัวอักษร
A ._ # หมุนตัวอักษรไปทางซ้าย<index>ครั้ง

ใน pseudocode สิ่งนี้จะถูกประมวลผลโดยฟังก์ชัน canvas:

1เขียน AB ในทิศทาง2เขียน ก่อนคริสต์ศักราช ในทิศทาง3เขียน ซีดี ในทิศทาง4เขียน เดอ ในทิศทาง5เขียน EF ในทิศทาง6เขียน FG ในทิศทาง...

สุดท้ายคุณจะเห็นว่าอาร์กิวเมนต์ตัวเป็น 'หมุน'ครั้งทางด้านขวาซึ่งหมายความว่าผืนผ้าใบจะวนซ้ำตามรายการต่อไปนี้ (ขี่จักรยานและไม่มีที่สิ้นสุด):ความยาว-1

[AB,ก่อนคริสต์ศักราช,ซีดี,เดอ,EF,FG,GH,สวัสดี,IJ,JK,...

ซึ่งส่งผลให้รูปร่างตัวอักษรซุปที่ต้องการ ascii- ศิลปะ


ตกลงฉันยอมแพ้ พยายามหาทางเลือกที่สั้นกว่านี้ แต่ฉันไม่เห็นมัน AA¹k._สามารถเป็นได้A¹¡RJ«แต่เป็นจำนวนไบต์เดียวกัน •1못*Ć,ãiDΣ•สามารถเป็นได้•õÕ₆qηµñ–†f•·แต่เป็นจำนวนไบต์เดียวกัน อ่า คำตอบที่ดี!
Kevin Cruijssen

11

Perl 6 , 100 ไบต์

{"2XYZABC
 VW5DE
U9F
T9G
S9H
 RQ5JI
2PONMLK".trans(/\S/=>{(try ' 'x$/+1)||chr ($/.ord+.ord)%26+65})}

ลองออนไลน์!

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

คำอธิบาย

{                                                            }# Anonymous code block
 "...".trans(/\S/=>{                                       }) # Translate non-whitespace
                    (try ' 'x$/+1)      # If digits, the amount of spaces plus one
                                  ||chr ($/.ord+.ord)%26+64  # Else the shifted letter

9

ทับทิม 107 ไบต์

->n{a=(0..6).map{' '*11}
(?A..?Z).map{|i|j,k=(1i**((i.ord-n.ord-6)/6.5)).rect;a[3.5*k+=1][5.2*j+6]=i}
a*$/}

ลองออนไลน์!

ปรับปรุงไวยากรณ์"i".to_c-> 1i(แนะนำโดย Jordan)

เปลี่ยนระบบพิกัดเพื่อให้ 0 องศาอยู่ด้านขวาแทนด้านบน สิ่งนี้ทำให้0.5->6

ปรับตัวคูณของjและkสำหรับช่วงเวลาสั้น ๆ

แทนที่จะพิมพ์ออกputs aเชื่อมองค์ประกอบของอาร์เรย์และส่งคืนสตริงa*$/

Ruby , 119 ไบต์

->n{a=(0..6).map{' '*11}
(?A..?Z).map{|i|j,k=("i".to_c**((i.ord-n.ord+0.5)/6.5)).rect;a[3.5-j*3.3][6+k*5.17]=i}
puts a}

ใช้จำนวนเชิงซ้อนที่เพิ่มขึ้นเป็นกำลังเพื่อแม็พกับวงรี เทิร์นที่สมบูรณ์คือ 26 ดังนั้นแต่ละควอแดรนท์คือ 6.5

วิธีการนี้ขึ้นอยู่กับเอาต์พุตที่ต้องการซึ่งมีลักษณะคล้ายวงรีมากพอที่จะสามารถทำการจับคู่ที่ถูกต้องได้

ลองออนไลน์!


@ จอร์แดนขอบคุณฉันไม่เคยเห็นไวยากรณ์นั้นมาก่อน!
เลเวลริเวอร์เซนต์

8

ถ่าน 33 ไบต์

GH→→↘→↘↓↓77←←←←↖←↖↑↑↗→↗→→²✂⁺αα⌕αS

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

GH

ติดตามเส้นทาง

→→↘→↘↓↓77←←←←↖←↖↑↑↗→↗→→

ร่างชาม แต่ละขยาย7↙←

²

ย้ายครั้งละหนึ่งอักขระ (API นี้ทับซ้อนกับแต่ละบรรทัดด้วยตัวถัดไป)

✂⁺αα⌕αS

วาดโดยใช้ตัวอักษรสองเท่า แต่เริ่มต้นที่ตำแหน่งของอักขระอินพุต


8

MATL , 49 ไบต์

7I8*32tvB[1b]&Zvc2Y2j7+_YSy&f7-w4-_Z;YPE\,&S])yg(

ช่างเป็นระเบียบ แต่มันก็เป็นการเขียนที่สนุก แม้กระทั่งอาร์กแทนเจนต์ก็มีส่วนเกี่ยวข้อง

ลองออนไลน์!

คำอธิบาย

รหัส

7I8*32tvB

สร้างอาร์เรย์ของตัวเลขและแปลงเป็นเลขฐานสอง นี่จะให้เมทริกซ์เป็นศูนย์เดียว

0 0 0 1 1 1
0 1 1 0 0 0
1 0 0 0 0 0
1 0 0 0 0 0

ซึ่งเป็น Quadrant ซ้ายบนของเมทริกซ์ที่ระบุตำแหน่งของตัวอักษร

[1b]&Zv

สะท้อนให้เห็นว่า Quadrant ในแนวตั้งโดยไม่ต้องทำซ้ำแถวสุดท้ายและทำซ้ำคอลัมน์สุดท้ายในแนวนอนเพื่อสร้างเมทริกซ์แบบเต็ม:

0 0 0 1 1 1 1 1 1 0 0 0
0 1 1 0 0 0 0 0 0 1 1 0
1 0 0 0 0 0 0 0 0 0 0 1
1 0 0 0 0 0 0 0 0 0 0 1
1 0 0 0 0 0 0 0 0 0 0 1
0 1 1 0 0 0 0 0 0 1 1 0
0 0 0 1 1 1 1 1 1 0 0 0

ตอนนี้เรามีหน้ากากที่มีตำแหน่ง รหัส

c

แปลงสิ่งนี้ให้เป็นถ่านเพราะผลลัพธ์สุดท้ายจะเป็นเมทริกซ์ถ่าน อักขระ 0 ถูกแสดงเป็นช่องว่างและรายการที่ไม่ใช่ศูนย์จะถูกเขียนด้วยตัวอักษรที่เหมาะสม

2Y2

ดันสตริง'abc···xyz'ซึ่งมี 26 ตัวอักษร สายนี้จะต้องมีการขยับแบบวงกลมตามอินพุต ในการทำเช่นนั้น

j7+_YS

อ่านจดหมายอินพุตเพิ่ม 7 เข้ากับรหัส ASCII และปฏิเสธผลลัพธ์ สำหรับการป้อนข้อมูล'a'สิ่งนี้จะให้ −104 ซึ่งเป็นผลคูณของ 26 ดังนั้นการขยับเป็นวงกลมตามจำนวนนี้จะไม่ทำอะไรเลย ถ้าใส่เป็นbนี้จะช่วยให้ -105 ซึ่งการเปลี่ยนแปลงขั้นตอนสตริง 1 ไปทางซ้ายในการผลิต'bcd···yza'; เป็นต้น

ขั้นตอนต่อไปคือการกำหนดลำดับที่สตริงที่เลื่อนจะถูกเขียนลงในรายการที่ไม่ใช่ศูนย์ของเมทริกซ์ ด้วยเหตุนี้

y&f

สร้างสำเนาของเมทริกซ์และผลักเวกเตอร์สองตัวที่มีตำแหน่งแถวและคอลัมน์ 1 คอลัมน์ที่ไม่ใช่ศูนย์ แล้วก็

7-w4-_

ลบ 7 จากหลังนำอดีตไปด้านบนลบออก 4 จากนั้นและลบล้างมัน 7 และ 4 ระบุจุดเริ่มต้นของพิกัดเพื่อให้มุมของเวกเตอร์ตำแหน่งของรายการที่ไม่ใช่ศูนย์ที่เกี่ยวข้องกับจุดกำเนิดนั้นกำหนดลำดับที่ต้องการ

Z;YPE\

คำนวณสองอาร์กแทนเจนต์โมดูโล 2 * pi เพื่อสร้างมุมเหล่านั้น ตอนนี้มุมที่เล็กที่สุดคือ 0 สอดคล้องกับรายการที่ตัวอักษรตัวแรกควรไปและส่วนที่เหลือล่วงหน้าทวนเข็มนาฬิกา

,&S])

จัดเรียงตัวอักษรใหม่ในสตริงตามมุมเหล่านั้นดังนั้นเมื่อตัวอักษรถูกเขียนลงในรายการที่ไม่ใช่ศูนย์ของเมทริกซ์ตามลำดับคอลัมน์หลัก (ลงมาจากนั้นข้าม) ผลลัพธ์จะถูกต้อง สิ่งนี้ทำได้โดย

yg(

ตัวอย่างเช่นถ้าอินพุตคือ'a'สตริงที่ไม่ถูกเปลี่ยนแบบวงกลม:

abcdefghijklmnopqrstuvwxyz

การจัดเรียงใหม่ตามมุมจะเปลี่ยนสิ่งนี้เป็น

utsvrwqxpyoznamblckdjeifgh

เพื่อที่'u'จะไปอย่างถูกต้องไปยังรายการแรก (ตามลำดับคอลัมน์หลัก) ไม่ใช่ศูนย์ซึ่งก็คือ (3,1) ในสัญกรณ์เมทริกซ์; 't'จะไปที่ (4,1) 's'ถึง (5,1); 'v'ถึง (2,2) ฯลฯ :

   ······   
 v·      ·· 
u          ·
t          ·
s          ·
 ··      ·· 
   ······   

@EriktheOutgolfer ในที่สุดฉันก็พบบางเวลาที่จะเพิ่มคำอธิบาย
Luis Mendo

1
ว้าว ... ฉันคิดว่าคุณละทิ้งสิ่งนี้เพราะคุณลบความคิดเห็นนั้น : P
Erik the Outgolfer


7

R , 139 122 ไบต์

-17 ไบต์ขอบคุณ Giuseppe

u=utf8ToInt;`*`=rep;o=c(' '*12,'
')*7;o[u("  &3@LKWVUTSRDC5(")]=LETTERS[(13:38+u(scan(,'')))%%26+1];cat(o,sep='')

คำอธิบาย:

o=rep(c(rep(' ',12),'
'),7) 

สร้างช่องว่างที่ว่างเปล่า

u(" &3@LKWVUTSRDC5(")

คือชุดของดัชนีสำหรับตำแหน่งจดหมายที่สอดคล้องกับ:

c(7:9,23,24,38,51,64,76,75,87:82,68,67,53,40,27,15,16,4:6)

TIO


1
คุณไม่เคยใช้intToUtf8เพื่อให้เป็นไบต์ภายนอก แต่ถ้าคุณใช้*แทนคุณrepจะได้รับการบันทึก 2 ไบต์และสูงถึง125 ไบต์
Giuseppe

1
Oh, และใช้ตัวอักษรที่ต่ำไบต์แทนการพิมพ์ ASCII คุณสามารถโกนออก-32สำหรับ122 ไบต์ cat(intToUtf8(bytes))คุณสามารถสร้างได้ด้วยตนเองโดยใช้
จูเซปเป้

@Giuseppe ฉันค่อนข้างแน่ใจว่าฉันได้ลบออกไปแล้วมีintToUtf8ฟังก์ชั่นเปิดหลายรุ่นพร้อมกันในทันทีที่ฉันเดา Nice บันทึกทุกอย่างไว้ขอบคุณ
Aaron Hayman

6

JavaScript (Node.js) ,  121  119 ไบต์

บันทึก 2 ไบต์ต้องขอบคุณ @tsh

c=>`2XYZABC
0VW5DE
U9F
T9G
S9H
0RQ5JI
2PONMLK`.replace(/./g,x=>''.padEnd(+x+1)||(B=Buffer)([65+([a,b]=B(c+x),a+b)%26]))

ลองออนไลน์!

อย่างไร?

Bufferx

="H"x="B"

// extracting the ASCII codes
Buffer(c + x)  Buffer("HB")  <Buffer 48 42>

// assigning them to variables
[a, b] = Buffer(c + x)  a = 0x48 (72) and b = 0x42 (66)

// computing the ASCII code of the target letter
65 + ((a + b) % 26)  65 + (138 % 26)  65 + 8  73

// turning it back into a character
Buffer([73])  <Buffer 49>  implicitly coerced to "I" by replace()



4

R , 218 197 ไบต์

-21 ไบต์ขอบคุณ Giuseppe

function(t,l=letters,`*`=rep,s=" ",n="
",`~`=`[`,r=c(l~l>=t,l))cat(s*3,r~24:26,r~1:3,n,s,r~22:23,q<-s*6,r~4:5,n,r~21,u<-s*10,r~6,n,r~20,u,r~7,n,r~19,u,r~8,n,s,r~17:18,q,r~10:9,n,s*3,r~16:11,sep='')

ลองออนไลน์!

Ungolfed:

alphasoup <- function(startlet){
  startnum <- which(l == startlet)
  rotatedletters <- c(letters[startnum:26], letters[1:(startnum -1)])[1:26]
  cat('   ',rotatedletters[24:26],rotatedletters[1:3], '\n ', 
      rotatedletters[22:23], s6 <- '      ', rotatedletters[4:5], '\n',
      rotatedletters[21], s10 <- rep(' ', 10), rotatedletters[6], '\n',
      rotatedletters[20], s10, rotatedletters[7], '\n',
      rotatedletters[19], s10, rotatedletters[8], '\n ',
      rotatedletters[17:18], s6, rotatedletters[10:9], '\n   ',
      rotatedletters[16:11],
      sep = '')
}

สร้างเวกเตอร์ตัวอักษรที่หมุนแล้วและใช้catในการกรอกขอบของชามด้วยเวกเตอร์นั้น


203 ไบต์หากคุณไม่สนใจสิ่งที่น่ารังเกียจในบรรทัดเดียว การปรับปรุงที่ใหญ่ที่สุดอาจเป็นการลบwhichและใช้l>=tเป็นดัชนีโดยตรงซึ่งมีค่า 12 ไบต์
จูเซปเป้

2
198 ไบต์โดย aliasing กับ[ ~นี่คือคำตอบที่ดี ฉันใช้เงินไปประมาณ 250 ไบต์ในความพยายามครั้งแรกของฉันด้วยวิธีการที่ซับซ้อนกว่านี้มาก
จูเซปเป้

อ่าฉลาดฉันลืมเรื่องการเปรียบเทียบสตริง
CT Hall

3

Java 11, 134 ไบต์

c->"2XYZABC_0VW5DE_U9F_T9G_S9H_0RQ5JI_2PONMLK".chars().forEach(i->System.out.print(i<59?" ".repeat(i-47):(char)(i>90?10:(c+i)%26+65)))

ลองออนไลน์

รุ่น 136 ไบต์ที่มีศักยภาพที่จะเล่นกอล์ฟ?

c->"2XYZABC_0VW5DE_U9F_T9G_S9H_0RQ5JI_2PONMLK".chars().forEach(i->System.out.printf("%"+(i<59?i-47:"")+"c",i>90?10:i<59?32:(c+i)%26+65))

ลองออนไลน์

คำอธิบาย (ของคำตอบแรก)

c->                          // Method with character parameter and no return-type
  "2XYZABC_0VW5DE_U9F_T9G_S9H_0RQ5JI_2PONMLK"
                             //  Template-String
    .chars().forEach(i->     //  Loop over the unicode values of its characters:
    System.out.print(        //   Print:
     i<59?                   //    If the value is below 59 (so a digit character):
      " ".repeat(i-47)       //     Repeat a space that digit + 1 amount of times
     :(char)(i>90?           //    Else-if the value is above 90 (an underscore character):
              10             //     Print a newline
             :               //    Else:
              (c+i)          //     Add the current value and the input together
                   %26       //     Take modulo-26 of it to get the index in the alphabet
                      +65))) //     And add 65 to make it an uppercase letter

ทำไมไม่เปลี่ยนตัวเลขด้วย unprintables ด้วยวิธีนี้คุณสามารถละเว้นi-47
ศูนย์รวมแห่งความไม่รู้

@EmbodimentofIgnorance ฉันเกรงว่าจะไม่ได้ช่วยประหยัดไบต์ใด ๆ จำนวนช่องว่างคือ 3, 1, 6 และ 10 จำนวน 10 ครั้งจะถูกใช้สามครั้งและ 2 ไบต์สำหรับแต่ละอักขระ ( \n) ดังนั้นไม่ว่าฉันจะใช้ unprintables และ 3x \nกับiหรือ digit-1 ด้วยi-47ทั้งคู่ก็เท่ากับ 134 ไบต์ และน่าเสียดายที่ฉันไม่สามารถพิมพ์0ได้มิฉะนั้นฉันสามารถใช้ 2,0,5,9 แทนและใช้i+1เพื่อบันทึก 1 ไบต์ทั้งหมด
Kevin Cruijssen


2

Haskell, 127 ไบต์

("cXYZABC aVWfDE UjF TjG SjH aRQfJI cPONMLK">>=).(?)
t?c|c>'Z'=' '<$['a'..c]|c<'!'="\n"|t<'B'=[c]|c>'Y'=t?'@'|1<2=pred t?succ c

ลองออนไลน์!

อักขระแต่ละตัวในสตริงที่เข้ารหัสถูกถอดรหัสโดยฟังก์ชัน?ในสตริง:

t?c                             -- 't' is the starting char,
                                -- 'c' the char from the encoded string
   |c>'Z'=' '<$['a'..c]         -- if 'c' is a lowercase letter, return some spaces
                                -- 'a': one, 'b': two, etc
   |c<'!'="\n"                  -- if 'c' is a space, return a newline
   |t<'B'=[c]                   -- if 't' is the letter A, return 'c'
   |c>'Y'=t?'@'                 -- wrap around Z
   |1<2=pred t?succ c           -- else the result is the same as starting one letter
                                -- earlier (pred t) but looking at the successor of 'c'


2

C # (Visual C # Interactive คอมไพเลอร์) , 126 118 ไบต์

n=>$@"   XYZABC
 VW{"",6}DE
U {"",9}F
T {"",9}G
S {"",9}H
 RQ{"",6}JI
   PONMLK".Select(b=>b<65?b:(char)((b+n)%26+65))

บันทึก 8 ไบต์ด้วย @someone ใช่นั่นคือชื่อผู้ใช้จริงของเขา

ลองออนไลน์!


แก้ไข String สำหรับ118 ไบต์ เป็นไปได้ว่าเป็นที่ยอมรับได้ที่จะส่งคืน charcodes (ประหยัด ~ 8 ไบต์) แต่ฉันไม่แน่ใจ
บางคน

@someone Nice ลืมเกี่ยวกับการสอดแทรกสตริง
ศูนย์รวมของความไม่รู้

2

ข้อความค้นหา TSQL ขนาด 238 ไบต์

DECLARE @y char='G'

,@ char(91)=3;WITH C as(SELECT'5585877636333330301125255'z,8a,ascii(@y)x
UNION ALL
SELECT stuff(z,1,1,''),a+left(z,1)/3*13+left(z,1)%3-14,(x+14)%26+65FROM
C WHERE''<z)SELECT
@=stuff(stuff(@,a,1,char(x)),1+a/13*13,1,char(13))FROM
C PRINT @

ลิงก์ทดสอบสำหรับคำตอบนี้ทำให้ตัวแบ่งบรรทัดแตกและไม่รวมช่องว่าง ฉันได้แทนที่ช่องว่างด้วยระยะเวลาและแทนที่ถ่าน (13) ด้วยถ่าน (13) + ถ่าน (10) เพื่อแสดงผลลัพธ์ที่อ่านได้

ลองออนไลน์

Ungolfed:

DECLARE @y char='G'

-- @ is the string being printed last. 
-- @ is populated with 3 to save a byte
-- the number 3 gets replaced later
-- (this could have been any 1 digit value), 
-- @ is automatically filled with spaces, because
-- it is declared as a char(x) and assigned a value
,@ char(91)=3;
-- recursive query
WITH C as
(
-- z string containing digits for the direction of next letter
-- z should not contain 4 because it will point to same position.
-- values in z 0,1,2,3,4,5,6,7,8 can logally convert to 
-- (-1,-1),(-1,0),(-1,1),(0,-1),(0,0),(0,1),(1,-1),(1,0),(1,1)
-- a is the starting position
  SELECT'5585877636333330301125255'z,8a,ascii(@y)x
  UNION ALL
-- stuff remove first character from the z string
-- a calculate next position of the next letter
-- x cycle the input letter
  SELECT stuff(z,1,1,''),a+left(z,1)/3*13+left(z,1)%3-14,(x+14)%26+65
-- repeat recursive until long string is empty
  FROM C
  WHERE''<z
)
SELECT
-- 1st stuff replace the character to created the start of a 
--   logical line in the string @ this is where 3 gets overwritten
-- 2nd stuff replaces a character(space if coded correct) 
--  with the letter at the calculated position.
  @=stuff(stuff(@,a,1,char(x)),1+a/13*13,1,char(13))
FROM C

PRINT @

@MickyT โอเคขอบคุณสำหรับความคิดเห็นของคุณฉันจะแก้ไขในภายหลังวันนี้ถ้าฉันสามารถเข้าถึง db
t-clausen.dk

@MickyT ควรได้รับการแก้ไขแล้ว
t-clausen.dk

1
ดูดีในขณะนี้
MickyT

1

PHP , 236 229 226 ไบต์

<?=($a=ord(file_get_contents('php://stdin'))-65)?preg_replace_callback('~\w~',function($m)use($a){return chr((ord($m[0])-65+$a)%26+65);},'   XYZABC
 VW      DE
U          F
T          G
S          H
 RQ      JI
   PONMLK'):'';

ลองออนไลน์!

Pre-กอล์ฟ:

<?php
$adjust = ord(file_get_contents('php://stdin')) - 65;
echo preg_replace_callback('~\w~', function($match) use ($adjust) {
    $new = ord($match[0]) - 65;
    $new = ($new + $adjust) % 26;
    $new += 65;
    return chr($new);
}, '   XYZABC
 VW      DE
U          F
T          G
S          H
 RQ      JI
   PONMLK');

คำอธิบาย:

การใช้ordเราแปลงเป็นจำนวนเต็มระหว่าง 0 ถึง 255 A คือ 65 และ Z คือ 90
การใช้ความรู้นี้เรารับอินพุตและลดลง 65 เพื่อให้เรามีค่าการปรับ
จากนั้นเราจะวนซ้ำอักขระทั้งหมดเรียกordใช้ลดจำนวนลง 65 เพิ่มค่าการปรับของเรา โดยใช้แบบโมดูโลวงเรากลับลงไปที่ 0 ถ้าพวกเขาเกิน 26
จากนั้นเราจะเพิ่มพวกเขาโดย 65 chrอีกครั้งและแปลงให้กลับเข้ามาในตัวอักษรที่มี

เศร้า php: // stdin สามารถ interogated เพียงครั้งเดียวดังนั้นเราจำเป็นต้องผ่านการป้อนข้อมูลเข้าไปในฟังก์ชั่นในวงของเราทำให้เราไม่สามารถบันทึกไบต์use($a)และต้องประกาศตัวแปรนอกฟังก์ชั่นหยุดเราจากการใช้<?=วิธีการสะท้อน - - เราต้องห่อทุกอย่างในสถานที่ประกอบไปด้วยยักษ์


1

C (GCC) 286 ไบต์

ไม่ใช่สนามกอล์ฟที่สั้นที่สุด แต่ใช้งานได้ดี

#define r(a)(a+c)%26+65
#define R(a)for(i=10;i;a[--i]<33?:(a[i]=r(a[i])));
i;f(c){char*S="          ",T[]="   XYZABC\n",E[]="VW      DE\n",F[]="RQ      JI\n",B[]="   PONMLK";R(T)R(E)R(F)R(B)printf("%s %s%c%s%c\n%c%s%c\n%c%s%c\n %s%s",T,E,r(85),S,r(70),r(84),S,r(71),r(83),S,r(72),F,B);}

ลองออนไลน์





0

Javascript (V8), 316 ไบต์

function a(b){n="abcdefghijklmnopqrstuvwxyz".split(b);n=b+n[1]+n[0],console.log(`   ${n[23]+n[24]+n[25]+n[0]+n[1]+n[2]}\n ${n[21]+n[22]}      ${n[3]+n[4]}\n${n[20]}          ${n[5]}\n${n[19]}          ${n[6]}\n${n[18]}          ${n[7]}\n ${n[17]+n[16]}      ${n[9]+n[8]}\n   ${n[15]+n[14]+n[13]+n[12]+n[11]+n[10]}`)}

ลองออนไลน์

ครั้งแรกที่ลองโค้ดกอล์ฟ ขอบคุณเคล็ดลับ / ข้อเสนอแนะ

รหัสดั้งเดิมก่อนที่จะย่อขนาด:

function a(b){
    var c = ("abcdefghijklmnopqrstuvwxyz").split(b);
    c = b+c[1]+c[0]
    console.log(`   ${c[23]+c[24]+c[25]+c[0]+c[1]+c[2]}\n ${c[21]+c[22]}      ${c[3]+c[4]}\n${c[20]}          ${c[5]}\n${c[19]}          ${c[6]}\n${c[18]}          ${c[7]}\n ${c[17]+c[16]}      ${c[9]+c[8]}\n   ${c[15]+c[14]+c[13]+c[12]+c[11]+c[10]}`)
}

สวัสดีและยินดีต้อนรับสู่ PPCG การส่งของคุณเป็นข้อมูลโค้ดซึ่งเป็น I / O ที่ไม่ถูกต้อง โปรดแก้ไขคำตอบของคุณให้เป็นโปรแกรมหรือฟังก์ชั่นเต็มรูปแบบเช่นเดียวกับในรุ่นที่คุณไม่ย่อเล็กสุด
Jonathan Frech

@ โจนาธาน Fresch ขอบคุณ! จะเพียงพอหรือไม่
Edwin Chua

1
ใช่นี่คือการส่งที่ถูกต้อง
Jonathan Frech



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