A base na mistura

23

Entrada:
uma lista / matriz de números inteiros para os quais cada item está no intervalo de 2-36.

Saída:
a soma dos números inteiros (como base 10), onde cada próximo número inteiro está na base do valor anterior (começando com uma base regular 10).

Exemplo:
Digamos que temos uma entrada como esta: [4, 12, 34, 20, 14, 6, 25, 13, 33]
Então temos uma soma como esta:

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

Base matemática explicada:
considerei assumir que todos sabem como a base funciona, mas darei um breve exemplo de como funciona, de qualquer maneira, por precaução. Vamos pegar o34 in base-12exemplo, como chegamos40?

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

Aqui está talvez uma calculadora útil.

Regras do desafio:

  • O tamanho da matriz estará em um intervalo razoável ( 1-100veja / veja os casos de teste).
  • Os casos de teste nunca conterão números inteiros cujo valor atual é inválido para sua base anterior (ou seja, você nunca terá algo parecido 19 in base-6ou 6 in base-6, porque a base-6 contém apenas os dígitos 0-5).
  • Você pode pegar a entrada da maneira que desejar. Pode ser como um array interno, como uma sequência separada por vírgula / espaço, etc. Sua chamada. (Você também pode reverter a matriz int, o que pode ser útil para linguagens de programação baseadas em pilha.)

Regras gerais:

  • Isso é , então a resposta mais curta em bytes vence.
    Não permita que idiomas com código de golfe o desencorajem a postar respostas com idiomas que não sejam de golfe. Tente encontrar a resposta mais curta possível para qualquer linguagem de programação.
  • As regras padrão se aplicam à sua resposta, para que você possa usar STDIN / STDOUT, funções / método com os parâmetros adequados, programas completos. Sua chamada.
  • As brechas padrão são proibidas.
  • Se possível, adicione um link com um teste para o seu código.
  • Além disso, adicione uma explicação, se necessário.

Casos de teste:

[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
fonte
1
Para idiomas baseados em pilha que possuem um contêiner LIFO, a entrada pode ser dada em ordem inversa? Em dc, eu exigiria ~ 30 bytes apenas para inverter a pilha para que o primeiro número na entrada fosse o primeiro a ser processado, que os idiomas não baseados em pilha têm por padrão.
Sshoumara # 23/16
@seshoumara Por que não? Vou esclarecer isso no desafio. É principalmente sobre o desafio e a saída, e não realmente sobre o formato de entrada.
Kevin Cruijssen 23/09/16

Respostas:

4

05AB1E , 7 6 5 bytes

Usa a codificação 05AB1E .

Economizou 1 byte usando o novo built-in, šcomo sugerido por Kevin Cruijssen

TšüöO

Explicação

A lista de entrada é invertida, conforme permitido pela especificação de desafio.

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

Experimente online!

Testinguite modificado

Emigna
fonte
2
Agora podem ter 5 bytes com o builtin em švez de ¸ì. Além disso, sua explicação indica " anexar " em vez de " anexar ". :)
Kevin Cruijssen 21/03
@KevinCruijssen: Obrigado :)
Emigna
9

Python 3, 40 bytes

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

Os testes estão no ideone

map(str, a)cria um gerador, Gque chama strcada valor a, convertendo em strings,
map(int, G, [10]+a)cria um gerador que chama int(g, v)pares Ge [10]+a
int(g, v)converte a string a gpartir da base inteira v(se vestiver dentro [2,36]e gé válido)
sumfaz o que diz na lata

Jonathan Allan
fonte
7

Python 2, 48 bytes

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

Os testes estão no ideone

zip(a,[10]+a)atravessa pares de valores na a, e o valor anterior ou 10para o primeiro
o backticksna intconverso chamada xpara uma cadeia, s
int(s, y)converte a cadeia de caracteres sa partir da base inteiro y(se yé em [2,36]es é válido)
sumfaz o que diz na lata

Jonathan Allan
fonte
6

Perl, 35 34 33 bytes

