สปริงสตริง


11

Sandbox โพสต์ที่นี่

สร้างฟังก์ชั่นหรือโปรแกรมที่ "สตริง" สปริง

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

วิธีการทำให้สตริงเป็นสปริง

  1. จัดรูปแบบ String ให้เป็นคอยล์สปริง ASCII ได้มากเท่าที่ต้องการ
  2. ผัดคอยส์ด้วยช่องว่างจนถึงขดลวดที่ใกล้ที่สุด
  3. อ่านตัวอักษรตามสปริงรอบ ๆ ขดลวด

นี่คือคอยล์สปริง ASCII:

#
# ####
 #    #
# ####
#

โดยที่#s เป็นตัวอักษรของ String

นี่คือตัวอย่าง:

abcdefghijklmnopqrstuvwxyz

กลายเป็น

a
b cdef
 g    h
i jklm
n
o
p qrst
 u    v
w xyz.
.

ตำแหน่งที่.s แทนที่ช่องว่างเพื่อให้มองเห็นได้

จากนั้นสตริงจะอ่านกลับมาดังต่อไปนี้ลงในฤดูใบไม้ผลิ ASCII รอบลูปตีgและuครั้งที่สอง:

1| a  <-3
 V b cdef
    g    h
4| i jklm
 V n  2->
  ...

... การให้:

abgjklmhfedcginopuxyz vtsrquw (มีพื้นที่ต่อท้าย)

กรณีทดสอบ

(เพิ่มใบเสนอราคาเพื่อเน้นช่องว่างต่อท้าย - โปรดละเว้นในแง่ของ IO)

I: "abcdefghijklmnopqrstuvwxyz"
O: "abgjklmhfedcginopuxyz vtsrquw "

I: "!@#"
O: "!@         #   "

I: ""
O: ""

I: "12345 67890"
O: "12690  7 54368 "

I: " "
O: "               "

โปรดทราบว่าความยาวของเอาต์พุตมักจะเป็น 15 เท่าของความยาวของคอยล์สปริง

นี่คือดังนั้นคำตอบที่สั้นที่สุดในหน่วยไบต์ชนะ


ฉันรู้สึกว่ามันจะเป็นการท้าทายมากขึ้นในการทำตามลวดลายตามแนวม้วน
Magic Octopus Urn

@carusocomputing คุณหมายถึงสิ่งที่ตรงกันข้ามหรือไม่
MildlyMilquetoast

codegolf.stackexchange.com/a/107531/59376ปรากฎว่าฉันไม่เข้าใจความท้าทายตามที่เขียนไว้นั่นเป็นความท้าทายอย่างแน่นอน
Magic Octopus Urn

คำตอบ:


2

เยลลี่ 26 ไบต์

“4ṘƝ;þ¦Ɱ’b®¤ị
;⁶x14©¤s®ṖÇ€

TryItOnline!

อย่างไร?

“4ṘƝ;þ¦Ɱ’b®¤ị - Link 1, output for a single coil: char array
           ¤  - nilad followed by link(s) as a nilad
“4ṘƝ;þ¦Ɱ’     - base 250 number, 13140239220751650
          ®   - retrieve from register (14 from main link)
         b    - convert to base, [1,2,7,10,11,12,13,8,6,5,4,3,7,9,0]
            ị - index into the char array

;⁶x14©¤s®ṖÇ€ - Main link: theString
      ¤      - nilad followed by link(s) as a nilad
 ⁶           - a space character
  x          - repeated
   14©       - place 14 into the register and yield 14
;            - concatenate theString with the 14 spaces
       s     - split into chunks of length
        ®    -     retrieve from register (14)
         Ṗ   - pop last entry from the result (removes the space only last entry of 14 chars or less)
          Ç€ - call the last link (1) as a monad for €ach
             - implicit print

5

Python 2, 104 102 98 ไบต์

f=lambda t:''.join((t+' '*13)[ord(x)-97+y*14]for y in range(len(t)/14+1)for x in'abgjklmhfedcgin')

ขอบคุณสำหรับความคิดเห็น!

