Die Basis im Mix

23

Eingabe:
Eine Liste / ein Array von Ganzzahlen, für die sich jedes Element im Bereich von befindet 2-36.

Ausgabe:
Die Summe der Ganzzahlen (als Basis 10), wobei sich jede nächste Ganzzahl in der Basis des vorherigen Werts befindet (beginnend mit einer regulären Basis 10).

Beispiel:
Nehmen wir an, wir haben eine Eingabe wie diese: [4, 12, 34, 20, 14, 6, 25, 13, 33]
Dann haben wir eine Summe wie diese:

4    (4  in base-10) +
6    (12 in base-4 ) +
40   (34 in base-12) +
68   (20 in base-34) +
24   (14 in base-20) +
6    (6  in base-14) +
17   (25 in base-6 ) +
28   (13 in base-26) +
42   (33 in base-13)
= 235

Erklärung der mathematischen Basis:
Ich dachte darüber nach, dass jeder weiß, wie die Basis funktioniert, aber ich werde trotzdem ein kurzes Beispiel dafür geben, wie es funktioniert, nur für den Fall. Nehmen34 in base-12wir zum Beispiel, wie sind wir dazu gekommen40?

1-34 in regular base-10:
 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34
 So, from 1 to 34 is 34 steps in base-10

1-34 in base-12:
 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 1A, 1B, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 2A, 2B, 30, 31, 32, 33, 34
 So, from 1 to 34 is 40 steps in base-12

Hier ist vielleicht ein nützlicher Rechner.

Herausforderungsregeln:

  • Die Array-Größe wird in einem angemessenen Bereich liegen ( 1-100siehe Testfälle).
  • Die Testfälle werden niemals ganze Zahlen enthalten, deren aktueller Wert für die vorherige Basis ungültig ist (dh Sie werden niemals so etwas wie 19 in base-6oder haben 6 in base-6, weil base-6 nur die Ziffern enthält 0-5).
  • Sie können die Eingabe nach Belieben übernehmen. Kann als Int-Array, als durch Komma / Leerzeichen getrennte Zeichenfolge usw. sein. Ihr Aufruf. (Sie können das Int-Array auch umgekehrt verwenden, was für Stack-basierte Programmiersprachen nützlich sein kann.)

Allgemeine Regeln:

  • Das ist , also gewinnt die kürzeste Antwort in Bytes.
    Lassen Sie sich von Code-Golf-Sprachen nicht davon abhalten, Antworten mit anderen Sprachen als Golf zu veröffentlichen. Versuchen Sie, für jede Programmiersprache eine möglichst kurze Antwort zu finden.
  • Für Ihre Antwort gelten Standardregeln. Daher dürfen Sie STDIN / STDOUT, Funktionen / Methode mit den richtigen Parametern und vollständige Programme verwenden. Ihr Anruf.
  • Standardlücken sind verboten.
  • Fügen Sie nach Möglichkeit einen Link mit einem Test für Ihren Code hinzu.
  • Fügen Sie ggf. auch eine Erklärung hinzu.

Testfälle:

[4, 12, 34, 20, 14, 6, 25, 13, 33]                            ->   235
 4+ 6+  40+ 68+ 24+ 6+ 17+ 28+ 42

[5, 14, 2, 11, 30, 18]                                        ->   90
 5+ 9+  2+ 3+  33+ 38

[12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 12, 2, 11, 3, 10, 2, 10]    ->   98
 12+ 13+ 11+ 9+ 8+ 7+ 6+ 5+ 4+ 3+ 5+  2+ 3+  3+ 3+  2+ 2

[36, 36]                                                      ->   150
 36+ 114
Kevin Cruijssen
quelle
1
Kann die Eingabe für stapelbasierte Sprachen mit einem LIFO-Container in umgekehrter Reihenfolge erfolgen? In DC würde ich ~ 30 Bytes benötigen, nur um den Stapel umzudrehen, damit die erste Zahl in der Eingabe die erste ist, die verarbeitet wird, die nicht auf Stapel basierende Sprachen standardmäßig haben.
Seshoumara
@seshoumara Warum nicht. Ich werde dies in der Herausforderung klarstellen. Es geht hauptsächlich um die Herausforderung und Ausgabe und nicht wirklich um das Eingabeformat.
Kevin Cruijssen

Antworten:

4

05AB1E , 7 6 5 Bytes

Verwendet die 05AB1E- Codierung.

1 Byte mit dem švon Kevin Cruijssen vorgeschlagenen neuen integrierten Speicherplatz eingespart

TšüöO

Erläuterung

