あなたのベース97はすべて私たちのものです


18

多くのプログラミング言語は、印刷可能なASCII、タブ、改行のみを使用して記述されています。これらの97文字は、8ビットバイト(実際には256の異なる文字を保持できる!)に格納されます。これは非常に非効率的です-特に、すべてのバイトがカウントされるコードゴルフでは!この課題では、ベースコンバージョンを使用してスコアを下げることができます。

チャレンジ

プログラム/関数は、文字列または文字配列を入力として受け取り、それをベース97の数値として解釈します。次に、これを256ベースの数値に変換し、 この数値を表すために必要なシンボル(バイト)の数をカウントします。このカウントは、プログラム/関数の出力/戻り値になります。

base-2およびbase-10(2進および10進)を使用した簡単な例:入力がの場合、1011010110 2 = 22 10(出力を表すのに2桁必要)なので、出力は2になります。同様に、1101 2は13 10になり、出力も2になり、110 2は6 10になるため、出力は1になります。

入力文字列には、95個の印刷可能なASCII文字すべて と、基本変換用の97個の記号のソースアルファベットを作成する改行\n文字とリテラルタブを含めることができます。したがって、正確なアルファベットは次のようになりますand を実際のリテラルタブと改行で置き換えます。改行の後のリテラルスペースに注意してください)\t\t\n

\t\n !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~

このアルファベットの順序は重要であることに注意してください。たとえば、base-97 \tはdecimal 0に対応し、decimal に!対応します3

いくつかのテストケース:(空の文字列を処理する必要はありません)

Input                             Output
'example@domain.com'                  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)

得点

  1. エントリが印刷可能なASCII、改行、および/またはタブのみを使用している場合: プログラムのスコアは、入力として独自のソースコードが与えられると、プログラムの出力になります。

  2. エントリが印刷可能なASCII、改行、またはタブではない文字を使用している場合: ように、プログラムのスコアは単にバイト数です。


3
この時代遅れのミームよりも優れたタイトルの提案がある場合は、コメントに自由に投稿してください!
-Sanchises

このチャレンジは、タブだけで構成される言語の回答で勝つことができることを理解しましたか。
-pppery

@ppperry正直に言うと、私はそのような答えに忍耐がほとんどありません。はい、私はこれに気付きましたが、誰かが実際にシステムにプログラムを保存できるようになるまで、それは私の賛成を得られません。
-Sanchises

回答:


7

Python 2、スコア73 72 71

編集:@ジョナサンアランのおかげで-1

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

オンラインでお試しください!


1つだけ/でも大丈夫だと思う
ジョナサンアラン

or 1|1この場合はに置き換えることができます。
ジョナサンアラン

1
@JonathanAllan異なる(間違った)結果が得られます。
-Sanchises

ああ、そうだろう>。<-ゼロになるだけだと思っていたが、ビット単位で、または他の数字でもそうだ。
ジョナサンアラン

@JonathanAllanまさに。奇数の結果に対しては機能しますが、偶数の結果には1つ追加されます。
-Sanchises

5

Japt、スコア19(23バイト)

nHo127 uA9 md)sG l /2 c

オンラインでテストしてください!

偶然にも、これはASCII以外の文字でさえもゴルフできるとは思いません...

説明

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

5

ゼリー 18  17 バイト -スコア 18  17

Erik the Outgolferのおかげで-1バイト(翻訳用のリストのリストは不要)

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

オンラインでお試しください!

どうやって?

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

--ASCIIのみで得られる最高のスコアは29です:

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

-これも非常に非効率的です。上記のように序数を変換しますが、ベース97からの変換は、直接の乗算を使用するのではなく、値を繰り返して合計することによって達成されます。つまり、変換{".~"}.~すると、調整されたインデックスを取得し、[93,4,16,96,4,95,16,96]逆(U)にして、繰り返して[[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]]合計し、 256を基数に変換し、長さを取得します(メモリが不足していない場合:p)。


3

J、36バイト、スコア= 30

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

オンラインでお試しください!

Jは、プリミティブに7ビットASCII文字のみを使用します。

説明

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

3

ガイア、14バイト、スコア14

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

オンラインでお試しください!

説明

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.

ASCIIのみ

これは、ASCIIのみを使用して考え出した最高のスコアであり、スコアは19です。

9c10c8373c'R+e]$;B256Bl

