Auf welcher Basis befindet sich diese Nummer?


31

Hier ist eine schöne einfache Herausforderung:

Bestimmen Sie anhand einer Zeichenfolge, die eine Zahl in einer unbekannten Basis darstellt, die niedrigste mögliche Basis, in der sich diese Zahl möglicherweise befindet. Die Zeichenfolge enthält nur 0-9, a-z. Wenn Sie möchten, können Sie Großbuchstaben anstelle von Kleinbuchstaben verwenden. Geben Sie dies jedoch an. Sie müssen diese niedrigstmögliche Basis dezimal ausgeben.

Hier ist ein konkreteres Beispiel. Wenn die Eingabezeichenfolge "01234" war, ist es unmöglich, dass diese Zahl binär ist, da 2, 3 und 4 in binär nicht definiert sind. In ähnlicher Weise kann diese Zahl nicht 4. Daher in der Basis 3 oder Base sein, diese Zahl muss in der Basis-5 sein, oder eine höhere Basis, so sollten Sie Ausgang ‚5‘.

Ihr Code muss für jede Basis zwischen Basis 1 (unär, alle Nullen) und Basis 36 ('0-9' und 'a-z') funktionieren.

Sie können Eingaben vornehmen und Ausgaben in jedem vernünftigen Format bereitstellen. Buildins für die Basiskonvertierung sind zulässig. Wie üblich gelten Standardlücken und die kürzeste Antwort in Bytes ist der Gewinner!

Test IO:

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

8
Kann ich in Basis 36 ausgeben?
Undichte Nonne

9
@LeakyNun Geez, ich hoffe nicht.
Dennis

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

3
@RohanJhunjhunwala Wenn das die Sprache ist, die einer Zeichenfolge am nächsten kommt, verstehe ich nicht, warum nicht.
DJMcMayhem

3
Normalerweise ist unär alle 1, und führende Nullen sind kein Standard für positionsbasierte numerische Systeme.
Hören Sie auf, Monica

Antworten:


16

Gelee , 4 Bytes

ṀØBi

Benötigt Großbuchstaben. Probieren Sie es online! oder überprüfen Sie alle Testfälle .

Wie es funktioniert

ṀØ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
Es sind eigentlich 7 Bytes, nicht 4. Die ersten 2 Zeichen sind Multi-Bytes.
Nicomak

14
@Nicomak Diese Antwort ist in der Jelly-Codepage codiert, in der alle diese Zeichen als jeweils 1 Byte codiert sind.
Loovjo

26

Python, 27 22 Bytes

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

Dies erfordert, dass die Eingabe ein Bytestring (Python 3) oder ein Bytearray (Python 2 und 3) ist.

Vielen Dank an @AleksiTorhamo für das Abschlagen von 5 Bytes!

Teste es auf Ideone .

Wie es funktioniert

Wir beginnen mit dem Maximum der Zeichenkette. Hierbei sind die Codepunkte der Buchstaben höher als die Codepunkte der Ziffern, wobei dieses maximale Zeichen auch die maximale Basisziffer 36 ist.

Der Codepunkt von '0' - '9' ist 48 - 57 , daher müssen wir 48 von ihren Codepunkten abziehen , um die entsprechenden Ziffern zu berechnen , oder 47 , um die niedrigstmögliche Basis zu berechnen. Ähnlich werden die Codepunkte des Buchstaben ‚A‘ - ‚Z‘ sind 97 bis 122 . Da 'a' die Ziffer mit dem Wert 10 darstellt , müssen wir 87 von ihren Codepunkten abziehen , um die entsprechenden Ziffern zu berechnen , oder 86 , um die niedrigstmögliche Basis zu berechnen. Ein Weg, dies zu erreichen, ist wie folgt.

Der Unterschied zwischen 97 und 58 ( ':' , das Zeichen nach '9' ) beträgt 39 , sodass die Subtraktion mit den Codepunkten modulo 39 erzielt werden kann. Da 48% 39 = 9 , und das gewünschte Ergebnis für das Zeichen ‚0‘ ist 1 , subtrahieren wir zuerst 8 , bevor das Ergebnis modulo Aufnahme 39 . Zuerst muss subtrahiert werden, da sonst 'u'% 39 = 117% 39 = 0 ist .

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

