이 번호는 어떤 기준입니까?


31

쉬운 도전이 있습니다.

알 수없는 염기의 숫자를 나타내는 문자열이 주어지면 해당 숫자가 포함될 수있는 가장 낮은 염기를 결정하십시오. 문자열에는 만 포함 0-9, a-z됩니다. 원하는 경우 소문자 대신 대문자를 사용하도록 선택할 수 있지만이를 지정하십시오. 이 최저 가능한 밑을 10 진수로 출력해야합니다.

보다 구체적인 예는 다음과 같습니다. 입력 문자열이 "01234"인 경우 2, 3 및 4가 모두 이진으로 정의되지 않기 때문에이 숫자는 이진일 수 없습니다. 이와 유사하게이 숫자는 밑이 3 또는 4가 될 수 없습니다. 따라서이 숫자 밑이 5보다 높거나 더 높아야하므로 '5'를 출력해야합니다.

코드는 기본 1 (단항, 모든 '0')과 기본 36 ( '0-9'및 'a-z') 사이의 모든 기본에 대해 작동해야합니다.

합리적인 형식으로 입력하고 출력 할 수 있습니다. 기본 변환 내장이 허용됩니다. 평소와 같이 표준 허점이 적용되며 바이트 단위의 최단 답변이 승자입니다!

IO 테스트 :

#Input          #Output
00000       --> 1
123456      --> 7
ff          --> 16
4815162342  --> 9
42          --> 5
codegolf    --> 25
0123456789abcdefghijklmnopqrstuvwxyz    --> 36

8
베이스 36으로 출력 할 수 있습니까?
Leaky Nun

9
@LeakyNun Geez, 난 아니길 바래.
Dennis

4
@LeakyNunYou must output this lowest possible base in decimal.
DJMcMayhem

3
@RohanJhunjhunwala 해당 언어가 문자열과 가장 가까운 언어라면 왜 그런지 알 수 없습니다.
DJMcMayhem

3
일반적으로 단항은 모두 1이며, 위치 기반 숫자 시스템의 경우 선행 0이 표준이 아닙니다.
모니카 해밍 중지

답변:


16

젤리 , 4 바이트

ṀØBi

대문자가 필요합니다. 온라인으로 사용해보십시오! 또는 모든 테스트 사례를 확인하십시오 .

작동 원리

ṀØBi  Main link. Arguments: s (string)

Ṁ     Yield the maximum of s.
 ØB   Yield "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz".
   i  Find the 1-based index of the maximum in that string.

1
실제로 4 바이트가 아닌 7 바이트입니다. 처음 두 문자는 멀티 바이트입니다.
Nicomak

14
@Nicomak이 답변은 Jelly 코드 페이지 에서 인코딩되며 ,이 모든 문자는 각각 1 바이트로 인코딩됩니다.
Loovjo

26

파이썬, 27 22 바이트

lambda s:(max(s)-8)%39

입력은 바이트 열 (Python 3) 또는 바이트 배열 (Python 2 및 3)이어야합니다.

5 바이트를 골라 낸 @AleksiTorhamo에게 감사합니다!

Ideone에서 테스트하십시오 .

작동 원리

우리는 문자열을 최대한 활용하여 시작합니다. 이것은 문자의 코드 포인트가 숫자의 코드 포인트보다 높으며이 최대 문자는 최대 기본 36 자리입니다.

'0'– '9' 의 코드 포인트 는 48 – 57 이므로 코드 포인트에서 48 을 빼서 해당 숫자 를 계산 하거나 47 을 사용하여 가장 낮은베이스를 계산해야합니다. 마찬가지로 문자 'a'– 'z' 의 코드 포인트 는 97 – 122 입니다. 이후 A는 값으로 나타내는 숫자 (10) , 우리는 감산한다 (87) 의 해당 숫자를 계산하기 위해 그들의 코드 포인트를 행하거나, 86 최저 기준을 계산. 이를 달성하는 한 가지 방법은 다음과 같습니다.