Die Eingabeliste wird umgekehrt verwendet, wie es die Challenge-Spezifikation zulässt.

Tš     # prepend a 10 to the list
  üö   # reduce by conversion to base-10
    O  # sum

Probieren Sie es online!

Geänderte Testsuite

Emigna
quelle
2
Kann jetzt mit dem eingebauten šstatt 5 Bytes sein ¸ì. Außerdem heißt es in Ihrer Erklärung " anhängen " statt " voranstellen ". :)
Kevin Cruijssen
@ KevinCruijssen: Danke :)
Emigna
9

Python 3, 40 Bytes

lambda a:sum(map(int,map(str,a),[10]+a))

Tests sind bei ideone

map(str, a)einen Generator erzeugt, G, dass Anrufe strauf jedem Wert in a, in Strings Umwandlung
map(int, G, [10]+a)erzeugt , die einen Generator Anrufe int(g, v)für die Paare über Gund [10]+a
int(g, v)wandeln die Zeichenfolge gaus der ganzzahligen Basis v(wenn vin [2,36]und ggültig ist)
sumtut , was es auf dem Zinn sagt

Jonathan Allan
quelle
7

Python 2, 48 Bytes

lambda a:sum(int(`x`,y)for x,y in zip(a,[10]+a))

Tests sind bei ideone

zip(a,[10]+a)Durchsucht Paare der Werte in aund konvertiert der vorherige Wert oder 10beim ersten
der backticksim intAufruf enthaltenen Werte in xeinen String, s
int(s, y)konvertiert den String svon der Ganzzahlbasis y(wenn yin [2,36]und sgültig) und
summacht das, was er sagt

Jonathan Allan
quelle
6

Perl, 35 34 33 Bytes

Beinhaltet +2 für -ap

Führen Sie mit der Liste der Zahlen auf STDIN:

basemix.pl <<< "4 12 34 20 14 6 25 13 33";echo

basemix.pl:

