Tất cả 97 cơ sở của bạn thuộc về chúng tôi


18

Nhiều ngôn ngữ lập trình được viết bằng cách sử dụng ASCII, tab và dòng mới có thể in được. 97 ký tự này sau đó được lưu trữ trong các byte 8 bit (thực sự có khả năng chứa 256 ký tự khác nhau!), Điều này rất kém hiệu quả - đặc biệt là trong môn đánh gôn, trong đó mỗi byte đều có giá trị! Trong thử thách này, bạn sẽ có thể giảm điểm của mình bằng cách sử dụng chuyển đổi cơ sở.

Thử thách

Chương trình / hàm của bạn lấy một chuỗi hoặc chuỗi ký tự làm đầu vào, sau đó nó diễn giải thành một số cơ sở 97 . Sau đó, nó chuyển đổi số này thành số cơ sở 256 và đếm số ký hiệu (tức là byte) cần thiết để biểu thị số này. Số này sẽ là giá trị đầu ra / trả về của chương trình / hàm của bạn.

Một ví dụ đơn giản sử dụng cơ sở-2 và cơ sở-10 (nhị phân và thập phân): nếu đầu vào là 10110, đầu ra sẽ là 2, vì 10110 2 = 22 10 (hai chữ số cần thiết để biểu thị đầu ra). Tương tự, 1101 2 trở thành 13 10 , cũng cho đầu ra là 2 và 110 2 trở thành 6 10 , do đó, đầu ra sẽ là 1.

Chuỗi đầu vào có thể chứa tất cả 95 ký tự ASCII có thể in, cũng như \ntab dòng mới và bằng chữ \t, tạo ra một bảng chữ cái nguồn gồm 97 ký hiệu cho chuyển đổi cơ sở của bạn. Do đó, bảng chữ cái chính xác sẽ là (thay thế \t\nbằng thẻ chữ và dòng mới thực sự; lưu ý không gian bằng chữ theo dòng mới) :

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

Lưu ý rằng thứ tự của bảng chữ cái này rất quan trọng: ví dụ, cơ sở-97 \ttương ứng với số thập phân 0!tương ứng với số thập phân 3.

Một số testcase: (bạn không cần xử lý một chuỗi rỗng)

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)

Chấm điểm

  1. Nếu mục nhập của bạn chỉ sử dụng ASCII, dòng mới và / hoặc tab có thể in: Điểm số của chương trình của bạn sẽ là đầu ra của chương trình, khi được cung cấp mã nguồn riêng làm đầu vào.

  2. Nếu mục nhập của bạn sử dụng bất kỳ ký tự nào không thể in ASCII, dòng mới hoặc tab: Điểm số của chương trình của bạn chỉ đơn giản là số byte, như trong .


3
Nếu bạn có một đề nghị tiêu đề tốt hơn meme lỗi thời này , vui lòng gửi nó trong các ý kiến!
Sanchise

Bạn có nhận ra rằng thử thách này có thể chiến thắng với câu trả lời dài dòng chỉ bao gồm các tab.
pppery

@ppperry Thành thật mà nói, tôi có rất ít kiên nhẫn cho những câu trả lời như vậy. Vâng, tôi đã nhận ra điều này, nhưng cho đến khi ai đó thực sự có thể lưu trữ chương trình trên hệ thống của họ, nó sẽ không nhận được upvote của tôi.
Sanchise

Câu trả lời:


7

Con trăn 2 , điểm 73 72 71

Chỉnh sửa: -1 nhờ @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

Hãy thử trực tuyến!


/Tôi nghĩ chỉ cần một cái là ổn thôi
Jonathan Allan

or 1có thể được thay thế bằng |1trong trường hợp này.
Jonathan Allan

1
@Jonathan ALLan Điều đó mang lại kết quả (sai) khác nhau.
Sanchise

Ồ, vâng, nó sẽ>. <- đã nghĩ rằng sẽ chỉ có một số 0 ở đó nhưng nó sẽ bitwise hoặc với các số khác nữa.
Jonathan Allan