https://tio.run/#2VDVy

เดิม:

t=raw_input()+' '*13
print''.join(t[ord(x)-97+y*14]for y in range(len(t)/14)for x in'abgjklmhfedcgin')

คุณก็สามารถใช้และใช้การป้อนข้อมูลในรูปแบบinput() "<stuff>"
HyperNeutrino

สุดยอดกอล์ฟครั้งแรก! เมื่อ Alex L. ชี้ให้เห็นเราอนุญาตให้ป้อนข้อมูลด้วยเครื่องหมายคำพูด นอกจากนี้คุณยังสามารถใช้lambdaเพื่อให้ฟังก์ชั่นที่ไม่ระบุชื่อมากกว่าโปรแกรม - นี่คือมักจะสั้น
xnor

ล้มเหลวสำหรับกรณีทดสอบสตริงว่างด้วย IndexError ฉันคิดว่าคุณอาจต้องเปลี่ยน 13 ถึง 14 และปิดค่าสุดท้าย (เหมือนคำตอบ Jelly ของฉัน)
Jonathan Allan

... เปลี่ยน+13ไป+14และ+1เพื่อ+(len(t)%14>0)จะทำ แต่ต้องมีวิธีที่สั้นกว่า
Jonathan Allan

3

JavaScript (ES6), 79 ไบต์

f=
s=>s.replace(/.{1,14}/g,s=>'0169abc7543268d'.replace(/./g,c=>s['0x'+c-0]||' '))
<input oninput=o.textContent=f(this.value)><pre id=o>

สตริงเลขฐานสิบหกที่ถูกขโมยไปอย่างไร้ยางอายจาก @ETHproductions


@ETHproductions ขอบคุณแก้ไขแล้ว
Neil

นั่นยอดเยี่ยม!
dodov

เป็นเรื่องดีที่ตัวอย่างจะให้คุณเห็นผลลัพธ์ขณะพิมพ์
MildlyMilquetoast


2

JavaScript (ES7), 144 143 141 114 104 103 ไบต์

ขอบคุณ ETHProductions สำหรับการประหยัด 10B!

a=>[...b=a+' '.repeat(15-a.length%15)].map((_,c)=>b['0x'+'0169abc7543268d'[c%15]-0+(c/15|0)*14]).join``

ตัวอย่าง

f=a=>[...b=a+' '.repeat(15-a.length%15)].map((_,c)=>b['0x'+'0169abc7543268d'[c%15]-0+(c/15|0)*14]).join``
f('abcdefghijklmnopqrstuvwxyz')

เอาท์พุต

abgjklmhfedcginopuxyz vtsrquw 

ดีมาก. คุณสามารถบันทึกบางไบต์ด้วยการแปลงอาร์เรย์เป็นสตริงเลขฐานสิบหกและใช้+('0x'+whatever)เพื่อแปลงเป็นตัวเลข:(_,c)=>b[(c/15|0)*14+ +('0x'+'0169abc7543268d'[c%15])]
ETHproductions

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

คุณสามารถทำได้แม้กระทั่ง'0x'+'...'[c%15]-0+(c/15|0)*14เพื่อช่วยตัวเองวงเล็บ :-)
ETHproductions

คุณถูก. ที่เพิ่ม
ลุค

2

Perl 6 , 61 bytes

