Số này là cơ sở nào?


31

Đây là một thử thách dễ dàng:

Cho một chuỗi đại diện cho một số trong một cơ sở không xác định, xác định cơ sở thấp nhất có thể mà số đó có thể nằm trong. Chuỗi sẽ chỉ chứa 0-9, a-z. Nếu bạn thích, bạn có thể chọn lấy chữ hoa thay vì chữ thường, nhưng vui lòng chỉ định điều này. Bạn phải xuất ra cơ sở thấp nhất có thể trong thập phân.

Dưới đây là một ví dụ cụ thể hơn. Nếu chuỗi đầu vào là "01234", thì số này không thể ở dạng nhị phân, vì 2, 3 và 4 đều không được xác định trong nhị phân. Tương tự, số này không thể ở cơ sở 3 hoặc cơ sở 4. Do đó, số này phải ở cơ sở 5 hoặc cơ sở cao hơn, vì vậy bạn nên xuất '5'.

Mã của bạn phải hoạt động cho bất kỳ cơ sở nào giữa cơ sở 1 (đơn nguyên, tất cả '0') và cơ sở 36 ('0-9' và 'a-z').

Bạn có thể lấy đầu vào và cung cấp đầu ra ở bất kỳ định dạng hợp lý. Nội dung chuyển đổi cơ sở được cho phép. Như thường lệ, các sơ hở tiêu chuẩn được áp dụng và câu trả lời ngắn nhất tính theo byte là người chiến thắng!

Kiểm tra IO:

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

8
Tôi có thể xuất trong cơ sở 36 không?
Nữ tu bị rò rỉ

9
@LeakyNun Geez, tôi hy vọng là không.
Dennis

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

3
@RohanJhunjhunwala Nếu đó là ngôn ngữ của bạn gần nhất với một chuỗi, tôi không hiểu tại sao không.
DJMcMayhem

3
Thông thường unary là tất cả 1 và các số 0 đứng đầu không phải là tiêu chuẩn cho bất kỳ hệ thống số dựa trên vị trí nào.
Ngừng làm hại Monica

Câu trả lời:


16

Thạch , 4 byte

ṀØBi

Yêu cầu chữ hoa. Hãy thử trực tuyến! hoặc xác minh tất cả các trường hợp thử nghiệm .

Làm thế nào nó hoạt động

ṀØ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
Đó thực sự là 7 byte, không phải 4. 2 ký tự đầu tiên là nhiều byte.
Nicomak

14
@Nicomak Câu trả lời này được mã hóa trong trang mã Jelly , trong đó tất cả các ký tự này được mã hóa dưới dạng 1 byte mỗi ký tự.
Loovjo

26

Python, 27 22 byte

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

Điều này đòi hỏi đầu vào phải là một bytestring (Python 3) hoặc bytearray (Python 2 và 3).

Cảm ơn @AleksiTorhamo vì đã chơi golf 5 byte!

Kiểm tra nó trên Ideone .

Làm thế nào nó hoạt động

Chúng tôi bắt đầu bằng cách lấy tối đa của chuỗi. Đây là điểm mã của các chữ cái cao hơn điểm mã của các chữ số, ký tự tối đa này cũng là cơ sở tối đa 36 chữ số.

Điểm mã của '0' - '9'48 - 57 , vì vậy chúng ta phải trừ 48 từ điểm mã của chúng để tính các chữ số tương ứng hoặc 47 để tính toán cơ sở thấp nhất có thể. Tương tự, các điểm mã của các chữ cái 'a' - 'z'97 - 122 . Vì 'a' đại diện cho chữ số có giá trị 10 , chúng ta phải trừ 87 từ các điểm mã của chúng để tính các chữ số tương ứng hoặc 86 để tính toán cơ sở thấp nhất có thể. Một cách để đạt được điều này là như sau.

Chênh lệch giữa 9758 ( ':' , ký tự sau '9' ) là 39 , do đó, lấy điểm mã modulo 39 có thể đạt được phép trừ. Vì 48% 39 = 9 và kết quả mong muốn cho ký tự '0'1 , trước tiên chúng tôi trừ 8 trước khi lấy kết quả modulo 39 . Trừ đi trước là cần thiết vì nếu không '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