차이 (97)(58) ( ':' , 후의 문자 '9' )는 39 이므로, 코드 포인트들은 촬영 모듈 (39) , 감산을 달성 할 수있다. 이후 48 % 39 = 9 , 및 문자에 대한 원하는 결과를 '0'1 , 먼저 감산 8 결과 복용 전에 모듈 (39) . 그렇지 않으면 'u'% 39 = 117 % 39 = 0 이기 때문에 먼저 빼야 합니다.

c    n    n-8    (n-8)%39
0    48    40     1
1    49    41     2
2    50    42     3
3    51    43     4
4    52    44     5
5    53    45     6
6    54    46     7
7    55    47     8
8    56    48     9
9    57    49    10
a    97    89    11
b    98    90    12
c    99    91    13
d   100    92    14
e   101    93    15
f   102    94    16
g   103    95    17
h   104    96    18
i   105    97    19
j   106    98    20
k   107    99    21
l   108   100    22
m   109   101    23
n   110   102    24
o   111   103    25
p   112   104    26
q   113   105    27
r   114   106    28
s   115   107    29
t   116   108    30
u   117   109    31
v   118   110    32
w   119   111    33
x   120   112    34
y   121   113    35
z   122   114    36

파이썬 3으로 만들고 입력을 바이트 문자열로 가져 가면 ord()3 바이트만큼 떨어지고 이길 수 있습니다 . :)
Aleksi Torhamo

좋은 생각! OP에게 물어 보자.
Dennis

3
@AleksiTorhamo NOOOOOOOOOOOO yu do dis
Rɪᴋᴇʀ

20

파이썬, 25 바이트

lambda x:int(max(x),36)+1

문자열을 취하는 람다를 정의합니다 x. 문자열에서 가장 큰 자릿수 (python의 기본값에 따라 자릿수를 기준으로 정렬)를 찾고 기수 36으로 변환합니다 8. 기수 8이 아니므로 1을 더합니다 .


11

하스켈, 34 바이트

f s=length['\t'..maximum s]`mod`39

사용 mod(ord(c)-8,39)Dennis 아이디어를 .

41 바이트

g '0'=1
g 'W'=1
g x=1+g(pred x)
g.maximum

45 바이트 :

(`elemIndex`(['/'..'9']++['a'..'z'])).maximum

와 같은 출력 Just 3.


6

체다 , 34 29 21 바이트

Dennis 덕분에 8 바이트가 절약되었습니다 !!!

s->(s.bytes.max-8)%39

소문자를 사용합니다

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

설명

s -> (      // Input is `s`
  s.bytes    // Returns array of char codes
   .max      // Get maximum item in array
) % 39      // Modulus 39


12
@DJMcMayhem .___. 나는 심지어 내 언어로 그렇게 할 수 있다는 것을
몰랐습니다

방법에 대해 (-)&8대신 n->n-8?
코너 오브라이언

@ ConorO'Brien> _> _> _> 아직 얻지 못했습니다. 나는 한 단지 그것을 할 계획 다음이 문제는 게시했습니다. Bassically의 f&n결합 n기능 제의 인수이다.
Downgoat

@ Downgoat 아. > _>
코너 오브라이언




4

자바 스크립트 (ES6), 41 37 바이트

s=>parseInt([...s].sort().pop(),36)+1

편집 : @ edc65 덕분에 4 바이트가 절약되었습니다.


사용 pop()4 저장
edc65

@ edc65 JavaScript 팁이 아니라고 믿을 수 없습니다.
Neil

3

하스켈, 55 40 바이트

f=(\y->mod(y-8)39).Data.Char.ord.maximum

그의 접근에 대해 @Dennis에게 감사드립니다. (그것을 @xnor;)


나는 명백한 인수를 취하지 않기 f=때문에 38 바이트를 제거 할 수 있다고 생각합니다 f.
Cyoce

3

펄 6:18 바이트

{:36(.comb.max)+1}

단일 문자열 인수를 사용하고 정수를 반환하는 람다를 정의합니다. 문자열을 문자로 나누고 "가장 높은"문자열을 찾은 다음 밑줄 36으로 변환하고 1을 더합니다.

{(.ords.max-8)%39}

이것은 Dennis의 모듈 방식을 사용합니다. 같은 길이입니다.


2

레티 나 , 28 바이트

