모든 기지 97은 우리에게 속해 있습니다


18

많은 프로그래밍 언어는 인쇄 가능한 ASCII, 탭 및 줄 바꿈 만 사용하여 작성됩니다. 이 97 문자는 8 비트 바이트 (실제로 256 개의 다른 문자를 보유 할 수 있습니다!)에 저장됩니다. 이는 매우 비효율적입니다. 특히 모든 코드가 계산되는 코드 골프에서! 이 도전에서, 당신은 기본 전환을 사용하여 점수를 줄일 수 있습니다.

도전

프로그램 / 함수는 문자열 또는 문자형 배열을 입력으로 사용하여 기본 97 숫자 로 해석 합니다. 그런 다음 이것을 기본 -256 숫자 로 변환하고이 숫자를 나타내는 데 필요한 기호 수 (예 : 바이트)를 계산합니다. 이 카운트는 프로그램 / 기능의 출력 / 반환 값이됩니다.

base-2 및 base-10 (2 진 및 10 진수)을 사용하는 간단한 예 : 입력이 10110인 경우 10110 2 = 22 10 (출력을 나타내는 데 필요한 두 자리 숫자) 이므로 출력은 2 입니다. 마찬가지로 1101 2 는 13 10 이되고 2 의 출력도 제공하고 110 2 는 6 10 이되므로 출력은 1이됩니다.

입력 문자열에는 95 개의 인쇄 가능한 ASCII 문자와 줄 바꿈 \n및 리터럴 탭이 포함되어 기본 변환을위한 97 개 문자 \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

파이썬 2 , 점수 73 72 71

편집 : @Jonathan Allan 덕분에 -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

온라인으로 사용해보십시오!


하나 /는 괜찮을 것 같아요
Jonathan Allan

or 1이 경우에 대체 될 수 있습니다 |1.
Jonathan Allan

1
@JonathanAllan 결과가 다릅니다 (잘못된).
Sanchises

오, 그래.>.
Jonathan Allan

@JonathanAllan 정확합니다. 이상한 결과에는 효과가 있지만 짝수 결과에는 하나를 추가합니다.
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 점

Outgolfer Erik 덕분에 -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

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

@ Sanchises는했지만 코드 포인트 8373 이므로 ASCII로 문자 범위를 수행 할 수 없기 때문에 가장 짧은 19로 끝났습니다 .이 프로그램의 대부분이 ASCII이므로 약간 실망 스럽습니다.
사업 고양이

예, 실제로 ASCII에만 가깝습니다. 빠른 질문 : Gaia를 모르지만 지금은 조금 놀았지만 숫자 목록을 변환하는 방법이 있습니까? ( c각 문자에 적용되지만 $모든 숫자 만 표시됨)
Sanchises

@Sanchises 당신 c은 목록을 통해 매핑해야 할 것입니다
Business Cat

실제로 대신 ₵r사용할 수 있기 때문에 대체하기가 쉽습니다 256.1 바이트가 짧아 프로그램이 ASCII 만 아니기 때문에 사용했습니다.
사업 고양이

3

파이썬 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-비트 이진 표현 의 값 은 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 인 경우는 binreturn으로 올바르게 처리 "0b0"되므로 3+5>>3= 1 을 반환 합니다.



@HalvardHummel 2 c>=' '또는 23 대신 23으로 공간을 매핑 해야한다는 것을 확실히 확신합니다 . 일반 코드 골프 c>'\x1f'(원시 바이트)에서 도움이되었지만 인쇄 가능한 ASCII는 아닙니다…
Lynn

당신은 맞다 내 나쁜
Halvard 험멜

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 바이트로 점수를 매길 수 있습니다.


와 같은 모든 APL 기호가 ⎕AV(적어도 Dyalog의 경우) 있는 것은 아닙니다 . 그러나 모든 심볼은 각각 1 바이트로 계산됩니다. 따라서 각주에 언급 한 것처럼 모든 APL 기호 = 1 바이트는 아닙니다. (단지 알려줄 것이라고 생각했습니다.) 또한 어떤 APL 방언을 사용하고 있습니까?
Zacharý

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 코드 ( 9, 10)를 나머지 문자열 로 오염시켜 입력 합니다.

초기 부분 9=?1}GZa(기본 변환) 기능 의 버그로 인해 필요하므로 입력이 "0"(여기에서 탭)으로 만 구성된 경우 실패합니다. 다음 언어 릴리스에서 수정 될 예정입니다.

설명

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 인터프리터는 신경 쓰지 않고 올바른 값을 출력합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.