Nếu bạn tạo nó thành Python 3 và lấy đầu vào là một chuỗi byte, bạn có thể thả ord()và giành được 3 byte. :)
Aleksi Torhamo

Ý kiến ​​hay! Cho tôi hỏi OP.
Dennis

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

20

Python, 25 byte

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

Xác định một lambda có chuỗi x. Tìm chữ số lớn nhất trong chuỗi (được sắp xếp với các chữ cái ở trên các chữ số, theo mặc định của python) và chuyển đổi sang cơ sở 36. Thêm 1, vì 8không nằm trong cơ sở 8.


11

Haskell, 34 byte

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

Sử dụng mod(ord(c)-8,39)ý tưởng từ Dennis.

41 byte

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

45 byte:

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

Đầu ra như thế nào Just 3.


6

Cheddar , 34 29 21 byte

Đã lưu 8 byte nhờ Dennis !!!

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

Sử dụng chữ thường

Dùng thử trực tuyến

Giải trình

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


12
@DJMcMayhem .___. tôi thậm chí còn không biết ngôn ngữ của mình có thể làm được điều đó
Downgoat

Làm thế nào về (-)&8thay vì n->n-8?
Conor O'Brien

@ ConorO'Brien> _> _> _> Tôi chưa hiểu điều đó. Tôi chỉ dự định làm điều đó và sau đó thử thách này đã được đăng. Liên f&nkết âm nđể arg đầu tiên của chức năng.
Hạ cấp

@Downgoat ơi. > _>
Conor O'Brien

6

05AB1E , 6 byte

{¤36ö>

Có chữ in hoa

Giải trình

{       # sort
 ¤      # take last
  36ö   # convert from base 36 to base 10
     >  # increment

Dùng thử trực tuyến


Tha thứ cho sự ngây thơ của tôi với 05AB1E, nhưng bạn có nghĩa là chuyển đổi TỪ cơ sở 36 (sang cơ sở 10)?
Keeta

@Keeta Tất nhiên bạn đúng. Lỗi của tôi.
Emigna



4

JavaScript (ES6), 41 37 byte

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

Chỉnh sửa: Đã lưu 4 byte nhờ @ edc65.


sử dụng pop()để lưu 4
edc65

@ edc65 Tôi không thể tin rằng điều đó không theo các mẹo JavaScript.
Neil

3

Haskell, 55 40 byte

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

Cảm ơn @Dennis vì cách tiếp cận của anh ấy. (lấy đó, @xnor;))


Tôi nghĩ bạn có thể xóa f=38 byte vì fkhông có đối số rõ ràng.
Cyoce

3

Perl 6: 18 byte

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

Xác định một lambda có một đối số chuỗi đơn và trả về một số nguyên. Nó chia chuỗi thành các ký tự, tìm chuỗi "cao nhất", chuyển đổi nó thành cơ sở 36, thêm 1.

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

Cái này sử dụng phương pháp modulo từ Dennis. Cùng chiều dài.


2

Võng mạc , 28 byte

O`.
.\B

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

Hãy thử trực tuyến! (Dòng đầu tiên cho phép bộ kiểm tra được phân tách bằng nguồn cấp.)

Giải trình

O`.

Điều này sắp xếp các ký tự của đầu vào.

.\B

Điều này loại bỏ tất cả các ký tự ngoại trừ cuối cùng, vì vậy hai giai đoạn đầu tiên tìm thấy ký tự tối đa.

{2`
$`
}T01`dl`_o

Đây là hai giai đoạn tạo thành một vòng lặp. Cái đầu tiên nhân đôi ký tự đầu tiên và ký tự thứ hai "giảm" nó (thay thế xbằng w, abằng 91với 0). Giai đoạn sau gặp số 0 là ký tự đầu tiên, thay vào đó, nó loại bỏ nó. Đây là một kỹ thuật tiêu chuẩn để tạo ra một loạt các ký tự, được đưa ra ở cấp trên. Do đó, điều này tạo ra tất cả "chữ số" từ 0đến chữ số tối đa.

.

Cuối cùng, chúng ta chỉ cần đếm số chữ số, cung cấp cho chúng ta cơ sở.


2

R, 99 89 85 byte

Nhìn ! Ít hơn 100 byte!
Nhìn ! Giảm 10 byte!
Nhìn ! Tắt 4 byte!

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

Ung dung:

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.

Như thường lệ, câu trả lời này sử dụng ifelsechức năng:ifelse(Condition, WhatToDoIfTrue, WhatToDoElse)


Tôi yêu phiên bản của bạn; tuy nhiên, việc xử lý các chữ cái và số riêng biệt tạo ra các byte thừa phiền phức đó. Xin hãy xem giải pháp của tôi sử dụng một phương pháp khác.
Andreï Kostyrka

Câu trả lời của bạn thực sự thú vị. Tôi sẽ sử dụng scanphương pháp của bạn để đánh gôn một số byte;)
Frédéric