{S:g/(.)**1..14/{[~] $0["abgjklmhfedcgin".ords X-97]X//" "}/}

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

โครงสร้างพื้นฐานคือ:

{                                  }  # A lambda.
 S:g/(.)**1..14/{                }/   # Regex-replace segments of 1-14 characters, with:
                     $0               #   The single-char submatches captured by the parens.
                       [  ]           #   Index them using certain indices (see below).
                           X//" "}    #   Replace each undefined element with a space.
                 [~]                  #   Concatenate the characters.

นิพจน์ที่ใช้เพื่อจัดทำดัชนีลงในแต่ละเซ็กเมนต์ 14 อักขระคือ"abgjklmhfedcgin".ords X- 97ซึ่งทำงานดังนี้:

  1. abgjklmhfedcginใช้สตริงกำหนดค่าตายตัว
  2. รับ codepoints 97 98 103 106 107 108 109 104 102 101 100 99 103 105 110ที่:
  3. ลบ 97 0 1 6 9 10 11 12 7 5 4 3 2 6 8 13จากแต่ละหมายเลข:

Perl 6 , 64 ไบต์

{[~] .comb(14)».comb»[0,1,6,9..12,7,5...2,6,8,13].flat X//" "}

ลองออนไลน์!

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

โครงสร้างพื้นฐานคือ:

{                                    }  # A lambda.
     .comb(14)                          # Split the argument into substrings of <= 14 chars.
              ».comb                    # Split each substring into a list of characters.
                    »[  ]               # Index each list using the same indices (see below).
                         .flat          # Flatten the resulting nested list.
                               X//" "   # Replace each undefined element with a space.
 [~]                                    # Concatenate the list to get a string again.

ดัชนีเหมือนข้างบน แต่เนื่องจากเรากำลังเรียกร้อง.flatอยู่แล้วเราสามารถใช้ซ้อนกัน ( แต่ 1 ไบต์สั้น) 0,1,6,9..12,7,5...2,6,8,13การแสดงออกสำหรับพวกเขา:

(ดูเล็กน้อย แต่จริง ๆ แล้วต้องอาศัยการแยกวิเคราะห์ของ Rakudo Perl 6 ที่อาจเป็นข้อผิดพลาดในการเขียนโดยไม่ใช้ประโยชน์จากข้อผิดพลาดนั้นเราจะต้องเพิ่ม parens รอบ ๆ5...2)


2

Befunge-93, 97 bytes

<>0>v%2g3\p89:-1+*"!"!:+1<_@#`0:~
,^\,_\:98g\9p1+:76+`#v_:~^
^,,g96g98g9+67,,,,,$$_
==    =  ====

ลองออนไลน์!

นี่คือการแยกส่วนของซอร์สโค้ดที่มีการเน้นส่วนประกอบต่างๆ

ซอร์สโค้ดที่มีไฮไลต์พา ธ การเรียกใช้งาน

* * * *ลูปหลักเริ่มต้นการดำเนินการจากขวาไปซ้ายล้อมรอบไปทางด้านขวาของสนามแข่งขัน นี่คือที่เราอ่านตัวอักษรตัวแรกจาก stdin และยุติถ้ามันเป็น EOF
* * * *ส่วนถัดไปจะทำให้แน่ใจว่าตัวอักษร EOF ใด ๆ c = c + 31*!(c+1)จะถูกแปลงเป็นพื้นที่โดยใช้สูตรที่ แม้ว่าสิ่งนี้จะไม่นำไปใช้กับการทำซ้ำครั้งแรก แต่ก็สามารถเกิดขึ้นได้ในการส่งผ่านครั้งต่อไป
* * * *สำเนาของอักขระจะถูกบันทึกลงในหน่วยความจำชั่วคราวจากนั้นทำการค้นหาดัชนีปัจจุบันบนตารางที่บรรทัดที่สี่ ( * * * *) เพื่อตรวจสอบว่าอักขระควรถูกส่งออกหรือไม่
* * * *หากตัวละครจะต้องมีการส่งออกเราใช้สาขาซ้าย ทำการสลับที่นี่เพื่อยกเลิกการสลับที่จะเกิดขึ้นต่อไปจากนั้นจะมีการผลักศูนย์เพื่อบังคับให้สาขาถูกต้อง
* * * *หากตัวละครไม่ได้ถูกส่งออกเราจะสลับมันลงในสแต็กใต้ตัวนับดัชนี (นี่คือการสลับที่ได้รับการยกเลิกในสาขาด้านซ้าย) และในทั้งสองกรณีเราบันทึกอักขระลงในหน่วยความจำที่ออฟเซ็ตดัชนีปัจจุบันเพิ่มดัชนีและตรวจสอบว่ามันมากกว่า 13
* * * *หรือไม่ถ้าไม่ใช่เราอ่านอักขระถัดไปจาก stdin และวนซ้ำภายใน
* * * *หากเป็นเช่นนั้นเราจะเสร็จสิ้นชุดอักขระ 14 ตัว 7 ตัวถูกเอาต์พุต ( abgjklm) และเหลืออีก 7 ตัวบนสแต็ก (cdefhin ) เราวางสองคนสุดท้ายออกส่วนที่เหลืออีก 5 ( hfedc) แล้วดึงข้อมูลและการส่งออกกรณีพิเศษg, iและnจากหน่วยความจำ
* * * *และนั่นจะนำเรากลับไปที่จุดเริ่มต้นของลูปหลักซึ่งเราจะทำขั้นตอนนี้ซ้ำอีกครั้งสำหรับอักขระ 14 ตัวถัดไป


คำอธิบายดีมากทำได้ดี
MildlyMilquetoast

1

มาติกา 77 72 ไบต์

ขอบคุณ JungHwan Min สำหรับการบันทึก 5 ไบต์!

Join@@Partition[#,14,14,{1,1}," "][[;;,LetterNumber@"abgjklmhfedcgin"]]&

ฟังก์ชั่นที่ไม่ได้ตั้งชื่อใช้รายการตัวอักษรเป็นอินพุตและส่งคืนรายการอักขระ Partition[#,14,14,{1,1}," "]แยกอินพุตให้เป็นรายการย่อยของความยาว 14 โดยมีช่องว่างหากจำเป็น LetterNumber@"abgjklmhfedcgin"ประเมินให้{1,2,7,10,11,12,13,8,6,5,4,3,7,9,14}ซึ่งบ่งชี้ว่าคำสั่งซื้อแต่ละรายการย่อยความยาว -14 ใน (ทำซ้ำองค์ประกอบที่ 7 อย่างเหมาะสม) จากนั้น[[;;,...]]ใช้องค์ประกอบของรายการย่อยความยาว -14 ทั้งหมดในลำดับนั้นและJoin@@รวมคำตอบเข้าด้วยกัน

การส่งก่อนหน้า:

Join@@Partition[#,14,14,{1,1}," "][[All,83224017339955102~IntegerDigits~16]]&

1
LetterNumber@"abgjklmhfedcgin"เป็นวิธีที่สั้นกว่าในการบีบอัดรายการ นอกจากนี้;;แทนที่จะAllบันทึกเป็นไบต์
JungHwan Min

คำแนะนำยอดเยี่ยม!
Greg Martin

1

Python 3 , 86 ไบต์

lambda s:''.join(t[i%14]for t in zip(*[iter(s+' '*13)]*14)for i in b'Tq>]zQ|1/X;:L$o')

ลองออนไลน์!

เป็นโบนัสสตริงTq>]zQ|1/X;:L$oเป็นโปรแกรม CJam ที่ถูกต้องซึ่งพิมพ์อักขระที่ไม่ซ้ำกันในอินพุตมาตรฐานเรียงลำดับ ลองออนไลน์! (+ คำอธิบาย)


0

PHP, 94 ไบต์

foreach(str_split($argv[1],14)as$s)for($i=0;$c=abgjklmhfedcgin[$i++];)echo$s[ord($c)-97]??" ";

แยกอาร์กิวเมนต์บรรทัดคำสั่งออกเป็น 14 ไบต์และวนซ้ำผ่านสตริงการแปลเป็นดัชนีสำหรับสตริงย่อย ทำงานด้วยphp -nr '<code>' <string>ทำงานด้วย

ฉันดีใจที่พบว่า??ยังยอมรับสตริงว่าง (สำหรับดัชนี "ไม่ถูกต้อง") เป็นโมฆะ


0

Ruby, 83 ไบต์

->s{v="";(s+" "*13).scan(/.{14}/){|y|"0169:;<7543268=".chars{|o|v+=y[o.ord-48]}};v}

แนวคิดแรกคือการใช้เลขฐานสิบหก แต่ ord-48 จะบันทึกไบต์อื่น (ถูกขโมยจากคำตอบของ throx)

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