Inclui +2 para -ap

Execute com a lista de números no STDIN:

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

basemix.pl:

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

Eu estou esperando há séculos por uma chance de usar esse abuso ...

Explicação

Os números de entrada podem ter no máximo 2 dígitos. Um número xyna base bé simples b*x+y. Vou usar a regex /.$/para que o primeiro dígito termine $`e o último dígito $&, então a contribuição para a soma é $&+$b*$`.

Abuso o fato de fornão localizar adequadamente as variáveis ​​regex (como por exemplo mape whilefazer), para que os resultados de uma correspondência no loop anterior ainda estejam disponíveis no loop atual. Portanto, se eu for cuidadoso com a ordem em que faço as operações, a base estará disponível como "$`$&", exceto no primeiro ciclo em que eu preciso que a base seja 10. Portanto, eu uso"$`$& 10" em vez

O modo como o primeiro $&funciona também é um abuso, uma vez que é realmente alterado pelo/.$/ enquanto ele já está na pilha aguardando para ser adicionado.

O abuso final é o }{no final o que altera o ciclo implícito -pde

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

para

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

O que significa $_será indefinido na impressão, mas ainda adiciona a $\acumulação da soma. Também é um truque de golfe padrão para obter processamento pós-loop

Ton Hospel
fonte
Eu estaria realmente interessado em uma explicação para aqueles de nós com perl-fu mais fraco!
M-chrzan 23/09/16
2
@ m-chrzan Solução corrigida e explicação adicionada
Ton Hospel 23/09/16
4

PHP, 53 51 bytes

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

Repete a entrada, convertendo cada entrada em variante de sequência. Em seguida, pega o valor inteiro usando o número anterior como base. Para o primeiro número, a base não será definida, o PHP começará com 10 (inferido do formato do número).

Execute assim ( -dadicionado apenas para estética):

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

Tweaks

  • Na verdade, não há necessidade de converter para string, pois os argumentos da CLI já são string. 2 bytes salvos.
aross
fonte
3

Geléia , 7 bytes

ṙ1DḅṖḌS

Experimente online!

Dennis
fonte
3
Você poderia substituir ṖḌporF
Jonathan Allan
4
Infelizmente, isso não funcionará no primeiro número tem dois dígitos.
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;});}

Testando e não-destruído

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
fonte
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

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

edit : salvou 1 byte graças a @ETHproductions

Lmis
fonte
Agradável! Eu acho que você pode salvar um byte substituindo &&spor |s.
ETHproductions
Você também pode substituir const gcom apenasg
Clyde Lobo
3

Pure bash, 38

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

A lista de entrada é fornecida na linha de comando. for i;itera automaticamente sobre os parâmetros de entrada (equivalentes a for i in $@;).

Ideone.

Trauma Digital
fonte
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];}

Joguei 20 bytes graças a @cliffroot (dos quais 12 devido a um erro estúpido que cometi).

Ungolfed & código de teste:

Experimente aqui.

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

Saída:

235
90
98
150
Kevin Cruijssen
fonte
Você realmente precisa p? A soma pode ser calculada assim, não pode r+=r.valueOf(""+a[i],a[i-1]):?
Olivier Grégoire
1
usado conversão em +""vez de valueOfe removido variáveis ​​desnecessáriasint c(int[]a){for(Integer i=1;i<a.length;a[0]+=i.valueOf(a[i]+"",a[++i-2]));return a[0];}
#
@cliffroot Ah, eu sou um idiota .. Quando eu estava testando eu cometi um erro e tive o 10e prevertido. Eu percebi o erro e o consertei, mas como a parte String agora é base-10 regular, eu posso realmente remover o toStringe apenas usar +"".. Obrigado, e também obrigado por jogar outras coisas, -20 bytes. Eu realmente preciso fazer uma resposta que você não pode golfe mais (não que eu não apreciá-lo o mais curto melhor, claro - em código-golfe que é!; P)
Kevin Cruijssen
Apenas para comparar com a minha resposta, a sua na sintaxe atual do Java tem 79 bytes de comprimento (a minha atualmente possui 86 bytes). Mas não é divertido pegar o código de outras pessoas;):
Olivier Grégoire
1
@KevinCruijssen, estou muito bem com isso :) Sinto que o Java realisticamente não compete com toda essa solução de 5 a 6 bytes, por isso não adiciono minhas próprias respostas com frequência, mas ainda acho divertido jogar golfe abaixo a solução dos outros.
Cliffroot 23/09/16
2