Wenn Sie es zu Python 3 machen und die Eingabe als Byte-Zeichenfolge verwenden, können Sie die fallen lassen ord()und um 3 Byte gewinnen. :)
Aleksi Torhamo

Gute Idee! Lassen Sie mich das OP fragen.
Dennis

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

20

Python, 25 Bytes

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

Definiert ein Lambda, das die Zeichenfolge annimmt x. Findet die größte Ziffer in der Zeichenfolge (standardmäßig nach Buchstaben über den Ziffern sortiert) und konvertiert sie zur Basis 36. Fügt 1 hinzu, da sie 8nicht zur Basis 8 gehört.


11

Haskell, 34 Bytes

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

Verwendet die mod(ord(c)-8,39)Idee von Dennis.

41 Bytes

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

45 Bytes:

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

Ausgänge mögen Just 3.


6

Cheddar , 34 29 21 Bytes

8 Bytes dank Dennis gespart !!!

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

Verwendet Kleinbuchstaben

Probieren Sie es online aus

Erläuterung

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

1
Oder Sie können den Eingang
DJMcMayhem

12
@DJMcMayhem .___. Ich wusste nicht einmal, dass meine eigene Sprache das kann
Downgoat

Wie wäre es (-)&8statt n->n-8?
Conor O'Brien

@ ConorO'Brien> _> _> _> Darauf bin ich noch nicht gekommen. Ich hatte gerade vor, es zu tun, und dann wurde diese Herausforderung veröffentlicht. Bassically f&nBindungen nzum ersten Arg- der Funktion.
Downgoat

@ Downgoat Oh. > _>
Conor O'Brien

6

05AB1E , 6 Bytes

{¤36ö>

Nimmt Buchstaben in Großbuchstaben.

Erläuterung

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

Probieren Sie es online aus


Vergib mir meine Naivität mit 05AB1E, aber meinst du die Konvertierung von Base 36 (zu Base 10)?
Keeta

@Keeta Du bist natürlich richtig. Mein Fehler.
Emigna



4

JavaScript (ES6), 41 37 Byte

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

Bearbeiten: 4 Bytes dank @ edc65 gespeichert.


verwenden pop()speichern 4
edc65

@ edc65 Ich kann nicht glauben, dass das nicht unter JavaScript-Tipps steht.
Neil

3

Haskell, 55 40 Bytes

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

Danke @Dennis für seinen Ansatz. (nimm das, @xnor;))


Ich denke, Sie können f=für 38 Bytes entfernen, da fkeine expliziten Argumente verwendet werden.
Cyoce

3

Perl 6: 18 Bytes

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

Definiert ein Lambda, das ein einzelnes Zeichenfolgenargument akzeptiert und eine Ganzzahl zurückgibt. Es teilt den String in Zeichen auf, findet den "höchsten", konvertiert ihn in Basis 36 und addiert 1.

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

Dieser nutzt den Modulo-Ansatz von Dennis. Die gleiche Länge.


2

Retina , 28 Bytes

O`.
.\B

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

Probieren Sie es online! (Die erste Zeile aktiviert eine durch Zeilenvorschub getrennte Testsuite.)

Erläuterung

O`.

Dies sortiert die Zeichen der Eingabe.

.\B

Dadurch werden alle Zeichen mit Ausnahme des letzten entfernt, sodass in den ersten beiden Schritten das maximale Zeichen ermittelt wird.

{2`
$`
}T01`dl`_o

Dies sind zwei Stufen, die eine Schleife bilden. Das erste dupliziert das erste Zeichen und das zweite "dekrementiert" es (ersetzt zB xmit w, amit 9und 1mit 0). Die letzte Stufe trifft auf eine Null als erstes Zeichen, sie entfernt sie stattdessen. Dies ist eine Standardtechnik zum Erzeugen einer Reihe von Zeichen am oberen Ende. Somit werden alle "Ziffern" von 0bis zur maximalen Ziffer erzeugt.

.

Schließlich zählen wir einfach die Anzahl der Stellen, die uns die Basis gibt.


2

R 99 89 85 Bytes

Aussehen ! Weniger als 100 Bytes!
Aussehen ! 10 Bytes aus!
Aussehen ! 4 Bytes aus!

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

