Semua markas Anda adalah milik kami

18

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 \ndan tab literal \t, yang menciptakan alfabet sumber 97 simbol untuk konversi basis Anda. Maka, alfabet yang tepat adalah (mengganti \tdan \ndengan 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 \tberhubungan 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

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

  2. Jika entri Anda menggunakan karakter apa pun yang tidak dapat dicetak ASCII, baris baru atau tab: Skor program Anda hanyalah jumlah byte, seperti dalam .

Sanchises
sumber
3
Jika Anda memiliki saran judul yang lebih baik daripada meme usang ini , jangan ragu untuk mempostingnya di komentar!
Sanchises
Tahukah Anda bahwa tantangan ini dapat dimenangkan dengan jawaban bahasa yang hanya terdiri dari tab.
pppery
@pperry Sejujurnya, saya memiliki sedikit kesabaran untuk jawaban seperti itu. Ya, saya memang menyadari hal ini, tetapi sampai seseorang benar-benar dapat menyimpan program di sistem mereka, itu tidak akan membuat saya mendapatkan dukungan.
Sanchises

Jawaban:

7

Python 2 , skor 73 72 71

Sunting: -1 terima kasih kepada @Jonathan Allan

def f(l,z=0):
	for i in map(ord,l):z+=i-[30,9][i<32];z*=97
	print(len(bin(z))-2)/8or 1

Cobalah online!

Halvard Hummel
sumber
hanya satu yang /harus OK, saya pikir
Jonathan Allan
or 1dapat diganti dengan |1dalam hal ini.
Jonathan Allan
1
@ JonathanAllan Itu menghasilkan hasil yang berbeda (salah).
Sanchises
Oh, ya itu akan>. <- Berpikir hanya akan mendapatkan nol di sana tetapi akan bitwise atau dengan nomor lain juga.
Jonathan Allan
@ JonathanAllan Persis. Ini akan bekerja untuk hasil yang aneh, tetapi itu akan menambahkan satu ke hasil yang genap.
Sanchises
5

Japt , skor 19 (23 byte)

nHo127 uA9 md)sG l /2 c

Uji secara online!

Secara kebetulan, saya tidak berpikir ini bisa bermain golf bahkan dengan karakter non-ASCII ...

Penjelasan

UnHo127 uA9 md)sG l /2 c   Implicit: U = input string, A = 10, G = 16, H = 32
  Ho127                    Create the range [32, 33, ..., 126].
        uA9                Insert 9 and 10 at the beginning of this range.
            md             Map each to a character, yielding ["\t", "\n", " ", "!", ... "~"].
Un            )            Convert U to a number via this alphabet ("\t" -> 0, "~" -> 96, etc.)
               sG          Convert this number to a base-16 (hexadecimal) string.
                  l        Take the length of this string.
                    /2 c   Divide by two and round up to get the length in base-256.
                           Implicit: output result of last expression
Produksi ETH
sumber
5

Jelly ,  18  17 byte - skor  18  17

-1 byte terima kasih kepada Erik the Outgolfer (tidak perlu daftar daftar terjemahan)

O“µœ½þ‘y_30ḅ97b⁹L

Cobalah online!

Bagaimana?

O“µœ½þ‘y_30ḅ97b⁹L - Link: list of characters
O                 - convert from characters to ordinals
 “µœ½þ‘           - code-page indices = [9,30,10,31]
       y          - translate (9->30 and 10->31)
        _30       - subtract 30
           ḅ97    - convert from base 97
               ⁹  - literal 256
              b   - convert to base
                L - length of the result

--Yang terbaik yang saya miliki dengan ASCII adalah skor 29 :

O10,31,9,30y_30Ux"J_1 97*$$$SSb256L

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

Jonathan Allan
sumber
3

J , 36 byte, skor = 30

256#@(#.inv)97x#.(u:9,10,32+i.95)&i.

Cobalah online!

J hanya menggunakan karakter ASCII 7-bit untuk primitifnya.

Penjelasan

256#@(#.inv)97x#.(u:9,10,32+i.95)&i.  Input: string S
                 (              )     Form 7-bit ASCII alphabet
                            i.95        Range [0, 95)
                         32+            Add 32
                    9,10,               Prepend 9 and 10
                  u:                    Convert to characters
                                 &i.  Index of each char in S in that alphabet
            97x#.                     Convert from base 97 to decimal
256   #.inv                           Convert to base 256
   #@                                 Length
mil
sumber
3

Gaia , 14 byte, skor 14

9c₸c₵R]$;B₵rBl

Cobalah online!

Penjelasan

9c              Push a tab character. (done like this since tab isn't in the codepage)
  ₸c            Push a linefeed character.
    ₵R          Push all printable ASCII characters.
      ]$        Concatenate everything together.
        ;       Copy second-from-top, implicitly push input. Stack is now [ASCII input ASCII]
         B      Convert input from the base where the ASCII string is the digits.
          ₵rB   Convert that to the base where the code page is the digits (base 256).
             l  Get the length of the result.
                Implicitly output top of stack.

Hanya ASCII

Ini adalah yang terbaik yang bisa saya lakukan dengan hanya menggunakan ASCII, memberikan skor 19:

9c10c8373c'R+e]$;B256Bl

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 memetakan crentang angka, yang mengalami masalah yang sama. Solusi terbaik yang bisa saya lihat adalah membangun string ₵Rdan menghindarinya.

