Baza w miksie

23

Dane wejściowe:
lista / tablica liczb całkowitych, dla których każdy element należy do zakresu 2-36.

Dane wyjściowe:
Suma liczb całkowitych (jako podstawa 10), gdzie każda następna liczba całkowita znajduje się w podstawie poprzedniej wartości (zaczynając od zwykłej podstawy 10).

Przykład:
załóżmy, że mamy dane wejściowe takie jak to: [4, 12, 34, 20, 14, 6, 25, 13, 33]
Mamy więc taką sumę:

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

Wyjaśnienie podstawy matematycznej:
Rozważyłem założenie, że każdy wie, jak działa podstawa, ale podam krótki przykład, jak to działa, na wszelki wypadek. Weźmy34 in base-12na przykład, skąd mamy40?

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

Oto być może przydatny kalkulator.

Zasady konkursu:

  • Rozmiar tablicy będzie w rozsądnym zakresie (jak 1-100/ patrz przypadki testowe).
  • Przypadki testowe nigdy nie będą zawierały liczb całkowitych, których bieżąca wartość jest niepoprawna dla poprzedniej podstawy (tzn. Nigdy nie będziesz mieć czegoś takiego jak 19 in base-6lub 6 in base-6, ponieważ podstawa-6 zawiera tylko cyfry 0-5).
  • Możesz wziąć dane wejściowe w dowolny sposób. Może być jako tablica int, jako ciąg oddzielony przecinkami / spacjami itp. Twoje wywołanie. (Możesz także wziąć odwróconą tablicę int, co może być przydatne w przypadku języków programowania opartych na stosie).

Główne zasady:

  • To jest , więc wygrywa najkrótsza odpowiedź w bajtach.
    Nie pozwól, aby języki kod-golfowe zniechęcały Cię do zamieszczania odpowiedzi w językach innych niż golfowe. Spróbuj znaleźć możliwie najkrótszą odpowiedź dla dowolnego języka programowania.
  • Do odpowiedzi odnoszą się standardowe reguły , więc możesz używać STDIN / STDOUT, funkcji / metody z odpowiednimi parametrami, pełnych programów. Twoja decyzja.
  • Domyślne luki są zabronione.
  • Jeśli to możliwe, dodaj link z testem swojego kodu.
  • W razie potrzeby dodaj również wyjaśnienie.

Przypadki testowe:

[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
źródło
1
Czy w przypadku języków opartych na stosie, które mają kontener LIFO, dane wejściowe można podawać w odwrotnej kolejności? W dc potrzebowałbym ~ 30 bajtów tylko do odwrócenia stosu, aby pierwsza liczba na wejściu była pierwszą przetwarzaną, którą domyślnie mają języki nie oparte na stosie.
seshoumara,
@seshoumara Dlaczego nie. Wyjaśnię to w wyzwaniu. Chodzi głównie o wyzwanie i wyniki, a nie o format wejściowy.
Kevin Cruijssen

Odpowiedzi:

4

05AB1E , 7 6 5 bajtów

Wykorzystuje kodowanie 05AB1E .

Zaoszczędzono 1 bajt, korzystając z nowego wbudowanego narzędzia, šjak sugerował Kevin Cruijssen

TšüöO

Wyjaśnienie

Lista wejściowa jest pobierana w odwrotnej kolejności, na co pozwala specyfikacja wyzwania.

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

Wypróbuj online!

Zmodyfikowane testsuite

Emigna
źródło
2
Może być teraz 5 bajtów z wbudowanym šzamiast ¸ì. Ponadto wyjaśnienie brzmi „ dołącz ” zamiast „ dołącz ”. :)
Kevin Cruijssen
@KevinCruijssen: Dziękuję :)
Emigna
9

Python 3, 40 bajtów

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

Testy są w idealnym stanie

map(str, a)tworzy generator, Gktóry wywołuje strkażdą wartość w a, konwersja na ciągi
map(int, G, [10]+a)tworzy generator, który wzywa int(g, v)do par Gi [10]+a
int(g, v)przekształca ciąg gz bazy liczb całkowitych v(jeśli vjest w [2,36]i gjest poprawny)
sumrobi to, co mówi na puszce

Jonathan Allan
źródło
7

Python 2, 48 bajtów

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

Testy są w idealnym stanie

zip(a,[10]+a)przemierza par wartości w a, a poprzednią wartość lub 10na pierwszym w nawróconego wezwanie do łańcucha,
backticksintxs
int(s, y) konwertuje ciąg sz bazy całkowitej y(jeżeli yjest [2,36]i sjest ważna)
sumrobi to, co jest napisane na puszce

Jonathan Allan
źródło
6

Perl, 35 34 33 bajtów

