รหัสหน้ารหัส


15

บทนำ

โค้ดเพจแม็พค่าจำนวนเต็มกับอักขระเฉพาะ เราสามารถเห็นภาพหน้ารหัสดังนี้:

+ + --- --- --- + + + --- --- --- + + + --- --- --- + + + --- --- --- + + - - + --- + --- + --- + --- +
| | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | A | B | C | D | E | F |
+ + --- --- --- + + + --- --- --- + + + --- --- --- + + + --- --- --- + + - - + --- + --- + --- + --- +
| 0 | q | w | e | r | t | z | คุณ | ฉัน | o | p | a | s | d | f | g | j |
+ + --- --- --- + + + --- --- --- + + + --- --- --- + + + --- --- --- + + - - + --- + --- + --- + --- +
| 1 | k | l | y | x | c | v | b | n | m | Q | W | E | R | T | Z | U |
+ + --- --- --- + + + --- --- --- + + + --- --- --- + + + --- --- --- + + - - + --- + --- + --- + --- +
| 2 | ฉัน | O | P | A | S | D | F | G | H | J | | | | | | |
+ + --- --- --- + + + --- --- --- + + + --- --- --- + + + --- --- --- + + - - + --- + --- + --- + --- +

แถวระบุเลขตัวแรกและคอลัมน์เป็นเลขตัวที่สองของเลขฐานสิบหก

ความท้าทาย

รับสตริงที่มีอักขระไม่ซ้ำกัน 16-255 รายการส่งออกโค้ดเพจที่เกี่ยวข้องโดยใช้ดัชนี zero-based ของอักขระแต่ละตัวในสตริงตามค่าของมัน qwertzuiopasdfghjklyxcvbnmQWERTZUIOPASDFGHJตัวอย่างเช่นอินพุตจะให้ตารางข้างบน

  • ผลลัพธ์จะต้องอยู่ในรูปแบบที่แน่นอนเช่นเดียวกับตารางด้านบน บรรทัดใหม่ต่อท้ายเป็นตัวเลือกเท่านั้น
  • หากความยาวของอินพุตไม่เท่ากับทวีคูณของ 16 คุณจะต้องเริ่มแถวใหม่สำหรับอักขระที่เหลือและปล่อยให้เซลล์ที่ไม่ได้ใช้ว่างเปล่า (= เติมด้วยช่องว่าง 3 ช่อง)
  • อักขระแต่ละตัวจะถูกวางไว้ตรงกลางของเซลล์โดยมีช่องว่างหนึ่งช่องทางด้านซ้ายและขวา
  • 0123456789ABCDEFค่าในแถวแรกและคอลัมน์จะได้รับโดยตัวเลขฐานสิบหกกับตัวเลข เหล่านี้จะเต็มไปด้วยพื้นที่หนึ่งไปทางซ้ายและขวาเช่นกัน คุณอาจเลือกที่จะใช้เลขฐานสิบหกตัวเล็ก แต่คุณต้องติดหนึ่งหลัก
  • ตัวละครในปัจจุบันเฉพาะในการส่งออกที่มียัติภังค์-, pluses +ท่อ|ช่องว่างตัวเลขสำหรับตัวเลขฐานสิบหกและตัวอักษรจากการป้อนข้อมูล
  • บิวด์อินใด ๆ ที่เกี่ยวข้องกับตาราง ASCII-art หรือแก้ไขปัญหาเล็กน้อยในทางใด ๆ เป็นสิ่งต้องห้าม
  • คุณอาจสมมติว่าอินพุตประกอบด้วยอักขระเฉพาะของการเข้ารหัสเฉพาะ โปรดระบุว่าเป็นกรณีนี้หรือไม่
  • ถ้าภาษาของคุณสามารถเพียงจัดการการป้อนข้อมูล ASCII คุณอาจถือว่าการป้อนข้อมูล ASCII เท่านั้นและตัวอักษรซ้ำแล้วซ้ำอีก

กฎระเบียบ

Happy Coding!


เราสามารถใช้เลขฐานสิบหกตัวเล็กได้หรือไม่
Doorknob

@ doorknob ใช่มันชัดเจนในความท้าทาย
Denker