@Jonathan ALLan Chính xác. Nó sẽ hoạt động cho kết quả kỳ lạ, nhưng nó sẽ thêm một kết quả chẵn.
Sanchise

5

Japt , điểm 19 (23 byte)

nHo127 uA9 md)sG l /2 c

Kiểm tra nó trực tuyến!

Tình cờ, tôi không nghĩ rằng điều này có thể được chơi golf nhiều ngay cả với các ký tự không phải ASCII ...

Giải trình

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

Jelly ,  18  17 byte - điểm  18  17

-1 byte nhờ Erik the Outgolfer (không cần danh sách danh sách cho bản dịch)

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

Hãy thử trực tuyến!

Làm sao?

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

- Điều tốt nhất tôi có được với ASCII chỉ là số điểm 29 :

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

- điều này là cực kỳ không hiệu quả quá. Nó dịch các thứ tự như trên, nhưng chuyển đổi từ cơ sở 97 đạt được bằng cách lặp lại các giá trị và tính tổng, thay vì sử dụng phép nhân trực tiếp - nghĩa là chuyển đổi {".~"}.~nó lấy các chỉ mục được điều chỉnh [93,4,16,96,4,95,16,96]sau đó đảo ngược ( U) và lặp lại chúng để thực hiện [[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]]và sau đó tính tổng, chuyển đổi sang cơ sở 256 và nhận được độ dài (nếu nó không hết bộ nhớ: p).


3

J , 36 byte, điểm = 30

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

Hãy thử trực tuyến!

J chỉ sử dụng các ký tự ASCII 7 bit cho các nguyên hàm của nó.

Giải trình

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 byte, điểm 14

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

Hãy thử trực tuyến!

Giải trình

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.

Chỉ ASCII

Đây là điều tốt nhất tôi có thể nghĩ ra khi chỉ sử dụng ASCII, cho điểm 19:

9c10c8373c'R+e]$;B256Bl

Khó khăn là trong việc chuyển đổi đầu vào. Cách hợp lý duy nhất để chuyển đổi từ hệ thống cơ sở 97 là sử dụng B, vì ánh xạ yêu cầu không phải ASCII ¦. Ngoài ra, hiện tại không có cách nào để tạo phạm vi ký tự mà không ánh xạ cqua phạm vi số, vấn đề tương tự. Giải pháp tốt nhất tôi có thể thấy là xây dựng chuỗi ₵Rvà trốn tránh nó.


Bạn đã thử và tạo một phiên bản ASCII duy nhất này chưa? Nó có thể không cải thiện điểm số của bạn (tôi cho rằng ₵R₵rkhông dễ thay thế, mặc dù rõ ràng là như vậy), nhưng thật thú vị khi xem nó so sánh như thế nào.
Sanchise

@Sanchise Tôi đã làm, nhưng ngắn nhất tôi nghĩ ra là 19, vì mã điểm 8373 và tôi cũng không thể thực hiện phạm vi ký tự trong ASCII, điều này hơi khó chịu vì hầu hết chương trình này là ASCII.
Mèo kinh doanh

Vâng, nó thực sự gần giống với ASCII. Câu hỏi nhanh: Tôi không biết Gaia nhưng chỉ chơi xung quanh với nó một chút, nhưng có cách nào để chuyển đổi danh sách các số không? (thích cnhưng áp dụng cho từng nhân vật, $chỉ hiển thị tất cả các số)
Sanchise

@Sanchises Bạn sẽ phải lập bản đồ ctrong danh sách, đó là
Business Cat

Trên thực tế ₵rrất dễ thay thế vì tôi chỉ có thể sử dụng 256thay thế, tôi chỉ sử dụng nó vì nó ngắn hơn 1 byte và chương trình không phải là ASCII.
Mèo kinh doanh

3

Con trăn 2 , điểm 60

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

Hãy thử trực tuyến!

Ánh xạ tới căn cứ 97

Giá trị của một ký tự được lấy bằng ord(c)-[30,9][c<' ']: mã ASCII của nó, trừ 9 cho các tab và dòng mới (đi trước ' 'từ vựng) hoặc trừ 30 cho mọi thứ khác.