1

PHP, 51 38 byte

(Từ Dennis) ^^

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

Đề xuất khác mà không có lừa của Dennis

<?=($a=max(str_split($argv[1])))<a?$a+1:ord($a)-86;
  • Lấy đầu vào là đối số $ argv [1];
  • Lấy giá trị ký tự tối đa (sử dụng ASCII)
  • Nếu đó là một số (thấp hơn giá trị <'a' ascii) thì số đầu ra + 1
  • Khác giá trị đầu ra ascii -86 (97 cho 'a' trong ascii, -11 cho 'a' là chữ số cơ sở thứ 11)

Thật tệ khi PHP có các tên hàm dài dòng như vậy: <?=base_convert(max(str_split($argv[1])),36,10)+1là một giải pháp tao nhã, nhưng ở mức 49 byte!

@YiminRong bạn có thể sử dụng intval()thay vì base_convert()rút ngắn xuống còn 38 byte <?=intval(max(str_split($argn)),36)+1;tio: tio.run/##K8go@P/ Kẻ
640KB



1

Java 7, 67 61 byte

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

(m-8)%39là nhờ câu trả lời tuyệt vời của @Dennis .

Mã thử nghiệm & mã hóa:

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

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()));
  }
}

Đầu ra:

1
7
16
9
5
25
36

2
Thay vì Math.max()bạn có thể sử dụngm = m>c?m:c
RobAu

@RobAu Ah tất nhiên, cảm ơn. Hoàn toàn quên nó .. Đôi khi tôi quên những điều mã hóa dễ nhất trong Java thậm chí được đề cập nhiều lần trong Mẹo về Codegolfing trong bài đăng Java . Cảm ơn đã nhắc nhở.
Kevin Cruijssen

Nếu bạn chuyển sang Java 8, bạn có thể thay thế toàn bộ chức năng này bằng lambda duy nhấtreduce
BlueRaja - Danny Pflughoeft

@ BlueRaja-DannyPflughoeft Tôi biết, đó là lý do tại sao tôi đặc biệt đề cập đến nó như Java 7. Hãy thoải mái đăng một lambda Java 8 như một câu trả lời riêng biệt.
Kevin Cruijssen

@ BlueRaja-DannyPflughoeft Tôi tự hỏi liệu điều đó sẽ kết thúc với ít byte hơn ..
RobAu

1

C89, 55 53 52 50 byte

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

-8%39 bị đánh cắp một cách đáng xấu hổ từ Dennis

Kiểm tra

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");
}

Đầu ra

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

Đã lưu 2 byte nhờ Toby Speight

Đã lưu 2 byte nhờ Kevin Cruijssen


Bạn có thể lưu 2 byte với khai báo không phải là nguyên mẫu: f(char*s,int b)trở thành f(s,b)char*s;.
Toby Speight

Bạn có thể lưu 3 byte bằng cách xóa dấu ngoặc đơn và dấu cách không cần thiết:f(s,b)char*s;{return*s?f(s+1,*s>b?*s:b):(b-8)%39;}
Kevin Cruijssen 23/8/2016

@KevinCruijssen thx
YSC

1

C, 55 byte

Câu trả lời này giả định rằng đầu vào là ASCII (hoặc giống hệt nhau về số và chữ, ví dụ: ISO-8859 hoặc UTF-8):

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

Chúng tôi chỉ đơn giản lặp lại dọc theo chuỗi, ghi nhớ giá trị lớn nhất đã thấy, sau đó sử dụng chuyển đổi modulo-39 nổi tiếng từ cơ sở- {11..36}.