1
เราสามารถสมมติว่าอินพุตเป็น ASCII (ด้วยตัวอักษรซ้ำ ๆ ได้หรือไม่)?
Luis Mendo

@DenkerAffe ที่จะขัดแย้งกับคำว่า "ไม่เหมือนใคร" หรือกับ "255" ในสตริงที่มีอักขระที่ไม่ซ้ำกันถึง 16-255 ตัวแม้ว่า ...
Luis Mendo

1
@ LuisMendo อืมใช่จริง อนุญาตให้ใช้สำหรับภาษาที่สามารถรองรับ ASCII ได้เท่านั้น
Denker

คำตอบ:


7

Pyth, 60 ไบต์


K+*"+---"hJ16\+Vm++"| "j" | "d" |"+]+]d.HMJ.e+.Hk.[bdJczJNK

ขึ้นบรรทัดใหม่เป็นสำคัญ

ลองที่นี่


คุณสามารถแสดงรหัส transpiled ได้หรือไม่?
CalculatorFeline

@CatsAreFluffy เพียงเปิดใช้งานโหมดดีบักในล่ามออนไลน์
Denker

ขึ้นบรรทัดใหม่ทำอะไร
Leun Nun

@Adnan อ๊ะนั่นคือการกำกับดูแลในส่วนของฉัน คงที่ขอบคุณ
Doorknob

@KennyLau +---+---+---[...]มันพิมพ์ครั้งแรก ใน Pyth ฟังก์ชัน newline จะพิมพ์และส่งคืนอาร์กิวเมนต์
Doorknob

5

Python 3.5, 326 355 ไบต์:

( +29 ไบต์เนื่องจากถ้าความยาวของแถวสุดท้ายไม่ใช่จำนวน 16 เซลล์ที่ไม่ได้ใช้ควรเว้นว่างไว้ (แม้ว่าในความคิดของฉันมันดูดีกว่ามากถ้าเซลล์ว่างเหล่านั้นไม่ได้แสดง )

def f(r):o=' 0123456789ABCDEF';r=[r[0+i:16+i]for i in range(0,len(r),16)];print('+---'*17+'+\n|',end='');[print(' {} |'.format(h),end='')for h in o];print(''.join([str(e+' | ')if e.isdigit()or e.isalpha()else str(e)for e in''.join([str('\n'+'+---'*17+'+\n| '+x[0]+x[1])for x in zip(o[1::1],r)])]),end='');print('  |'+'   |'*(15-len(r[-1]))+'\n'+'+---'*17+'+')

ทำงานเหมือนจับใจ!

ตัวอย่างอินพุตและเอาต์พุต:

Input: 'hopper'

Output:

    +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
    |   | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | A | B | C | D | E | F |
    +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
    | 0 | h | o | p | p | e | r |   |   |   |   |   |   |   |   |   |   |
    +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+

Input: 'honkhonkhonkhonkhonk'

Output:

    +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
    |   | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | A | B | C | D | E | F |
    +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
    | 0 | h | o | n | k | h | o | n | k | h | o | n | k | h | o | n | k | 
    +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
    | 1 | h | o | n | k |   |   |   |   |   |   |   |   |   |   |   |   |
    +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+

Input: 'hi'

Output: 

    +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
    |   | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | A | B | C | D | E | F |
    +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
    | 0 | h | i |   |   |   |   |   |   |   |   |   |   |   |   |   |   |
    +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+

ฉันหวังว่ามันจะโอเค

นอกจากนี้ที่นี่เป็นอีกรุ่นที่ฉันสร้างขึ้นสำหรับความท้าทายนี้ซึ่งถึงแม้ว่าจะเป็นตัวเลือกที่ไม่ถูกต้องเนื่องจากมันไม่ได้พิมพ์เซลล์ว่างเปล่าพิเศษสำหรับแถวสุดท้ายหากความยาวของมันไม่ได้เป็น 16 หลายตัว มากกว่าที่ต้องการโดย OP ส่วนใหญ่เป็นเพราะมันไม่ได้แสดงเซลล์ว่างถ้าแถวสุดท้ายไม่ได้เป็นหลายเท่าของ 16 แต่แทนที่จะแสดงเฉพาะเซลล์ที่เต็มและนั่นคือ:

def f2(r):o=' 0123456789ABCDEF';r=[r[0+i:16+i]for i in range(0,len(r),16)];print('+---'*17+'+\n|',end='');[print(' {} |'.format(h),end='')for h in o];print(''.join([str(e+' | ')if e.isdigit()or e.isalpha()else str(e)for e in''.join([str('\n'+'+---'*17+'+\n| '+x[0]+x[1])for x in zip(o[1::1],r)])]));print('+---'*(len(r[-1])+1)+'+')

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

Input: 'ggreuuobgugoubgoubguorgoruguor'

Output:

    +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
    |   | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | A | B | C | D | E | F |
    +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
    | 0 | g | g | r | e | u | u | o | b | g | u | g | o | u | b | g | o | 
    +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
    | 1 | u | b | g | u | o | r | g | o | r | u | g | u | o | r | 
    +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+

    (As you can see, there are no empty cells shown in the entire table. This looks much better to me.)

" หากความยาวของอินพุตไม่เท่ากับทวีคูณของ 16 คุณจะต้องเริ่มแถวใหม่สำหรับอักขระที่เหลือและปล่อยให้เซลล์ที่ไม่ได้ใช้ว่างเปล่า (= เต็มไปด้วย 3 ช่องว่าง) "
Leun Nun

@ KennyLau อ่าใช่ ฉันไม่เห็นว่า แดง ... กำลังดำเนินการแก้ไข แม้ว่าจริงๆแล้วนี่ดูดีกว่าการแสดง OP หนึ่งครั้งคุณไม่คิดเหรอ?
R. Kap

ทำไมถึงลงคะแนน?
R. Kap

@ R.Kap ฉันไม่สามารถบอกคุณได้ แต่ที่นี่มี upvote
แมว


1

JavaScript (ES6), 148 ไบต์

s=>(s=' 0123456789ABCDEF'+s+' '.repeat(15)).match(/(?!^).{16}/g).map((t,i)=>d+`+
| `+[s[i],...t].join` | `,d=`+---`.repeat(17)).join` |
`+` |
${d}+`

' 0123456789ABCDEF'ที่มีอยู่เพื่อเติมคอลัมน์แรก แต่ยังครอบคลุมถึงสิ่งอำนวยความสะดวกแถวแรก สตริงอินพุตนั้นจะถูกเสริมด้วยช่องว่างเพื่อให้สามารถแบ่งออกเป็นสตริงย่อยของความยาว 16 พร้อมกับ(?|^)ป้องกันไม่ให้มีการจับคู่พื้นที่นำ ที่เหลือก็แค่เข้าร่วมชิ้น


1

Excel VBA, 157 ไบต์ (โกง?)

ไม่ระบุชื่อฟังก์ชัน VBE หน้าต่างทันใดที่ทำลายได้รับอินพุตจากช่วง[A1]และเอาต์พุตไปยังActiveSheetวัตถุ

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

[B1:Q1]="=Dec2Hex(Column(B1)-2)":L=[Len(A1)]:For i=0To l:Cells(Int(i/16)+2,i Mod 16+2)=Mid([A1],i+1,1):Next:For i=1To Int(l/16)+1:Cells(i+1,1)=i:Next:[A1]=""

ที่จัดรูปแบบ

[B1:Q1]="=Dec2Hex(Column(B1)-2)"
L=[Len(A1)]
For i=0To l:Cells(Int(i/16)+2,i Mod 16+2)=Mid([A1],i+1,1):Next
For i=1To Int(l/16)+1:Cells(i+1,1)=i:Next
[A1]=""

อินพุต / เอาต์พุต

ได้รับ:

[A1]="qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJ"

ผลลัพธ์ที่สร้างขึ้นคือ

สิ่งที่ตาราง


probs ไม่ถูกต้อง แต่เจ๋งอยู่ดี เพื่อให้คล้ายกันมากขึ้น (แต่ยังไม่ถูกต้อง?) คุณควรเปิดใช้เซลล์ผู้โดยสารที่เหมาะสม
Lyndon White
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.