Ungolfed:

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.

Wie so oft benutzt diese Antwort die ifelseFunktion:ifelse(Condition, WhatToDoIfTrue, WhatToDoElse)


Ich liebe deine Version. Wenn Sie jedoch Buchstaben und Zahlen getrennt behandeln, werden diese lästigen zusätzlichen Bytes erstellt. Bitte werfen Sie einen Blick auf meine Lösung, die eine andere Methode verwendet.
Andreï Kostyrka

Ihre Antwort ist in der Tat interessant. Ich werde Ihre scanMethode zum Golfen einiger Bytes verwenden;)
Frédéric

1

PHP, 51 38 Bytes

(Von Dennis) ^^

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

Anderer Vorschlag ohne Dennis 'Trick

<?=($a=max(str_split($argv[1])))<a?$a+1:ord($a)-86;
  • Übernimmt die Eingabe als Argument $ argv [1];
  • Max. Zeichen (unter Verwendung von ASCII)
  • Wenn es sich um eine Zahl handelt (die unter dem Wert <'a' liegt), geben Sie die Zahl + 1 aus
  • Andernfalls wird der ASCII-Wert -86 ausgegeben (97 für 'a' in ASCII, -11 für 'a' ist die elfte Basisziffer).

Es ist schade, dass PHP so wortreiche Funktionsnamen hat: <?=base_convert(max(str_split($argv[1])),36,10)+1ist eine elegante Lösung, aber bei 49 Bytes!

@YiminRong können Sie verwenden, intval()stattdessen base_convert()verkürzt sich auf 38 Bytes <?=intval(max(str_split($argn)),36)+1;tio: tio.run/##K8go@P/…
640KB



1

Java 7, 67 61 Bytes

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

(m-8)%39ist dank @Dennis 'erstaunlicher Antwort .

Ungolfed & Testcode:

Probieren Sie es hier aus.

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

Ausgabe:

1
7
16
9
5
25
36

2
Stattdessen Math.max()können Siem = m>c?m:c
RobAu

@RobAu Ah natürlich, danke. Völlig vergessen. Manchmal vergesse ich die einfachsten Codegolfing-Dinge in Java, die sogar mehrfach in den Tipps zum Codegolfing in Java-Post erwähnt werden . Danke für die Erinnerung.
Kevin Cruijssen

Wenn Sie Java 8 wechseln können Sie diese ganze Funktion mit einem Lambda ersetzen, macht einen einzigenreduce
BlueRaja - Danny Pflughoeft

@ BlueRaja-DannyPflughoeft Ich weiß, weshalb ich es ausdrücklich als Java 7 erwähnte. Sie können gerne ein Java 8-Lambda als separate Antwort posten.
Kevin Cruijssen

@ BlueRaja-DannyPflughoeft Ich frage mich, ob das mit weniger Bytes enden würde ..
RobAu

1

C89, 55 53 52 50 Bytes

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

-8%39 schamlos von Dennis gestohlen

Prüfung

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

Ausgabe

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

Dank Toby Speight 2 Bytes gespart

2 Bytes dank Kevin Cruijssen gespeichert


Sie können 2 Byte mit der Nicht-Prototyp-Deklaration speichern: f(char*s,int b)wird f(s,b)char*s;.
Toby Speight

Sie können 3 Bytes einsparen, indem Sie die unnötigen Klammern und Leerzeichen entfernen: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 Bytes

Diese Antwort setzt voraus, dass die Eingabe in ASCII erfolgt (oder in den Zahlen und Buchstaben identisch ist, z. B. ISO-8859 oder UTF-8):

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

Wir iterieren einfach entlang des Strings, wobei wir uns den größten Wert merken, und verwenden dann die bekannte Modulo-39-Konvertierung von base- {11..36}.

Testprogramm

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

Testergebnisse

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

Könnten Sie das m = 0 nicht entfernen? Wenn m auf der obersten Ebene der Datei angezeigt wird, wird deren extern, was statisch impliziert, auf Null initialisiert.
Batman

@Batman - ja, aber nur, wenn Sie nicht f()mehr als einmal anrufen . Ich weiß, dass fast alles im Golfsport fair ist, aber meine professionellen Instinkte halten das für zu fragil!
Toby Speight