Obejmuje +2 za -ap

Uruchom z listą liczb na STDIN:

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

basemix.pl:

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

Czekałem od wieków na możliwość wykorzystania tego nadużycia ...

Wyjaśnienie

Numery wejściowe mogą mieć maksymalnie 2 cyfry. Liczba xyw bazie bjest po prostu b*x+y. Zamierzam użyć wyrażenia regularnego, /.$/więc pierwsza cyfra kończy się na, $`a ostatnia cyfra na $&, więc wkład do sumy wynosi$&+$b*$` .

Nadużywam faktu, że fornie lokalizuje poprawnie zmiennych wyrażenia regularnego (jak na przykład mapi whileczyń), więc wyniki dopasowania w poprzedniej pętli są nadal dostępne w bieżącej pętli. Więc jeśli jestem ostrożny w kolejności, w jakiej wykonuję operacje, baza jest dostępna jako "$`$&", z wyjątkiem pierwszej pętli, w której potrzebuję, aby baza była 10. Więc używam"$`$& 10" zamiast tego

Pierwszy sposób $& działa, jest również nadużyciem, ponieważ jest faktycznie zmieniany, /.$/dopóki jest już na stosie i oczekuje na dodanie.

Ostateczna nadużycie jest }{na końcu, który zmienia pętlę rysującą się -pod

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

do

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

Co oznacza $_, że druk będzie niezdefiniowany, ale nadal dodaje, $\w którym zgromadziłem sumę. Jest to również standardowa sztuczka golfowa umożliwiająca przetwarzanie po pętli

Ton Hospel
źródło
Byłbym naprawdę zainteresowany wyjaśnieniem dla tych z nas słabszym perl-fu!
m-chrzan
2
@ m-chrzan Rozwiązanie naprawione i dodano wyjaśnienie
Ton Hospel,
4

PHP, 53 51 bajtów

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

Iteruje na wejściu, konwertując każde wejście na wariant łańcucha. Następnie przyjmuje wartość całkowitą, używając poprzedniego numeru jako podstawy. Dla pierwszego numeru baza nie zostanie ustawiona, PHP zacznie od 10 (wywnioskowane z formatu liczb).

Działaj w ten sposób ( -ddodano tylko dla estetyki):

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

Poprawki

  • W rzeczywistości nie trzeba konwertować na ciąg, ponieważ argumenty CLI są już ciągiem. Zapisano 2 bajty.
aross
źródło
3

Galaretka , 7 bajtów

ṙ1DḅṖḌS

Wypróbuj online!

Dennis
źródło
3
Można wymienić ṖḌzF
Jonathan Allan
4
Niestety, to nie zadziała, ponieważ pierwszy numer ma dwie cyfry.
Dennis
3

Java, 86 bajtów

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

Testowanie i nie golfista

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
źródło
3

JavaScript ES6, 45 42 41 bajtów

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

Konwencjonalnie parseInt(x,0) === parseInt(x,10).

edycja : Zapisano 1 bajt dzięki @ETHproductions

Lmis
źródło
Miły! Myślę, że możesz zapisać bajt, zastępując &&sgo |s.
ETHprodukcje
Można również wymienić const gsię tylkog
Clyde Lobo
3

Pure Bash, 38

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

Lista wejściowa jest podana w wierszu poleceń. for i;automatycznie iteruje parametry wejściowe (równoważne z for i in $@;).

Ideone.

Cyfrowa trauma
źródło
3

Java 7, 109 89 86 bajtów

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

Grał w golfa 20 bajtów dzięki @cliffroot (z czego 12 z powodu głupiej pomyłki, którą popełniłem).

Kod niepoznany i testowy:

Wypróbuj tutaj.

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

Wydajność:

235
90
98
150
Kevin Cruijssen
źródło
Czy naprawdę potrzebujesz p? Suma może być obliczona w ten sposób, prawda r+=r.valueOf(""+a[i],a[i-1])?
Olivier Grégoire,
1
użył konwersji +""zamiast valueOfi usunął niepotrzebne zmienne -int c(int[]a){for(Integer i=1;i<a.length;a[0]+=i.valueOf(a[i]+"",a[++i-2]));return a[0];}
cliffroot 23.09.16
@cliffroot Ach, jestem idiotą .. Kiedy testował popełniłem błąd i miał 10i podwrócony. Zrozumiałem błąd i naprawiłem go, ale ponieważ część String jest teraz zwykłą bazą-10, mogę rzeczywiście usunąć toStringi po prostu użyć +"".. Dzięki, a także dzięki za grę w golfa w innych rzeczach, -20 bajtów. Naprawdę muszę odpowiedzieć, że nie możesz więcej grać w golfa (nie, że nie doceniam tego!
Im
Dla porównania, moja odpowiedź w obecnej składni Java ma 79 bajtów długości (moja ma obecnie 86 bajtów długości). Ale nie jest fajnie przyjmować kod innych;)
Olivier Grégoire,
1
@KevinCruijssen, nie mam nic przeciwko :) Czuję, że realistycznie Java nie konkuruje z tymi wszystkimi 5-6 bajtowymi rozwiązaniami, więc nie dodam często własnych odpowiedzi, ale nadal fajnie jest grać w golfa w dół rozwiązania innych.
Cliffroot,
2