Chuyển đổi thành số

Chúng tôi sử dụng reduceđể chuyển đổi chuỗi thành một số. Điều này tương đương với máy tính

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

Tính toán chiều dài cơ sở 256

Giá trị trả về của binlà một chuỗi, trông giống như thế này:

"0b10101100111100001101"

Gọi chiều dài của nó L. Một giá trị với nbiểu diễn nhị phân -bit có biểu diễn ceil(n/8)-bit cơ sở-256. Chúng ta có thể tính toán nnhư L-2; Ngoài ra, ceil(n/8)có thể được viết là floor((n+7)/8)= n+7>>3, vì vậy câu trả lời của chúng tôi là L-2+7>>3= L+5>>3.

Trường hợp chuỗi đầu vào có giá trị 0 được xử lý chính xác, như bintrả về "0b0", vì vậy chúng tôi trả về 3+5>>3= 1.



@HalvardHummel khá chắc chắn rằng bạn nên c>=' 'ánh xạ không gian thành 23 thay vì 2. Trong golf mã thông thường c>'\x1f'(một byte thô) sẽ giúp tôi, nhưng điều đó không thể in được ASCIIơi
Lynn

Bạn nói đúng, xấu của tôi
Halvard Hummel

2

APL, điểm 24 (byte *)

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

Giả sử mặc định ⎕IO←1, nếu không, chỉ cần thay đổi ¯31 thành ¯30.

Giải trình:

                   ⎕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

Ví dụ:

      ⌈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 có thể được viết bằng bộ ký tự kế thừa của riêng nó (được xác định bởi ⎕AV) thay vì Unicode; do đó, một chương trình APL chỉ sử dụng các ký tự ASCII và các ký hiệu APL có thể được ghi là 1 char = 1 byte.


Không phải tất cả các biểu tượng APL đều ở ⎕AV(ít nhất là đối với Dyalog), chẳng hạn như . Mặc dù vậy, tất cả các biểu tượng của bạn được tính là một byte. Vì vậy, không phải mọi ký hiệu APL = 1 byte như bạn nêu trong phần chú thích. (Chỉ cần nghĩ rằng tôi sẽ cho bạn biết điều đó.) Ngoài ra, bạn đang sử dụng phương ngữ APL nào?
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)

Hãy thử trực tuyến!

Làm sao?

Ngẫu nhiên, tách các ký tự của đầu vào ( -F), lưu trữ tất cả các ký tự đó trong @F. Đóng whilevòng lặp ẩn và bắt đầu một khối mới ( }{) ( Cảm ơn, @Dom Hastings! ). Đối với mỗi ký tự, nhân giá trị của nó với 97 với sức mạnh phù hợp. Tính số lượng ký tự bằng cách tìm kích thước của tổng trong cơ sở 256 bằng cách sử dụng logarit.




1

MATL (19 byte), điểm 16

9=?1}G9tQ6Y2hh8WZan

Các ký tự không in được (tab, dòng mới) trong chuỗi đầu vào được nhập bằng cách nối các mã ASCII của chúng ( 9, 10) với phần còn lại của chuỗi.

Phần ban đầu 9=?1}Gchỉ cần thiết do có lỗi trong Zachức năng (chuyển đổi cơ sở), khiến nó bị lỗi khi đầu vào chỉ bao gồm "số không" (các tab ở đây). Nó sẽ được sửa trong bản phát hành tiếp theo của ngôn ngữ.

Giải trình

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 byte, điểm 74 65

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

Hãy thử nó ở đây!

Trước tiên, chương trình chuyển đổi đầu vào thành một số cơ sở 97, sau đó đếm xem có bao nhiêu chữ số được yêu cầu cho một số cơ sở 256. Do đó, số cơ sở 97 là rất lớn, lớn đến mức TIO sẽ tạo ra giá trị tối đa là 8 cho các giá trị lớn; tuy nhiên, trình thông dịch JS không quan tâm và sẽ đưa ra giá trị chính xác.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.