Kucing Bisnis
sumber
Apakah Anda mencoba dan membuat versi ASCII saja untuk ini? Ini mungkin tidak meningkatkan skor Anda (saya kira ₵Rdan ₵rtidak mudah untuk menggantikan, meskipun jelas adalah), tetapi mungkin menarik untuk melihat bagaimana membandingkannya.
Sanchises
@Sanchises yang saya lakukan, tetapi yang terpendek yang saya dapatkan adalah 19, karena 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.
Business Cat
Ya, sangat dekat menjadi ASCII saja. Pertanyaan cepat: Saya tidak tahu Gaia tetapi sedikit bermain-main dengannya sekarang, tetapi apakah ada cara untuk mengubah daftar angka? (suka ctapi diterapkan pada setiap karakter, $hanya menunjukkan semua angka)
Sanchises
@Sanchises Anda harus memetakan cdaftar, yang akan menjadi
Bisnis Cat
Sebenarnya ₵rmudah untuk mengganti karena saya hanya bisa menggunakan 256, saya hanya menggunakan itu karena 1 byte lebih pendek dan programnya bukan ASCII saja.
Business Cat
3

Python 2 , skor 60

lambda s:len(bin(reduce(lambda a,c:a*97+ord(c)-[30,9][c<' '],s,0)))+5>>3

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 reduceuntuk mengonversi string menjadi angka. Ini setara dengan komputasi

a = 0
for c in s: a = a*97+ord(c)-[30,9][c<' ']
return a

Komputasi dasar-panjang 256

Nilai kembali dari binadalah string, yang terlihat seperti ini:

"0b10101100111100001101"

Sebut panjangnya L. Nilai dengan nrepresentasi biner -bit memiliki representasi ceil(n/8)-bit basis-256. Kita dapat menghitung nsebagai L-2; juga, ceil(n/8)dapat ditulis sebagai floor((n+7)/8)= n+7>>3, jadi jawaban kami adalah L-2+7>>3= L+5>>3.

Kasus di mana string input memiliki nilai 0 ditangani dengan benar, sebagai binpengembalian "0b0", jadi kami mengembalikan 3+5>>3= 1.

Lynn
sumber
64
Halvard Hummel
@HalvardHummel cukup yakin bahwa seharusnya c>=' 'atau Anda memetakan ruang ke 23 bukannya 2. Dalam kode golf biasa c>'\x1f'(byte mentah) akan membantu saya, tetapi itu tidak dapat dicetak ASCII ...
Lynn
Anda benar, salah saya
Halvard Hummel
2

APL, skor 24 (byte *)

⌈256⍟97⊥97|118|¯31+⎕AV⍳⍞

Diasumsikan default ⎕IO←1, jika tidak ubah saja 3131 ke ¯30.

Penjelasan:

                   ⎕AV⍳⍞  Read a string and convert it to ASCII codepoints + 1
               ¯31+       Subtract 31, so that space = 2, bang = 3, etc.
           118|           Modulo 118, so that tab = 97, newline = 98
        97|               Modulo 97, so that tab = 0, newline = 1
     97⊥                  Decode number from base 97
⌈256⍟                     Ceiling of log base 256, to count number of digits

Contoh:

      ⌈256⍟97⊥97|118|¯31+⎕AV⍳⍞
[email protected]
15
      ⌈256⍟97⊥97|118|¯31+⎕AV⍳⍞
All your base are belong to us!
26
      ⌈256⍟97⊥97|118|¯31+⎕AV⍳⍞
       abcd
9
      ⌈256⍟97⊥97|118|¯31+⎕AV⍳⍞
~      abcd
10

________________
*: 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.

Tobia
sumber
Tidak semua simbol APL ada di ⎕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?
Zacharý
2

Perl 5 , 76 + 1 (-F) = 77 byte

}{$d+=97**(@F+--$i)*((ord)-(/	|
/?9:30))for@F;say!$d||1+int((log$d)/log 256)

Cobalah online!

Bagaimana?

Secara implisit, pisahkan karakter dari input ( -F), menyimpan semua itu di @F. Tutup whileloop 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.

Xcali
sumber
1

Ruby , 70 byte, skor 58

->n{x=0;n.bytes{|i|x+=i-(i<32?9:30);x*=97};a=x.to_s(2).size/8;a<1?1:a}

Cobalah online!

Nilai Tinta
sumber
1

MATL (19 byte), skor 16

9=?1}G9tQ6Y2hh8WZan

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}Ghanya diperlukan karena bug dalam fungsi Za(konversi dasar), yang menyebabkannya gagal ketika input hanya terdiri dari "nol" (tab di sini). Ini akan diperbaiki pada rilis bahasa berikutnya.

Penjelasan

9=      % Implicitly input a string. Compare each entry with 9 (tab)
?       % If all entries were 9
  1     %   Push 1. this will be the ouput
}       % Else
  G     %   Push input string again
  9     %   Push 9 (tab)
  tQ    %   Duplicate, add 1: pushes 10 (newline)
  6Y2   %   Push string of all printable ASCII chars
  hh    %   Concatenate twice. This gives the input alphabet of 97 chars
  8W    %   Push 2 raised to 8, that is, 256. This represents the output
        %   alphabet, interpreted as a range, for base conversion
  Za    %   Base conversion. Gives a vector of byte numbers
  n     %   Length of that vector
        % End (implicit). Display (implicit)
Luis Mendo
sumber
1

Befunge-93, 83 79 byte, skor 74 65

<v_v#-*52:_v#-9:_v#`0:~
 5v$
^6>>1>\"a"* +
 >*- ^   0$<
0_v#:/*4*88\+1\ $<
.@>$

Coba 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