Właściwie 12 bajtów

;p(dX(♂$♀¿Σ+

Wypróbuj online!

Wyjaśnienie:

;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
źródło
2

CJam , 15 bajtów

l~{A\:A10bb}%:+

Wypróbuj online!

Wyjaśnienie

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
źródło
2

Haskell, 65 59 bajtów

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

Przetestuj na Ideone .

Damien
źródło
2

Matlab, 68 bajtów

Niezbyt kreatywne rozwiązanie, ale oto:

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

Testy:

>> 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
źródło
Możesz zapisać jeden bajt za pomocąfunction s=r(x);...
Luis Mendo
2

JavaScript (ES6), 54 48 40 bajtów

Zastosowałem podejście rekurencyjne.

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

Zaoszczędź 6 bajtów, dzięki Lmis!
Zaoszczędź 8 kolejnych bajtów dzięki Neilowi!

Huntro
źródło
1
Myślę, że możesz zapisać 3 bajty, używając parseInt(a,b)zamiast, parseInt(a[0],b)ponieważ parseIntkonwertuje pierwszy argument na ciąg i ignoruje wszystko, zaczynając od pierwszego niepoprawnego znaku (tj. „,”).
Lmis,
1
Myślę też, że możesz zaoszczędzić trochę bajtów, używając a[0]?stuff():0zamiasta.length&&stuff()
Lmis
@Lmis Dzięki, zaktualizowałem to :)
Huntro,
1
Myślę, że można to skrócić do 40 bajtów:f=([b,...a],c)=>b?parseInt(b,c)+f(a,b):0
Neil
@Neil fajny sposób na nieużywanie slicefunkcji
Huntro
2

Perl 6 ,  52  50 bajtów

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

Wyjaśnienie:

# 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
źródło
1

Python 2, 52 bajty

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

Przetestuj na Ideone .

Dennis
źródło
1

Julia, 63 bajtów

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

Analizuje każdą liczbę (oprócz pierwszej), biorąc poprzedni element jako podstawę i sumy. Dodaje pierwszy element na końcu

nyro_0
źródło
1

Ruby, 52 bajty

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

bez golfa

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

stosowanie

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
źródło
1

Scala, 67 bajtów

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

Wyjaśnienie:

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
źródło
1

Mathematica, 59 bajtów

Chciałbym, żeby nazwy funkcji Mathematiki były krótsze. Ale poza tym jestem szczęśliwy.

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

Na przykład,

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

daje 235 .

{##,0}jest listą argumentów wejściowych z dołączonym 0 (reprezentujących cyfry); {10,##}jest listą argumentów wejściowych z 10 poprzedzającymi (reprezentującymi podstawy). Tej parze list można Transposeskojarzyć każdą cyfrę z jej bazą i FromDigits(yay!) Konwertuje każdą parę cyfra-zasada na liczbę całkowitą base-10, której wyniki są sumowane Tr.

Greg Martin
źródło
1

Common Lisp, 83

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

Detale

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

The loopKonstrukt przyjmuje „V”, a następnie w konstrukcji iteracji, gdzie v jest wyrazem być oceniane po raz pierwszy zmienna iteracji jest obliczana i W jest wartości wyrażenia dla kolejnych iteracji. Deklaracje są przetwarzane jedna po drugiej, podobnie jak basepierwsza „10”, a następnie iteracja poprzedniego elementu stringlisty list. sumKluczowe oblicza sumę: liczba całkowita odczytu z stringz bazową b , gdzie b jest liczbą całkowitą analizowany z basełańcucha, w bazie 10. #1=i #1#są zapisy do zdefiniowania i stosowanie zmiennych reader: pierwszy wpływa na wyrażenie s do zmiennej, drugi zastępuje odwołanie tym samym obiektem. To oszczędza niektóre znaki dla długich nazw.

Przykład

(base-mix '("4" "12" "34" "20" "14" "6" "25" "13" "33"))
=> 235
rdzeń rdzeniowy
źródło
1

Japt -x , 7 bajtów

äÏsnX}A

Spróbuj

äÏ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
Kudłaty
źródło