難点は、入力の変換です。Bマッピングには非ASCIIが必要なので、base-97システムから変換する唯一の合理的な方法はを使用すること¦です。さらに、現在c、数値範囲をマッピングせずに文字範囲を作成する方法はありませんが、同じ問題が発生します。私が見ることができる最良の解決策は、文字列₵Rを構築し、それを評価することでした。


これのASCIIのみのバージョンを作成しようとしましたか?それはあなたのスコアを改善しないかもしれませんが(明らかにそうですが、置き換えるのは簡単₵R₵rはないと思います)、それがどのように比較されるかを見るのは面白いかもしれません。
-Sanchises

@Sanchisesを実行しましたが、コードポイント8373であり、ASCIIのみで文字範囲を実行できないため、私が思いついた最短は19になりました。
ビジネス猫

はい、それは本当にASCIIのみに近いです。簡単な質問:ガイアを知らないが、今は少し遊んでみましたが、数字のリストを変換する方法はありますか?(c各キャラクターに適用されますが、$すべての数字が表示されます)
-Sanchises

@Sanchises cリスト上にマップする必要があります
Business Cat

代わりに₵r使用できるので、実際には簡単に交換できます256。1バイト短く、プログラムがASCIIだけではなかったため、それを使用しただけです。
ビジネス猫

3

Python 2、スコア60

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

オンラインでお試しください!

base-97へのマッピング

文字の値は、ord(c)-[30,9][c<' ']ASCIIコードから取得します。タブと改行(前の' '辞書式)のその他すべての場合はマイナス30ます。

数値への変換

reduce文字列を数値に変換するために使用します。これは計算と同等です

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

基数256の長さの計算

の戻り値binは文字列で、次のようになります。

"0b10101100111100001101"

その長さを呼び出しますLn-bitバイナリ表現の値には、ceil(n/8)-bit base-256表現があります。nとして計算できL-2ます。また、= ceil(n/8)と書くことができるので、答えは=です。floor((n+7)/8)n+7>>3L-2+7>>3L+5>>3です。

入力文字列の値が0の場合は、binreturns として正しく処理される"0b0"ため、3+5>>3= 1 を返します。



@HalvardHummelはかなり確かそれがあるべきc>=' 'か、他あなたは23の代わりに、通常のコードゴルフ2.にスペースをマッピングc>'\x1f'(生バイト)私を助けてくれているだろうが、それは...印刷可能なASCIIではない
リン・

あなたは正しい、私の悪い
ハルバードフンメル

2

APL、スコア24(バイト*)

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

デフォルトを想定しています⎕IO←1。それ以外の場合は、¯31から¯30に変更します。

説明:

                   ⎕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

例:

      ⌈256⍟97⊥97|118|¯31+⎕AV⍳⍞
example@domain.com
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は⎕AV、ユニコードではなく、独自のレガシー文字セット(で定義)で記述できます。したがって、ASCII文字とAPLシンボルのみを使用するAPLプログラムは、1文字= 1バイトとしてスコアリングできます。


(少なくともDyalogの場合)など、すべての APLシンボルが入っているわけではありません。ただし、すべてのシンボルはそれぞれ1バイトとしてカウントされます。したがって、脚注で述べているように、すべてのAPLシンボル= 1バイトではありません。(私はあなたにそれを知らせると思っただけです。)また、どのAPL方言を使用していますか?⎕AV
ザカリー

2

Perl 5、76 + 1(-F)= 77バイト

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

オンラインでお試しください!

どうやって?

暗黙的に、入力の文字(-F)を分離し、そのすべてを@Fに格納します。暗黙のwhileループを閉じて、新しいブロック(}{)を開始します(ありがとう、@ Dom Hastings!)。各文字について、その値に97の適切な累乗を掛けます。対数を使用して256を底とする合計のサイズを見つけて、文字数を計算します。




1

MATL(19バイト)、スコア16

9=?1}G9tQ6Y2hh8WZan

入力文字列内の印刷不可能な文字(タブ、改行)は、ASCIIコード(910)を文字列の残りの部分で汚染することによって入力されます。

最初の部分 9=?1}Gは、のバグのためにのみ必要ですZa(ベース変換)関数の。これにより、入力が「ゼロ」のみである場合に失敗します(タブ)。言語の次のリリースで修正される予定です。

説明

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)

1

Befunge-93、83 79バイト、スコア74 65

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

ここで試してみてください!

プログラムは最初に入力を基数97の数値に変換し、次に基数256に必要な桁数をカウントします。そのため、base-97の数値は非常に大きいため、TIOは大きな値に対して最大値8を出力します。ただし、JSインタープリターは気にせず、正しい値を出力します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.