O`.
.\B

{2`
$`
}T01`dl`_o
.

온라인으로 사용해보십시오! 첫 번째 줄은 줄 바꿈으로 구분 된 테스트 스위트를 활성화합니다.

설명

O`.

입력 문자를 정렬합니다.

.\B

이렇게하면 마지막 문자를 제외한 모든 문자가 제거되므로 처음 두 단계는 최대 문자를 찾습니다.

{2`
$`
}T01`dl`_o

이들은 루프를 형성하는 두 단계입니다. 첫 번째 문자는 첫 번째 문자를 복제하고 두 번째 문자는 문자를 "감소"합니다 (예 : xwith w, awith 91with 0). 후자는 첫 번째 문자로 0을 만나고 대신 제거합니다. 이것은 상단에 주어진 범위의 문자를 생성하는 표준 기술입니다. 따라서 모든 "자리"를 0최대 자리 까지 생성합니다 .

.

마지막으로 우리는 단순히 자릿수를 세어 기초를 제공합니다.


2

R, 99 89 85 바이트

봐! 100 바이트 미만!
봐! 10 바이트 할인!
봐! 4 바이트 꺼짐!

ifelse((m=max(strsplit(scan(,''),"")[[1]]))%in%(l=letters),match(m,l)+10,strtoi(m)+1)

언 골프 :

l=letters                  #R's built-in vector of lowercase letters

n=scan(what=characters())  #Takes an input from STDIN and convert it to characters

m=max(strsplit(n,"")[[1]]) #Splits the input and takes to max. 
                           #`letters` are considered > to numbers (i.e. a>1)


ifelse(m%in%l,match(m,l)+10,strtoi(m)+1) #If the max is in `letters`,
                                             #outputs the matching position of `m`in `letters` + 10 (because of [0-9]). 
                                             #Else, outputs `m` (as a number) + 1.

종종이 답변은 ifelse함수를 사용 합니다.ifelse(Condition, WhatToDoIfTrue, WhatToDoElse)


나는 당신의 버전을 사랑합니다; 그러나 문자와 숫자를 별도로 처리하면 성가신 여분의 바이트가 만들어집니다. 다른 방법을 사용하는 솔루션을 살펴보십시오.
Andreï Kostyrka

당신의 대답은 참 흥미 롭습니다. 난 당신의 scan방법을 사용하여 몇 바이트 골프;)
Frédéric

1

PHP, 51 38 바이트

(데니스에서) ^^

<?=(ord(max(str_split($argv[1])))-8)%39;

Dennis의 속임수가없는 다른 제안

<?=($a=max(str_split($argv[1])))<a?$a+1:ord($a)-86;
  • 인수로 입력을받습니다 $ argv [1];
  • ASCII를 사용하여 최대 문자 수
  • 숫자 (< 'a'ASCII 값보다 열등한 경우)이면 number + 1을 출력합니다
  • 다른 출력 ASCII 값 -86 (아스키의 'a'의 경우 97, 'a'의 -11은 11 번째 기본 자릿수)

너무 나쁘다 PHP는 그런 장황한 함수 이름을 가지고있다 : <?=base_convert(max(str_split($argv[1])),36,10)+1우아한 솔루션이지만 49 바이트이다!

@YiminRong 38 바이트로 단축 하는 intval()대신 사용할 수 있습니다 . tio.run/##K8go@P/…base_convert()<?=intval(max(str_split($argn)),36)+1;
640KB



1

자바 7, 67 61 바이트

int c(char[]i){int m=0;for(int c:i)m=m>c?m:c;return(m-8)%39;}

(m-8)%39@Dennis 의 놀라운 답변 덕분 입니다.

언 골프 및 테스트 코드 :

여기에서 시도하십시오.

class Main{
  static int c(char[] i){
    int m = 0;
    for(int c : i){
      m = m > c
           ? m
           : c;
    }
    return (m-8) % 39;
  }

  public static void main(String[] a){
    System.out.println(c("00000".toCharArray()));
    System.out.println(c("123456".toCharArray()));
    System.out.println(c("ff".toCharArray()));
    System.out.println(c("4815162342".toCharArray()));
    System.out.println(c("42".toCharArray()));
    System.out.println(c("codegolf".toCharArray()));
    System.out.println(c("0123456789abcdefghijklmnopqrstuvwxyz".toCharArray()));
  }
}

