Banyak bahasa pemrograman ditulis menggunakan ASCII, tab, dan baris baru yang sepenuhnya dapat dicetak. 97 karakter ini kemudian disimpan dalam byte 8-bit (yang sebenarnya mampu menampung 256 karakter berbeda!), Yang sangat tidak efisien - terutama dalam kode-golf, di mana setiap byte dihitung! Dalam tantangan ini, Anda akan dapat mengurangi skor Anda dengan menggunakan konversi basis.
Tantangan
Program / fungsi Anda mengambil string atau karakter array sebagai input, yang kemudian diartikan sebagai nomor base-97 . Ini kemudian mengonversikannya ke angka dasar-256 , dan menghitung jumlah simbol (yaitu, byte) yang diperlukan untuk mewakili angka ini. Hitungan ini akan menjadi nilai output / pengembalian program / fungsi Anda.
Contoh sederhana menggunakan basis-2 dan basis-10 (biner dan desimal): jika inputnya adalah 10110
, output akan menjadi 2, karena 10110 2 = 22 10 (dua digit diperlukan untuk mewakili output). Demikian pula, 1101 2 menjadi 13 10 , memberikan output 2 juga, dan 110 2 menjadi 6 10 , sehingga outputnya adalah 1.
String input dapat berisi semua 95 karakter ASCII yang dapat dicetak, serta baris baru \n
dan tab literal \t
, yang menciptakan alfabet sumber 97 simbol untuk konversi basis Anda. Maka, alfabet yang tepat adalah (mengganti \t
dan \n
dengan tab dan baris literal aktual; perhatikan ruang literal mengikuti baris baru) :
\t\n !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~
Perhatikan bahwa urutan alfabet ini penting: misalnya, base-97 \t
berhubungan dengan desimal 0
, dan !
sesuai dengan desimal 3
.
Beberapa testcases: (Anda tidak perlu menangani string kosong)
Input Output
'[email protected]' 15
'All your base are belong to us!' 26
' abcd' 9
'~ abcd' 10
'ABCDEFGHIJK' 9
'zyxwvutsrpq' 10
'{".~"}.~' 7
'\t\t\t\t\t\t\t\t' 1 (with \t a literal tab; the result is 0, which can be represented with 1 byte)
'!\t\t\t\t\t\t\t\t' 7 (with \t a literal tab)
Mencetak gol
Jika entri Anda hanya menggunakan ASCII yang dapat dicetak, baris baru dan / atau tab: Skor program Anda akan menjadi output dari program Anda, ketika diberi kode sumbernya sendiri sebagai input.
Jika entri Anda menggunakan karakter apa pun yang tidak dapat dicetak ASCII, baris baru atau tab: Skor program Anda hanyalah jumlah byte, seperti dalam kode-golf .
sumber
Jawaban:
Python 2 , skor
737271Sunting: -1 terima kasih kepada @Jonathan Allan
Cobalah online!
sumber
/
harus OK, saya pikiror 1
dapat diganti dengan|1
dalam hal ini.Japt , skor 19 (23 byte)
Uji secara online!
Secara kebetulan, saya tidak berpikir ini bisa bermain golf bahkan dengan karakter non-ASCII ...
Penjelasan
sumber
Jelly ,
1817 byte - skor1817-1 byte terima kasih kepada Erik the Outgolfer (tidak perlu daftar daftar terjemahan)
Cobalah online!
Bagaimana?
--Yang terbaik yang saya miliki dengan ASCII adalah skor 29 :
- ini juga sangat tidak efisien. Ini menerjemahkan tata cara seperti di atas, tetapi konversi dari basis 97 dicapai dengan mengulangi nilai-nilai dan menjumlahkan, daripada menggunakan perkalian langsung - yaitu untuk mengubahnya
{".~"}.~
mendapatkan indeks yang disesuaikan[93,4,16,96,4,95,16,96]
kemudian membalikkan (U
) dan mengulanginya untuk membuat[[96,96,..., 97⁷ times ...,96],[16,16,... 97⁶ times ...16],[95,95,... 97⁵ times ...95],[4,4,... 97⁴ times ...4],[96,96,... 97³ times ...96],,[16,16,... 97² times ...,16],[4,4,... 97 times ...4],[93]]
dan kemudian menjumlahkan, mengkonversi ke basis 256 dan mendapatkan panjang (jika belum kehabisan memori: p).sumber
J , 36 byte, skor = 30
Cobalah online!
J hanya menggunakan karakter ASCII 7-bit untuk primitifnya.
Penjelasan
sumber
Gaia , 14 byte, skor 14
Cobalah online!
Penjelasan
Hanya ASCII
Ini adalah yang terbaik yang bisa saya lakukan dengan hanya menggunakan ASCII, memberikan skor 19:
Kesulitannya adalah dalam konversi input. Satu-satunya cara yang masuk akal untuk mengkonversi dari sistem base-97 adalah menggunakan
B
, karena pemetaan memerlukan non-ASCII¦
. Selain itu, saat ini tidak ada cara untuk membuat rentang karakter tanpa memetakanc
rentang angka, yang mengalami masalah yang sama. Solusi terbaik yang bisa saya lihat adalah membangun string₵R
dan menghindarinya.sumber
₵R
dan₵r
tidak mudah untuk menggantikan, meskipun₸
jelas adalah), tetapi mungkin menarik untuk melihat bagaimana membandingkannya.₵
adalah kode titik 8373 dan saya tidak dapat melakukan rentang karakter hanya di ASCII, yang sedikit membuat frustrasi karena sebagian besar program ini adalah ASCII.c
tapi diterapkan pada setiap karakter,$
hanya menunjukkan semua angka)c
daftar, yang akan menjadic¦
₵r
mudah untuk mengganti karena saya hanya bisa menggunakan256
, saya hanya menggunakan itu karena 1 byte lebih pendek dan programnya bukan ASCII saja.Python 2 , skor 60
Cobalah online!
Pemetaan ke base-97
Nilai karakter diperoleh dengan
ord(c)-[30,9][c<' ']
: kode ASCII-nya, minus 9 untuk tab dan baris baru (yang mendahului secara' '
leksikografis), atau minus 30 untuk yang lainnya.Mengkonversi ke angka
Kami gunakan
reduce
untuk mengonversi string menjadi angka. Ini setara dengan komputasiKomputasi dasar-panjang 256
Nilai kembali dari
bin
adalah string, yang terlihat seperti ini:Sebut panjangnya
L
. Nilai dengann
representasi biner -bit memiliki representasiceil(n/8)
-bit basis-256. Kita dapat menghitungn
sebagaiL-2
; juga,ceil(n/8)
dapat ditulis sebagaifloor((n+7)/8)
=n+7>>3
, jadi jawaban kami adalahL-2+7>>3
=L+5>>3
.Kasus di mana string input memiliki nilai 0 ditangani dengan benar, sebagai
bin
pengembalian"0b0"
, jadi kami mengembalikan3+5>>3
= 1.sumber
c>=' '
atau Anda memetakan ruang ke 23 bukannya 2. Dalam kode golf biasac>'\x1f'
(byte mentah) akan membantu saya, tetapi itu tidak dapat dicetak ASCII ...APL, skor 24 (byte *)
Diasumsikan default
⎕IO←1
, jika tidak ubah saja 3131 ke ¯30.Penjelasan:
Contoh:
________________
*: APL dapat ditulis dalam charset lawasnya sendiri (ditentukan oleh
⎕AV
) alih-alih Unicode; oleh karena itu program APL yang hanya menggunakan karakter ASCII dan simbol APL dapat dinilai sebagai 1 karakter = 1 byte.sumber
⎕AV
(setidaknya untuk Dyalog), seperti⍸
. Semua simbol Anda dihitung sebagai masing-masing satu byte. Jadi tidak setiap simbol APL = 1 byte seperti yang Anda nyatakan di catatan kaki. (Hanya pikir saya akan memberi tahu Anda.) Juga, dialek APL mana yang Anda gunakan?Perl 5 , 76 + 1 (-F) = 77 byte
Cobalah online!
Bagaimana?
Secara implisit, pisahkan karakter dari input (
-F
), menyimpan semua itu di @F. Tutupwhile
loop implisit dan mulai blok baru (}{
) ( Terima kasih, @Dom Hastings! ). Untuk setiap karakter, gandakan nilainya dengan 97 ke kekuatan yang sesuai. Hitung jumlah karakter dengan menemukan ukuran jumlah dalam basis 256 menggunakan logaritma.sumber
Jelly , skor: 18 (byte)
Cobalah online!
sumber
Ruby , 70 byte, skor 58
Cobalah online!
sumber
MATL (19 byte), skor 16
Karakter yang tidak dapat dicetak (tab, baris baru) dalam string input dimasukkan dengan membuat kode ASCII mereka (
9
,10
) dengan seluruh string.Bagian awal
9=?1}G
hanya diperlukan karena bug dalam fungsiZa
(konversi dasar), yang menyebabkannya gagal ketika input hanya terdiri dari "nol" (tab di sini). Ini akan diperbaiki pada rilis bahasa berikutnya.Penjelasan
sumber
Befunge-93,
8379 byte, skor7465Coba di sini!
Program pertama-tama mengonversi input ke nomor base-97, dan kemudian menghitung berapa digit yang diperlukan untuk nomor base-256. Dengan demikian, angka dasar-97 sangat besar, begitu besar sehingga TIO akan menghasilkan nilai maksimum 8 untuk nilai-nilai besar; Namun, juru bahasa JS tidak peduli dan akan menampilkan nilai yang benar.
sumber