Bir kod sayfasını kodlama


15

Giriş

Kod sayfası, tamsayı değerlerini belirli bir karakterle eşleştirir. Bir kod sayfasını şu şekilde görselleştirebiliriz:

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

Satırlar, ilk basamağı ve sütunlar onaltılık sayının ikinci basamağını belirtir.

Meydan okuma

16-255 benzersiz karakterden oluşan bir dize verildiğinde, dizedeki her karakterin sıfır temelli dizinini değer olarak kullanarak karşılık gelen kod sayfasını çıktılar. qwertzuiopasdfghjklyxcvbnmQWERTZUIOPASDFGHJÖrneğin girdi yukarıdaki tabloyu verecektir.

  • Çıktı, yukarıdaki tabloyla tam olarak aynı formatta olmalıdır. Yalnızca izleyen bir yeni satır isteğe bağlıdır.
  • Giriş uzunluğu 16'nın katı değilse, kalan karakterler için yeni bir satır başlatmanız ve kullanılmayan hücreleri boş bırakmanız gerekir (= 3 boşlukla doldurulmuş).
  • Her karakter bir hücrenin tam ortasına yerleştirilir, sol ve sağda bir boşlukla doldurulur.
  • İlk satır ve sütundaki değerler basamaklı onaltılık sayılarla verilir 0123456789ABCDEF. Bunlar solda ve sağda bir boşlukla doludur. Küçük harfli onaltılık basamaklar kullanmayı tercih edebilirsiniz, ancak bir taneye bağlı kalmanız gerekir.
  • Çıktıda bulunan karakterler yalnızca kısa çizgiler -, artılar +, borular |, boşluklar , onaltılık sayılar için rakamlar ve girdideki karakterlerdir.
  • ASCII-art tablolarıyla ilgili olan veya sorunu herhangi bir şekilde önemsizleştiren herhangi bir yerleşik yasaktır.
  • Girişin yalnızca belirli bir kodlamanın karakterlerinden oluştuğunu varsayabilirsiniz. Lütfen durumun böyle olup olmadığını belirtin.
  • Diliniz yalnızca ASCII girişini işleyebiliyorsa , yalnızca ASCII girişini ve tekrarlanan karakterleri kabul edebilirsiniz.

kurallar

Mutlu Kodlama!


Küçük harfli onaltılık basamaklar kullanabilir miyiz?
Kapı Tokmağı

@Doorknob Evet, meydan okumada netleştirdi.
Denker

1
Girişin ASCII olduğunu düşünebilir miyiz (muhtemelen tekrarlanan karakterlerle)?
Luis Mendo

@DenkerAffe 16-255 benzersiz karakter dizisi verildiğinde "benzersiz" kelimesi veya "255" kelimesiyle çelişir ...
Luis Mendo

1
@LuisMendo Hmm evet, bu doğru. Buna sadece ASCII işleyebilen diller için izin vereceğim.
Denker

Yanıtlar:


7

Pyth, 60 bayt


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

Baştaki yeni satır önemlidir.

Burada deneyin.


Aktarılan kodu gösterebilir misiniz?
CalculatorFeline

@CatsAreFluffy Çevrimiçi yorumlayıcıda hata ayıklama modunu etkinleştirmeniz yeterlidir.
Denker

Yeni satır ne yapıyor?
Leaky Nun

@Adnan Whoops, bu benim açımdan bir gözetimdi. Düzeltildi, teşekkürler.
Kapı Tokmağı

@KennyLau İlk basar +---+---+---[...]. Pyth'te, yeni satır işlevi yazdırır ve argümanını döndürür.
Kapı Tokmağı

5

Python 3.5, 326355 bayt:

( +29 bayt, çünkü son satırın uzunluğu 16'nın katı değilse , kullanılmayan hücreler boş bırakılmalıdır (bence, bu boş hücrelerin gösterilmemesi bile çok daha iyi görünüyor) )

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+'+')

Tıkır tıkır çalışıyor!

Örnek Giriş ve Çıkışlar:

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 |   |   |   |   |   |   |   |   |   |   |   |   |   |   |
    +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+

Umarım bu iyidir.

Ayrıca, burada ben gelmez beri geçersiz bir adayı olmasına rağmen bu meydan, için oluşturulan bir başka versiyonudur değil onun uzunluk, çok sayıda 16 değilse çok daha iyi görünümlü sayfa çıkışları bence, son satır için ekstra boş hücreleri çıktısını OP'nin gerektirdiğinden daha çok, çünkü son satır 16'nın katı değilse boş hücreleri bile göstermiyor, bunun yerine dolu hücreleri gösteriyor ve hepsi bu:

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)+'+')

Yukarıdaki geçersiz kod için örnek bir giriş ve çıkış:

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.)

" Giriş uzunluğu 16'nın katı değilse, kalan karakterler için yeni bir satır başlatmanız ve kullanılmayan hücreleri boş bırakmanız gerekir (= 3 boşlukla doldurulur). "
Leaky Nun

@KennyLau Ah, evet. Bunu görmedim. Dang ... düzenlemek şimdi devam ediyor. Dürüst olmak gerekirse, bu OP'nin gösterdiğinden çok daha iyi görünüyor, değil mi?
R. Kap

Neden aşağı oy?
R. Kap

@ R.Kap Size tam olarak söyleyemedim, ama burada, bir oylama var
kedi


1

JavaScript (ES6), 148 bayt

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

' 0123456789ABCDEF'İlk sütunu doldurmak için var, ancak elverişli da ilk satırı kapsar. Daha sonra giriş dizesi, (?|^)ön boşluğun eşleşmesini önleyerek, uzunluk 16 alt dizelerine bölünmesini sağlamak için boşluklarla doldurulur . Gerisi sadece parçaları birleştiriyor.


1

Excel VBA, 157 Bayt (Hile?)

Anonim VBE Girişi [A1]ve çıktıları ActiveSheetnesneye tahrip edici bir şekilde alan Anında Pencere işlevi .

golfed

[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]=""

biçimlendirilmiş

[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]=""

Giriş çıkış

Verilen:

[A1]="qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJ"

üretilen çıktı

Tablo şey


problar geçerli değil ama yine de havalı. Daha benzer hale getirmek için (ancak yine de geçersiz mi?) Uygun hücre yatılılarını açmalısınız.
Lyndon White
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.