您所有的基地97都属于我们


18

许多编程语言都是使用可单独打印的ASCII,制表符和换行符编写的。然后将这97个字符存储在8位字节中(实际上能够容纳256个不同的字符!),这效率非常低-尤其是在代码高尔夫球中,每个字节都很重要!在这一挑战中,您将可以通过使用基本转化来降低得分。

挑战

您的程序/函数将字符串或字符数组作为输入,然后将其解释为以97基数的数字。然后,它将其转换为以256基数的数字,并对表示该数字所需的符号(即字节)数进行计数。该计数将是您的程序/功能的输出/返回值。

一个使用base-2和base-10(二进制和十进制)的简单示例:如果输入为10110,则输出将为2,因为10110 2 = 22 10(表示输出必须用两位数字表示)。类似地,1101 2变为13 10,也给出2的输出,而110 2变成6 10,所以输出为1。

输入字符串可以包含所有95个可打印的ASCII字符,以及换行符\n和文字选项卡\t,这 将为基础转换创建97个符号的源字母。确切的字母表因此将(取代\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
如果您的标题建议比过时的模因更好,请随时在评论中发布!
桑契斯'17

您是否意识到,仅由制表符组成的语言回答就能赢得挑战。
pppery

@ppperry说实话,我对这种答案几乎没有耐心。是的,我的确意识到了这一点,但是直到有人可以将程序实际存储在他们的系统上,它才会得到我的认可。
桑奇斯

Answers:


7

Python 2,得分73 72 71

编辑: -1感谢@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

在线尝试!


/我认为只有一个应该可以
Jonathan Allan

or 1|1在这种情况下可以替换为。
乔纳森·艾伦

1
@JonathanAllan会产生不同的(错误的)结果。
桑奇斯

哦,是的,它会>。<-一直在想只会在此处得到零,但它会按位排列或与其他数字也一样。
乔纳森·艾伦

@乔纳森·艾伦没错。它会为奇数结果工作,但会为偶数结果加1。
桑奇斯

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

-1个字节,感谢Outgolfer的Erik(不需要翻译清单)

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

盖亚(Gaia),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

困难在于输入的转换。从base-97系统进行转换的唯一合理方法是使用B,因为映射需要非ASCII ¦。此外,当前没有一种方法可以在不映射c数字范围的情况下创建字符范围,这会遇到相同的问题。我能看到的最佳解决方案是构造字符串₵R并使其逃避。


您是否尝试过为此制作仅ASCII版本?它可能不会提高你的分数(我想₵R₵r不容易更换,但显然是),但它可能是有趣的,看看它是如何比较。
桑奇斯

@Sanchises我做了,但是我想出的最短结果是19,因为它是代码点8373,而且我也不能只使用ASCII来处理字符范围,这有点令人沮丧,因为该程序大多数都是ASCII。
商务猫

是的,它实际上几乎仅是ASCII。快速提问:我不知道盖亚,但刚才玩了一下,但是有没有办法转换数字列表?(就像c但应用于每个字符,$只显示所有数字)
Sanchises

@Sanchises您必须c在列表上进行映射,这将是
Business Cat

实际上₵r很容易替换,因为我可以只使用它256,我之所以只使用它是因为它短了1个字节,而且程序无论如何都不是ASCII。
Business Cat

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代码,对于制表符和换行符(在' '字典上排在前面),减号9;对于其他所有字符,减号30。

转换为数字

我们reduce用来将字符串转换为数字。这相当于计算

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

计算基数256长度

的返回值bin是一个字符串,看起来像这样:

"0b10101100111100001101"

称其长度L。具有n-bit二进制表示形式的值具有ceil(n/8)-bit base-256表示形式。我们可以计算nL-2; 也ceil(n/8)可以写成floor((n+7)/8)= n+7>>3,所以我们的答案是L-2+7>>3= L+5>>3

其中输入字符串具有值0的情况下被正确地处理,如bin返回"0b0",所以我们返回3+5>>3= 1。



@HalvardHummel非常确定应该是c>=' ',否则将空间映射到23而不是2。在普通代码中,golf c>'\x1f'(原始字节)会帮助我,但这不是可打印的ASCII…
Lynn

你说得对,我的坏人
哈弗·哈默尔

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)而不是Unicode 编写;因此,仅使用ASCII字符和APL符号的APL程序可以计为1个字符= 1个字节。


并非所有 APL符号都存在⎕AV(至少对于Dyalog),例如。但是,您所有的符号都算作一个字节。因此,并非每个APL符号= 1个字节都像您在脚注中所述。(以为我会让您知道。)另外,您正在使用哪种APL语言?
扎卡里

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为基数的数字所需的位数。因此,以97为基数的数字很大,以至于TIO对于较大的值将输出最大值8。但是,JS解释器不在乎,将输出正确的值。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.