Bei weiterem Überlegen könnte ich es zu einer externen Anforderung machen, mzwischen Anrufen zurückzusetzen f(). Dann könnte mein Testprogramm noch funktionieren.
Toby Speight

@Batman: Bei Code Golf Meta spricht die Mehrheitsmeinung zur Frage " Müssen Funktionsübermittlungen wiederverwendbar sein? " Offenbar gegen das Zulassen von Funktionen zur einmaligen Verwendung. Also bleibe ich bei dem, was ich habe. Trotzdem danke für den Vorschlag.
Toby Speight

1

Mathematica, 34 32 Bytes

2 Bytes gespart dank Martin Ender

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

Ich entschied, dass die andere Methode eine neue Antwort verdient.

Methode gestohlen, inspiriert von Dennis 'Lösung


2
Verwenden Sie eine Präfixnotation: Max@Mod[ToCharacterCode@#-8,39]&(Gleiches gilt für Ihre andere Antwort)
Martin Ender

2
Außerdem müssen Sie &am Ende hinzufügen , um auf eine anonyme Funktion hinzuweisen.
LegionMammal978

Sie haben eine @Ihrer beiden Antworten ( ToCharacterCode@#und Characters@#) vergessen .
Martin Ender

1

Mathematica, 34 32 Bytes

2 Bytes gespart dank Martin Ender

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

Definiert eine reine Funktion, die eine Zeichenfolge als Eingabe akzeptiert.

Teilt die Eingabe in Zeichen auf, konvertiert sie in Zahlen zur Basis 36 und gibt das Maximum +1 zurück.


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

1

C # REPL, 17 Bytes

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

Nur portiert @ Dennis Antwort auf C #.


1

CJam, 10 Bytes

Vielen Dank an Martin Ender, der mir ein paar Bytes gespart hat!

Verwendet Dennis Formel

q:e>8-i39%

Probieren Sie es online aus

CJam, 18 16 Btyes

Alternative Lösung:

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

Probieren Sie es online aus

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

Scala, 25 Bytes

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

Führen Sie es wie folgt aus:

$ scala whatbase.scala 0123456789abcdefghijklmnopqrstuvwxyz


1

R 62 54 Bytes

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

Ungolfed:

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

Update: 8 Bytes wurden aufgrund der Redundanz von na.rm=Tunter der Annahme der Eingabegültigkeit abgeschnitten .

Eine Größenverbesserung von 39% im Vergleich zu Frédérics Antwort . Außerdem läuft es ein bisschen schneller: 0,86 Sekunden für 100000 Replikationen gegenüber 1,09 Sekunden für die konkurrierende Antwort. Meiner ist also kleiner und effizienter.


0

Dyalog APL , 10 Bytes

Fordert zur Eingabe von Großbuchstaben auf.

⌈/⍞⍳⍨⎕D,⎕A

⌈/ maximal

Zeichen der Eingabe

⍳⍨ 1-indiziert in

⎕D, Alle Ziffern gefolgt von

⎕A alle Zeichen

TryAPL online!


0

BASH 70

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

Eingabebuchstaben sind Kleinbuchstaben.


0

JavaScript, 57 50 48 Bytes

7 Bytes gespart dank @ kamaroso97 2 Bytes gespart dank @Neil

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

Ursprüngliche Antwort:

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

Mit können Sie 7 Bytes abschneiden n=>Math.max(...n.split``.map(a=>parseInt(a,36)+1)).
Kamoroso94

@ kamoroso94 Ich wusste nicht, dass es Math.maxexistiert. Danke, dass du mir davon erzählt hast!
DanTheMan

[...s]ist kürzer als s.split``.
Neil

0

Perl, 30 27 Bytes

Beinhaltet +1 für -p

Führen Sie mit der Eingabe auf STDIN, z

base.pl <<< codegolf

base.pl:

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

0

LiveScript, 32 Bytes

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

Ein Port dieser Antwort in meiner Lieblingssprache, die mit JavaScript kompiliert wird. Wenn der base~numberOperator mit Variablen arbeiten würde, könnte ich schreiben ->1+36~(it/'')sort!pop!(23 Bytes), aber das widerspricht dem Funktionsbindungsoperator: /

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.