산출:

1
7
16
9
5
25
36

2
대신 Math.max()사용할 수 있습니다m = m>c?m:c
RobAu

@RobAu 아 물론입니다. 감사합니다. 완전히 잊어 버렸습니다. 때로는 Java post의 Codegolfing 팁 에서 여러 번 언급 된 Java에서 가장 쉬운 코드 골핑을 잊어 버리는 경우가 있습니다 . 알림 주셔서 감사합니다.
Kevin Cruijssen

Java 8로 전환하면이 전체 기능을 단일 람다로 대체 할 수 있습니다.reduce
BlueRaja-Danny Pflughoeft

@ BlueRaja-DannyPflughoeft 내가 알고있는 이유는 Java 7이라고 구체적으로 언급 한 이유입니다. Java 8 람다를 별도의 답변으로 자유롭게 게시하십시오.
Kevin Cruijssen

@ BlueRaja-DannyPflughoeft 더 적은 바이트로 끝나는 지 궁금합니다.
RobAu

1

C89, 55 53 52 50 바이트

f(s,b)char*s;{return*s?f(s+1,*s>b?*s:b):(b-8)%39;}

-8%39 데니스에서 뻔뻔스럽게 도난 당하다

테스트

test(const char* input)
{
    printf("%36s -> %u\n", input, f((char*)input,0));
}

main()
{
    test("00000");
    test("123456");
    test("ff");
    test("4815162342");
    test("42");
    test("codegolf");
    test("0123456789abcdefghijklmnopqrstuvwxyz");
}

산출

                               00000 -> 1
                              123456 -> 7
                                  ff -> 16
                          4815162342 -> 9
                                  42 -> 5
                            codegolf -> 25
0123456789abcdefghijklmnopqrstuvwxyz -> 36

Toby Speight 덕분에 2 바이트 절약

Kevin Cruijssen 덕분에 2 바이트 절약


당신은 비 프로토 타입 선언 2 바이트를 저장할 수 있습니다 f(char*s,int b)됩니다 f(s,b)char*s;.
Toby Speight

불필요한 괄호와 공간을 제거하여 3 바이트를 절약 할 수 있습니다.f(s,b)char*s;{return*s?f(s+1,*s>b?*s:b):(b-8)%39;}
Kevin Cruijssen

@KevinCruijssen thx
YSC

1

C, 55 바이트

이 답변은 입력이 ASCII로되어 있다고 가정합니다 (또는 ISO-8859 또는 UTF-8과 같이 숫자와 문자가 동일 함).

m;f(char*s){for(m=0;*s;++s)m=m>*s?m:*s;return(m-8)%39;}

우리는 단순히 가장 큰 값을 기억하면서 문자열을 따라 반복 한 다음 base- {11..36}에서 잘 알려진 modulo-39 변환을 사용합니다.

테스트 프로그램

int printf(char*,...);
int main(int c,char **v){while(*++v)printf("%s -> ",*v),printf("%d\n",f(*v));}

시험 결과

00000 -> 1
123456 -> 7
ff -> 16
4815162342 -> 9
42 -> 5
codegolf -> 25
0123456789abcdefghijklmnopqrstuvwxyz -> 36

m = 0을 제거 할 수 없습니까? m이 파일의 최상위 레벨에 나타나면 extern은 정적을 의미하며 이는 0으로 초기화됨을 의미합니다.
배트맨

@Batman-예, 그러나 f()두 번 이상 전화하지 않을 경우에만 가능합니다 . 나는 골프에서 거의 모든 것이 공정한 게임이라는 것을 알고 있지만, 나의 직업적인 본능은 그것을 너무 연약한 것으로 간주합니다!
Toby Speight

추가 생각으로,에 대한 m호출 간 재설정을 외부 요구 사항으로 만들 수 있습니다 f(). 그런 다음 테스트 프로그램이 계속 작동 할 수 있습니다.
Toby Speight

@Batman : Code Golf Meta 에 대해 " 기능 제출을 재사용 할 수 있어야합니까? " 라는 질문에 대한 대다수의 의견은 일회용 기능 허용에 반대되는 것으로 보입니다. 그래서 내가 가진 것을 고수하겠습니다. 어쨌든 제안에 감사드립니다.
Toby Speight