#!/usr/bin/perl -ap
$\+=$&+"$`$& 10"*/.$/*$`for@F}{

Ich habe ewig auf eine Chance gewartet, diesen Missbrauch zu nutzen ...

Erläuterung

Die Eingabenummern können maximal 2 Stellen haben. Eine Zahl xyin der Basis bist einfach b*x+y. Ich werde den regulären Ausdruck verwenden, /.$/so dass die erste Ziffer in $`und die letzte Ziffer in endet $&, so dass der Beitrag zur Summe ist $&+$b*$`.

Ich missbrauche die Tatsache, dass fordie regulären Ausdrücke (wie zum Beispiel mapund while) nicht richtig lokalisiert werden, sodass die Ergebnisse einer Übereinstimmung in der vorherigen Schleife weiterhin in der aktuellen Schleife verfügbar sind. Wenn ich also vorsichtig mit der Reihenfolge bin, in der ich die Operationen durchführe, ist die Basis als verfügbar "$`$&", mit Ausnahme der allerersten Schleife, in der die Basis 10 sein muss. Also verwende ich "$`$& 10"stattdessen

Die Art und Weise, wie das Erste $&funktioniert, ist ebenfalls ein Missbrauch, da es tatsächlich geändert wird, /.$/während es bereits auf dem Stapel ist, der darauf wartet, hinzugefügt zu werden.

Der endgültige Missbrauch ist die }{am Ende , die die Schleife ändert implizit -paus

LINE: while (defined($_ = <ARGV>)) {
    ...code..
}
continue {
    die "-p destination: $!\n" unless print $_;
}

zu

LINE: while (defined($_ = <ARGV>)) {
    ...code..
}
{
}
continue {
    die "-p destination: $!\n" unless print $_;
}

Welches Mittel $_im Ausdruck undefiniert ist, addiert sich dennoch, $\in dem ich die Summe akkumuliert habe. Es ist auch ein Standard-Golf-Trick, um die Post-Loop-Verarbeitung zu erhalten

Tonne Hospel
quelle
Ich wäre wirklich an einer Erklärung für diejenigen von uns mit schwächerem Perl-Fu interessiert!
m-chrzan
2
@ m-chrzan Lösung behoben und Erklärung hinzugefügt
Ton Hospel
4

PHP, 53 51 Bytes

for(;$x=$argv[++$i];$b=$x)$s+=intval($x,$b);echo$s;

Durchläuft die Eingabe und konvertiert jede Eingabe in eine Zeichenfolgenvariante. Nimmt dann den ganzzahligen Wert unter Verwendung der vorherigen Zahl als Basis. Für die erste Zahl wird die Basis nicht gesetzt, PHP startet dann mit 10 (abgeleitet aus dem Zahlenformat).

Laufen Sie wie folgt ( -dnur aus ästhetischen Gründen hinzugefügt):

php -d error_reporting=30709 -r 'for(;$x=$argv[++$i];$b=$x)$s+=intval($x,$b);echo$s;' -- 12 11 10 9 8 7 6 5 4 3 12 2 11 3 10 2 10;echo

Optimierungen

  • Eine Konvertierung in eine Zeichenfolge ist nicht erforderlich, da CLI-Argumente bereits eine Zeichenfolge sind. 2 Bytes gespeichert.
aross
quelle
3

Gelee , 7 Bytes

ṙ1DḅṖḌS

Probieren Sie es online!

Dennis
quelle
3
Sie könnten ṖḌmitF
Jonathan Allan
4
Leider funktioniert das nicht bei der ersten zweistelligen Nummer.
Dennis
3

Java, 86 Bytes

s->{int[]b={10};return s.reduce(0,(r,n)->{r+=n.valueOf(""+n,b[0]);b[0]=n;return r;});}

Testen und ungolfed

import java.util.function.ToIntFunction;
import java.util.stream.Stream;

public class Main {

  public static void main(String[] args) {
    ToIntFunction<Stream<Integer>> f = s -> {
      int[] b = {10};                 // Base, initialized with 10
      return s.reduce(0, (r, n) -> {  // Typical use of reduction, sum starts with 0.
        r += n.valueOf("" + n, b[0]); // Add the value in the previous base.
        b[0] = n;                     // Assign the new base;
        return r;
      });
    };

    System.out.println(f.applyAsInt(Stream.of(new Integer[]{4, 12, 34, 20, 14, 6, 25, 13, 33})));
  }
}
Olivier Grégoire
quelle
3

JavaScript ES6, 45 42 41 Bytes

const g =
     a=>a.map(v=>s+=parseInt(v,p,p=v),s=p=0)|s
;

console.log(g.toString().length);                                            // 42
console.log(g([4, 12, 34, 20, 14, 6, 25, 13, 33]));                          // 235
console.log(g([5, 14, 2, 11, 30, 18]  ));                                    // 90
console.log(g([12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 12, 2, 11, 3, 10, 2, 10] )); // 98

Günstig parseInt(x,0) === parseInt(x,10).

edit : 1 Byte dank @ETHproductions gespeichert

Lmis
quelle
Nett! Ich denke , dass Sie ein Byte speichern kann durch den Austausch &&smit |s.
ETHproductions
Sie können auch const gmit nur ersetzeng
Clyde Lobo
3

Pure Bash, 38

b=10
for i;{((t+=$b#$i,b=i));}
echo $t

Die Eingabeliste wird in der Befehlszeile angezeigt. for i;iteriert automatisch über die Eingabeparameter (entspricht for i in $@;).

Ideone.

Digitales Trauma
quelle
3

Java 7, 109 89 86 Bytes

int c(int[]a){for(Byte i=1;i<a.length;a[0]+=i.valueOf(a[i]+"",a[++i-2]));return a[0];}

20 Bytes dank @cliffroot (von denen 12 wegen eines blöden Fehlers, den ich selbst gemacht habe).

Ungolfed & Testcode:

Probieren Sie es hier aus.

class M{
  static int c(int[] a){
     for(Byte i = 1; i < a.length; a[0] += i.valueOf(a[i]+"", a[++i-2]));
     return a[0];
  }

  public static void main(String[] a){
    System.out.println(c(new int[]{ 4, 12, 34, 20, 14, 6, 25, 13, 33 }));
    System.out.println(c(new int[]{ 5, 14, 2, 11, 30, 18 }));
    System.out.println(c(new int[]{ 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 12, 2, 11, 3, 10, 2, 10 }));
    System.out.println(c(new int[]{ 36, 36 }));
  }
}

Ausgabe:

235
90
98
150
Kevin Cruijssen
quelle
Haben Sie wirklich brauchen p? Die Summe kann so berechnet werden, nicht wahr r+=r.valueOf(""+a[i],a[i-1])?
Olivier Grégoire
1
verwendete Konvertierung +""anstelle von valueOfund entfernte unnötige Variablen -int c(int[]a){for(Integer i=1;i<a.length;a[0]+=i.valueOf(a[i]+"",a[++i-2]));return a[0];}
Cliffroot
@cliffroot Ah, ich bin ein Idiot .. Als ich getestet habe, habe ich einen Fehler gemacht und hatte das 10und pumgekehrt. Ich habe den Fehler erkannt und behoben, aber da der String-Teil jetzt die reguläre Basis 10 ist, kann ich ihn in der Tat entfernen toStringund einfach verwenden +"". Danke, und danke auch für das Golfen der anderen Dinge, -20 Bytes. Ich muss dir wirklich eine Antwort geben, die du nicht mehr kannst (nicht, dass ich es nicht schätze! Je kürzer, desto besser natürlich - beim Code-Golfen ist das; P)
Kevin Cruijssen
Nur um mit meiner Antwort zu vergleichen, Ihre in der aktuellen Java-Syntax ist 79 Bytes lang (meine ist derzeit 86 Bytes lang). Aber es macht keinen Spaß, den Code anderer zu nehmen;)
Olivier Grégoire
1
@ KevinCruijssen, ich bin mehr als in Ordnung damit :) Ich habe nur das Gefühl, dass Java realistisch gesehen nicht mit dieser 5-6-Byte-Lösung konkurriert, daher füge ich meine eigenen Antworten nicht oft hinzu, aber ich finde es trotzdem spaßig, Golf zu spielen die Lösung anderer herunter.
Cliffroot
2

Eigentlich 12 Bytes

;p(dX(♂$♀¿Σ+

Probieren Sie es online!

Erläuterung:

;p(dX(♂$♀¿Σ+
;             dupe input
 p            pop first element from list
  (dX         pop and discard last element from other copy
     (♂$      stringify all elements in first copy
        ♀¿    for each pair of elements in the two lists, interpret the first element as a base-(second element) integer
          Σ   sum
           +  add first element of original list
Mego
quelle
2

CJam , 15 Bytes

l~{A\:A10bb}%:+

Probieren Sie es online!

Erläuterung

l~     e# Read and evaluate input.
{      e# Map this block over the input...
  A    e#   Push A. Initially this is 10, afterwards it will be the value of the
       e#   last iteration.
  \:A  e#   Swap with current value and store that in A for the next iteration.
  10b  e#   Convert to base 10 to get its decimal digits.
  b    e#   Interpret those in the base of the previous A.
}%
:+     e# Sum all of those values.
Martin Ender
quelle
2

Haskell, 65 59 Bytes

b%x|x<1=x|y<-div x 10=b*b%y+x-10*y
sum.((10:)>>=zipWith(%))

Teste es auf Ideone .

Damien
quelle
2

Matlab, 68 Bytes

Keine sehr kreative Lösung, aber hier ist es:

function[s]=r(x);j=10;s=0;for(i=x)s=s+base2dec(num2str(i),j);j=i;end

Tests:

>> r([4,12,34,20,14,6,25,13,33])
ans =
   235
>> r([12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 12, 2, 11, 3, 10, 2, 10])
ans =
   98
>> r([5, 14, 2, 11, 30, 18])
ans =
   90
>> r([36,36])
ans =
   150
ptev
quelle
Sie können ein Byte speichern mitfunction s=r(x);...
Luis Mendo
2

JavaScript (ES6), 54 48 40 Byte

Ich habe einen rekursiven Ansatz verwendet.

f=([b,...a],c)=>b?parseInt(b,c)+f(a,b):0

6 Bytes gespart, dank Lmis!
8 weitere Bytes gespart, danke an Neil!

Huntro
quelle
1
Ich glaube , Sie 3 Bytes unter Verwendung speichern kann , parseInt(a,b)anstatt parseInt(a[0],b)da parseIntwandelt das erste Argument String und ignoriert alles beim ersten ungültigen Zeichen beginnt (dh ‚‘).
Lmis
1
Ich denke auch, Sie können einige Bytes sparen, indem Sie a[0]?stuff():0anstelle vona.length&&stuff()
Lmis
@Lmis Danke, ich habe es aktualisiert :)
Huntro
1
Ich denke, Sie können dies auf 40 Bytes verkürzen:f=([b,...a],c)=>b?parseInt(b,c)+f(a,b):0
Neil
@Neil schöne Art und Weise nicht mit der sliceFunktion
Huntro
2

Perl 6 ,  52  50 Bytes

{sum (10,|@_).rotor(2=>-1).map:{+":{.[0]}<{.[1]}>"}}
{sum (10,|@_).rotor(2=>-1).map:{":{.[0]}<$_[1]>"}}

Erläuterung:

# bare block lambda with implicit parameter 「@_」
{
  sum

    ( 10, |@_ )        # the input with a preceding 10
    .rotor( 2 => -1 )  # grab 2 values, back up one, repeat
    .map:
    {
      # create a string of the form ":10<4>"
      ":{
        .[0]            # first element from $_
      }<{
        .[1]            # second element from $_
      }>"
    }
}
Brad Gilbert b2gills
quelle
1

Python 2, 52 Bytes

f=lambda x:x[1:]and int(`x.pop()`,x[-1])+f(x)or x[0]

Teste es auf Ideone .

Dennis
quelle
1

Julia, 63 Bytes

f(l)=sum([parse(Int,string(l[i]),l[i-1])for i=2:length(l)])+l[]

Analysiert jede Zahl (mit Ausnahme der ersten), wobei das vorherige Element als Basis und Summe verwendet wird. Fügt das erste Element am Ende hinzu

nyro_0
quelle
1

Ruby, 52 Bytes

->a{eval a.zip([10]+a).map{|e|'"%s".to_i(%s)'%e}*?+}

ungolfed

->a{
  eval(
    a.zip([10]+a).map { |e|
      '"%s".to_i(%s)' % e
    }.join("+")
  )
}

Verwendung

f=->a{eval a.zip([10]+a).map{|e|'"%s".to_i(%s)'%e}*?+}
p f[[4, 12, 34, 20, 14, 6, 25, 13, 33]] # => 235
cia_rana
quelle
1

Scala, 67 Bytes

def f(a:Int*)=a zip(10+:a)map{t=>Integer.parseInt(""+t._1,t._2)}sum

Erläuterung:

def f(a: Int*) =     //declare a method f with varargs of type Int as parameter
a zip (10 +: a)      //zip a with 10 prepended to a, resulting in...
                     //...Array((4,10), (12,4), (34,12), (20,34), (14,20), (6,14), (25,6), (13,25), (33,13))
map { t =>           //map each tuple t to...
  Integer.parseInt(  //...an integer by parsing...
    ""+t._1, t._2    //...a string of the first item in base-second-item.
  )
}
sum                  //and sum
corvus_192
quelle
1

Mathematica, 59 Bytes

Ich wünschte, die Funktionsnamen von Mathematica wären kürzer. Aber sonst bin ich glücklich.

Tr[FromDigits@@@Transpose@{IntegerDigits/@{##,0},{10,##}}]&

Beispielsweise,

Tr[FromDigits@@@Transpose@{IntegerDigits/@{##,0},{10,##}}]&[4,12,34,20,14,6,25,13,33]

Ausbeuten 235 .

{##,0}ist eine Liste der Eingabeargumente mit angehängter 0 (die die Ziffern darstellt); {10,##}ist eine Liste der Eingabeargumente mit 10 vorangestellten (die Basen darstellenden) Argumenten. Dieses Listenpaar ist Transposed, um jeder Zahl ihre Basis FromDigitszuzuordnen , und (yay!) Wandelt jedes Zahlen-Basis-Paar in eine ganze Zahl zur Basis 10 um, deren Ergebnisse mit summiert werden Tr.

Greg Martin
quelle
1

Common Lisp, 83

(lambda(s)(loop for b ="10"then x for x in s sum(#1=parse-integer x :radix(#1#b))))

Einzelheiten

(defun base-mix (list)
  (loop
     for base = "10" then string
     for string in list
     sum (parse-integer string :radix (parse-integer base))))

Das loopKonstrukt akzeptiert "v dann w" -Iterationskonstrukte, wobei v ein Ausdruck ist, der beim ersten Berechnen der Iterationsvariablen ausgewertet wird, und w der Ausdruck ist, der für die aufeinanderfolgenden Iterationen ausgewertet wird. Deklarationen werden nacheinander ausgewertet, also basezuerst "10", dann wird das vorherige Element stringder Liste listiteriert. Das sumSchlüsselwort berechnet eine Summe: die ganze Zahl von zu lesen stringmit einer Base b , wobei b die ganze Zahl aus dem geparsten ist basestring, in Basis 10 #1=und#1# die zu definierenden und zu verwendenden Notationen sind reader Variablen: der erste wirkt sich auf einen s-Ausdruck auf eine Variable aus, der andere ersetzt die Referenz durch dasselbe Objekt. Dadurch werden einige Zeichen für lange Namen gespeichert.

Beispiel

(base-mix '("4" "12" "34" "20" "14" "6" "25" "13" "33"))
=> 235
Core-Dump
quelle
1

Japt -x , 7 Bytes

äÏsnX}A

Versuch es

äÏsnX}A     :Implicit input of array
ä           :Take each consecutive pair of elements
 Ï          :Pass them through the following function as X & Y
  s         :  Convert Y to a base-10 string
   nX       :  Convert to an integer from base-X
     }      :End function
      A     :Before doing any of that, though, prepend 10 to the array
            :Implicit output of the sum of the resulting array
Zottelig
quelle