Na verdade, 12 bytes

;p(dX(♂$♀¿Σ+

Experimente online!

Explicação:

;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
fonte
2

CJam , 15 bytes

l~{A\:A10bb}%:+

Experimente online!

Explicação

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
fonte
2

Haskell, 65 59 bytes

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

Teste em Ideone .

Damien
fonte
2

Matlab, 68 bytes

Não é uma solução muito criativa, mas aqui está:

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

Testes:

>> 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
fonte
Você pode salvar um byte comfunction s=r(x);...
Luis Mendo
2

JavaScript (ES6), 54 48 40 bytes

Eu usei uma abordagem recursiva.

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

Economizou 6 bytes, graças ao Lmis!
Economizou mais 8 bytes, graças a Neil!

Huntro
fonte
1
Eu acho que você pode salvar 3 bytes usando parseInt(a,b)em vez de parseInt(a[0],b)uma vez parseIntconvertidos o primeiro argumento para cordas e ignora tudo a partir do primeiro caractere inválido (ie '').
Lmis
1
Eu também acho que você pode salvar alguns bytes usando em a[0]?stuff():0vez dea.length&&stuff()
Lmis
@Lmis Obrigado, eu tenho atualizado it :)
Huntro
1
Eu acho que você pode encurtar isso para 40 bytes:f=([b,...a],c)=>b?parseInt(b,c)+f(a,b):0
Neil
@ Neil boa maneira de não usar a slicefunção
Huntro
2

Perl 6 ,  52  50 bytes

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

Explicação:

# 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
fonte
1

Python 2, 52 bytes

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

Teste em Ideone .

Dennis
fonte
1

Julia, 63 bytes

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

Analisa cada número (exceto o primeiro), tomando o elemento anterior como base e somas. Adiciona o primeiro elemento no final

nyro_0
fonte
1

Ruby, 52 bytes

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

destroçado

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

uso

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
fonte
1

Scala, 67 bytes

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

Explicação:

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
fonte
1

Mathematica, 59 bytes

Eu gostaria que os nomes das funções do Mathematica fossem mais curtos. Mas, caso contrário, estou feliz.

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

Por exemplo,

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

rendimentos 235.

{##,0}é uma lista dos argumentos de entrada com 0 acrescentado (representando os números); {10,##}é uma lista dos argumentos de entrada com 10 anexados (representando as bases). Esse par de listas é Transposed para associar cada um ao numeral à sua base e FromDigits(yay!) Converte cada par de numeral-base em um número inteiro da base 10, cujos resultados são somados Tr.

Greg Martin
fonte
1

Lisp comum, 83

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

Detalhes

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

A loopconstrução aceita construções de iteração "v then w" , em que v é uma expressão a ser avaliada na primeira vez em que a variável de iteração é calculada e w é a expressão a ser avaliada para as iterações sucessivas. As declarações são avaliadas uma após a outra, o baseprimeiro é "10" e o elemento anterior stringda lista listé iterado. A sumpalavra-chave calcula uma soma: o número inteiro lido stringcom a base b , onde b é o número inteiro analisado da basestring, na base 10. #1=e#1# são notações para definir e usar variáveis ​​do leitor: o primeiro afeta uma expressão s para uma variável, o outro substitui a referência pelo mesmo objeto. Isso salva alguns caracteres para nomes longos.

Exemplo

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

Japonês -x , 7 bytes

äÏsnX}A

Tente

äÏ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
Shaggy
fonte