1

Mathematica, 34 32 바이트

Martin Ender 덕분에 2 바이트 절약

Max@Mod[ToCharacterCode@#-8,39]&

다른 방법으로 새로운 답을 얻을 가치가 있다고 결정했습니다.

방법 도난당한 데니스 '솔루션에 의해 영감을


2
접두사 표기법 사용 : Max@Mod[ToCharacterCode@#-8,39]&(다른 답변과 동일)
Martin Ender

2
또한 &익명 기능을 나타내려면 끝에 추가해야 합니다.
LegionMammal978

@두 가지 답변 중 하나 를 잊었습니다 ( ToCharacterCode@#Characters@#).
Martin Ender

1

Mathematica, 34 32 바이트

Martin Ender 덕분에 2 바이트 절약

Max@BaseForm[Characters@#,36]+1&

문자열을 입력으로 사용하는 순수한 함수를 정의합니다.

입력을 문자로 나누고 기본 36 숫자로 변환 한 후 최대 +1을 반환합니다.


Max@BaseForm[Characters@#,36]+1&
alephalpha


1

CJam, 10 바이트

몇 바이트를 절약 해 준 Martin Ender에게 감사합니다!

Dennis의 공식을 사용합니다

q:e>8-i39%

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

CJam, 18 16 btyes

대체 솔루션 :

A,s'{,97>+q:e>#)

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

A,s'{,97>+       e# Push the string "0123456789abcdefghijklmnopqrstuvwxyz"
          q      e# Get the input
           :e>   e# Find the highest character in the input
              #  e# Find the index of that character in the string
               ) e# Increment

1

스칼라, 25 바이트

print((args(0).max-8)%39)

다음과 같이 실행하십시오.

$ scala whatbase.scala 0123456789abcdefghijklmnopqrstuvwxyz


1

R, 62 54 바이트

max(match(strsplit(scan(,''),"")[[1]],c(0:9,letters)))

언 골프 드 :

max(
  match( # 2: Finds the respective positions of these characters
    strsplit(scan(,''),"")[[1]], # 1: Breaks the input into characters
                                c(0:9,letters)) # 3: In the vector "0123...yz"
                                                )

업데이트 : na.rm=T입력 유효성 가정 하에서 중복으로 인해 8 바이트가 줄었습니다 .

Frédéric의 답변 과 비교하여 크기가 39 % 개선되었습니다 . 그 외에도 100000 복제의 경우 0.86 초, 경쟁 답변의 경우 1.09 초의 빠른 속도로 실행됩니다. 그래서 내 것 중 하나는 작고 효율적입니다.



0

배쉬 70

grep -o .|sort -r|head -c1|od -An -tuC|sed s/$/-86/|bc|sed s/-/39-/|bc

입력 문자는 소문자입니다.


0

자바 스크립트, 57 50 48 바이트

@ kamaroso97에 7 바이트 저장 됨 @Neil 덕분에 2 바이트 저장 됨

n=>Math.max(...[...n].map(a=>parseInt(a,36))+1)

원래 답변 :

n=>n.split``.map(a=>parseInt(a,36)).sort((a,b)=>b-a)[0]+1

을 사용하여 7 바이트를 시작할 수 있습니다 n=>Math.max(...n.split``.map(a=>parseInt(a,36)+1)).
kamoroso94

@ kamoroso94 나는 몰랐다 Math.max. 그것에 대해 말해 주셔서 감사합니다!
DanTheMan

[...s]보다 짧습니다 s.split``.
Neil

0

펄, 30 27 바이트

에 +1 포함 -p

STDIN의 입력으로 실행

base.pl <<< codegolf

base.pl:

#!/usr/bin/perl -p
\@F[unpack"W*"];$_=@F%39-9

0

LiveScript, 32 바이트

->1+parseInt (it/'')sort!pop!,36

JavaScript로 컴파일되는 내가 가장 좋아하는 언어로 된 이 답변 의 포트 . base~number연산자가 변수로 작업 하면 쓸 수 ->1+36~(it/'')sort!pop!있지만 (23 바이트) 함수 bind 연산자와 충돌합니다.

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