Chương trình kiểm tra

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

Kết quả kiểm tra

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

Bạn không thể xóa m = 0 sao? Nếu m xuất hiện ở cấp cao nhất của tệp, extern của nó ngụ ý tĩnh, ngụ ý nó được khởi tạo về không.
dơi

@Batman - có, nhưng chỉ khi bạn không gọi f()nhiều hơn một lần. Tôi biết rằng hầu hết mọi thứ đều là trò chơi công bằng trong golf, nhưng bản năng nghề nghiệp của tôi coi điều đó quá mong manh!
Toby Speight

Suy nghĩ thêm, tôi có thể làm cho nó trở thành một yêu cầu bên ngoài để thiết lập lại mgiữa các cuộc gọi đến f(). Sau đó, chương trình thử nghiệm của tôi vẫn có thể làm việc.
Toby Speight

@Batman: trên Code Golf Meta , ý kiến ​​của đa số về câu hỏi "Việc gửi chức năng có phải được sử dụng lại không? " Dường như chống lại việc cho phép các chức năng sử dụng một lần. Vì vậy, tôi sẽ gắn bó với những gì tôi có. Cảm ơn vì lời đề nghị, dù sao đi nữa.
Toby Speight

1

Toán học, 34 32 byte

Lưu 2 byte nhờ Martin Ender

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

Tôi quyết định phương pháp khác nhau xứng đáng có một câu trả lời mới.

phương pháp bị đánh cắp lấy cảm hứng từ giải pháp của Dennis


2
Sử dụng một số ký hiệu tiền tố: Max@Mod[ToCharacterCode@#-8,39]&(tương tự với câu trả lời khác của bạn)
Martin Ender

2
Ngoài ra, bạn cần thêm &vào cuối để chỉ ra một chức năng ẩn danh.
LegionMammal978

Bạn đã quên một @trong cả hai câu trả lời của bạn ( ToCharacterCode@#Characters@#).
Martin Ender

1

Toán học, 34 32 byte

đã lưu 2 byte nhờ Martin Ender

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

Xác định một hàm thuần túy lấy một chuỗi làm đầu vào.

Chia đầu vào thành các ký tự, chuyển đổi chúng thành 36 số cơ bản và trả về +1 tối đa.


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

1

C # REPL, 17 byte

x=>(x.Max()-8)%39

Chỉ cần chuyển câu trả lời của @ Dennis cho C #.



1

Scala, 25 byte

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

Chạy nó như:

$ scala whatbase.scala 0123456789abcdefghijklmnopqrstuvwxyz


1

R, 62 54 byte

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

Ung dung:

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"
                                                )

Cập nhật: loại bỏ 8 byte do sự dư thừa na.rm=Ttheo giả định về tính hợp lệ của đầu vào.

Cải thiện 39% về kích thước so với câu trả lời của Frédéric . Bên cạnh đó, nó chạy nhanh hơn một chút: 0,86 giây cho 100000 lần lặp so với 1,09 giây cho câu trả lời cạnh tranh. Vì vậy, một trong những của tôi là nhỏ hơn và hiệu quả hơn.



0

TIỀN 70

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

Chữ cái đầu vào là chữ thường.


0

JavaScript, 57 50 48 byte

7 byte đã lưu thnks vào @ kamaroso97 2 byte được lưu nhờ @Neil

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

Câu trả lời gốc:

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

Bạn có thể loại bỏ 7 byte với n=>Math.max(...n.split``.map(a=>parseInt(a,36)+1)).
kamoroso94

@ kamoroso94 Tôi không nhận ra Math.maxđã tồn tại. Cảm ơn đã cho tôi biết về nó!
DanTheMan

[...s]ngắn hơn s.split``.
Neil

0

Perl, 30 27 byte

Bao gồm +1 cho -p

Chạy với đầu vào trên STDIN, vd

base.pl <<< codegolf

base.pl:

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

0

LiveScript, 32 byte

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

Một cổng của câu trả lời này bằng ngôn ngữ yêu thích của tôi biên dịch thành JavaScript. Nếu base~numbertoán tử làm việc với các biến tôi có thể viết ->1+36~(it/'')sort!pop!(23 byte), nhưng nó xung đột với toán tử liên kết hàm: /

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.