Karışımdaki baz


23

Giriş:
Her bir öğenin aralığında olduğu bir tamsayı listesi / dizisi 2-36.

Çıktı:
Her bir sonraki tamsayının önceki değerin tabanında olduğu (tamsayılar 10 ile başlayan) tamsayıların toplamı (10 tabanına göre) toplamı.

Örnek:
Diyelim ki böyle [4, 12, 34, 20, 14, 6, 25, 13, 33]
bir girişimiz var : O zaman şöyle bir toplamımız var:

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

Matematiksel temel açıkladı:
Herkesin üssün nasıl çalıştığını bildiğini varsaydığımı düşündüm, ancak nasıl olsa işe yarayacağına dair kısa bir örnek vereceğim. En alalım34 in base-12örneğin, nasıl elde ettiniz40?

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

İşte belki yararlı bir hesap makinesi.

Meydan okuma kuralları:

  • Dizi boyutu makul aralıkta olacak (gibi 1-100 test durumları / bakınız).
  • Test senaryoları hiçbir zaman geçerli değerin önceki tabanı için geçersiz olduğu tam sayıları içermez (örneğin, hiçbir zaman 19 in base-6veya gibi bir şeye sahip olmazsınız 6 in base-6, çünkü base-6 yalnızca rakamları içerir)0-5 ).
  • İstediğiniz şekilde girişi alabilirsiniz. Int dizisi, virgül / boşlukla ayrılmış dize vb. Olabilir. Aramanız. (Ayrıca, yığın tabanlı programlama dilleri için yararlı olabilecek int dizisini de geri alabilirsiniz.)

Genel kurallar:

  • Bu , bayt cinsinden en kısa cevap kazanır.
    Code-golf dillerinin, golf yapmayan dillerle cevap yazmanızı engellemesine izin vermeyin. Herhangi bir programlama dili için mümkün olduğunca kısa bir cevap bulmaya çalışın.
  • Cevabınız için standart kurallar geçerlidir , bu nedenle STDIN / STDOUT, fonksiyonlar / yöntem ile uygun parametreler, tam programlar kullanabilirsiniz. Senin çağrı.
  • Varsayılan Loopholes yasaktır.
  • Mümkünse, lütfen kodunuz için test içeren bir bağlantı ekleyin.
  • Ayrıca, lütfen gerekirse bir açıklama ekleyin.

Test durumları:

[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

1
LIFO konteyneri olan yığın tabanlı diller için giriş ters sırada verilebilir mi? Dc'de sadece girdiyi girecek ilk sayıya sahip olması için sadece yığını çevirmek için ~ 30 bayt gerekirdi;
seshoumara

@ seshoumara Neden olmasın. Bunu mücadelede açıklığa kavuşturacağım. Esasen meydan okuma ve çıktı ile ilgilidir ve gerçekten girdi formatı ile ilgili değildir.
Kevin Cruijssen

Yanıtlar:


4

05AB1E , 7 6 5 bayt

05AB1E kodlamasını kullanır .

Kevin Cruijssenš tarafından önerilen yeni yerleşik kullanılarak 1 bayt kurtarıldı

TšüöO

açıklama

Giriş listesi, meydan şartnamesinin izin verdiği şekilde tersine çevrilir.

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

Çevrimiçi deneyin!

Modifiye testsuit


2
Yerleşiği ile artık 5 bayt olabilir šyerine ¸ì. Ayrıca, açıklama "belirtiyor append yerine" nin " prepend ". :)
Kevin Cruijssen

@KevinCruijssen: Teşekkür ederim :)
Emigna

9

Python 3, 40 bayt

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

Testler ideone altında

map(str, a)bir jeneratör oluşturur G, bu çağrılar strher değeri a, dizelerine dönüştürme
map(int, G, [10]+a)bir jeneratör yarattığını çağrılar int(g, v)karşısında çiftleri için Gve [10]+a
int(g, v)dize dönüştürür gtamsayı tabanından v(eğer viçindedir [2,36]ve ggeçerlidir)
sumTeneke ne diyor


7

Python 2,48 bayt

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

Testler ideone altında

zip(a,[10]+a)değerlerin çiftleri erişir ave önceki değer veya 10ilk için de çağrı dönüştürmek bir dizeye, dize dönüştürür tamsayı tabanından (eğer içindedir ve geçerlidir) Teneke ne diyor
backticksintxs
int(s, y)syy[2,36]s
sum


6

Perl, 35 34 33 bayt

İçin +2 içerir -ap

STDIN'de numaraların listesini çalıştırın:

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

basemix.pl:

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

Bu suistimali kullanabilmek için uzun zamandır bekliyorum ...

açıklama

Giriş numaraları en fazla 2 hane olabilir. xyTabandaki bir sayı bbasitçe b*x+y. Regex kullanacağım, /.$/böylece ilk hane biter $`ve son hane biter $&, böylece toplamın katkısı olur $&+$b*$`.

forRegex değişkenlerini (örneğin mapve benzerleri gibi) düzgün bir şekilde yerelleştirememediği için kötüye kullanıyorum, whileböylece önceki döngüdeki bir eşleşmenin sonuçları geçerli döngüde hala mevcut. Bu yüzden "$`$&", üssü 10 olarak kullanmam gereken ilk döngü dışında , tabanın mevcut olduğu işlemleri yaptığım sıraya dikkat ediyorsam , "$`$& 10"yerine kullanıyorum.

İlk $&çalışma şekli de kötüye kullanımdır, çünkü /.$/zaten eklenmeyi bekleyen yığındayken değişmiştir .

Nihai istismar }{ima döngü değiştirir sonunda -pgelen

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

için

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

Bu $_, baskıda tanımsız olacağı anlamına gelir , ancak yine $\de toplamı biriktirdiğim ekler . Ayrıca döngü sonrası işleme almak için standart bir golf hilesidir.


Zayıf perl-fu olan bizler için bir açıklama yapmak isterim!
m-chrzan

2
@ m-chrzan Çözüm düzeltildi ve açıklama eklendi
Ton Hospel

4

PHP, 53 51 bayt

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

Her girişi dize değişkenine dönüştürerek giriş üzerinde yinelenir. Sonra önceki sayıyı temel olarak kullanarak tamsayı değerini alır. İlk sayı için taban ayarlanmayacak, PHP 10 ile başlayacaktır (sayı biçiminden çıkarılacak şekilde).

Bu şekilde koş ( -dyalnızca estetik için eklendi):

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

Düzenlemeler

  • Aslında, CLI bağımsız değişkenleri zaten dize olduğundan, dizeye dönüştürmeye gerek yoktur. 2 bayt kaydedildi.


3

Java, 86 bayt

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

Test ve iğrenç

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

3

JavaScript ES6, 45 42 41 Bayt

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

düzenleme : @ETHproductions sayesinde 1 bayt kaydedildi


Güzel! Sana değiştirerek byte kaydedebilirsiniz düşünüyorum &&sile |s.
ETHProductions

Ayrıca const gsadece ile değiştirebilirsinizg
Clyde Lobo 24:16

3

Saf bash, 38

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

Giriş listesi komut satırında verilmiştir. for i;giriş parametreleri üzerinde otomatik olarak yinelenir (eşdeğeri for i in $@;).

Ideone.


3

Java 7, 109 89 86 bayt

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

Golf sayesinde 20 bayt @Cliffroot golf oynadım (12'sinde kendimi aptalca bir hata yaptım).

Ungolfed ve test kodu:

Burada dene.

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

Çıktı:

235
90
98
150

Gerçekten ihtiyacın var pmı? Toplam bu şekilde hesaplanabilir, değil mi r+=r.valueOf(""+a[i],a[i-1])?
Olivier Grégoire

1
gereksiz değişkenler +""yerine kullanılmış valueOfve kaldırılmış dönüşümler -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, ben bir aptalım. Test ederken bir hata yaptım 10ve pgeri döndüm . Hatayı farkettim ve düzelttim, ancak String kısmı şimdi normal üs-10 olduğundan, gerçekten toStringsadece ve sadece kullanabiliyorum +"".. Teşekkürler ve diğer şeyleri de golf oynadığınız için teşekkürler, -20 bayt. Gerçekten daha fazla golf
oynayamayacağınız

Sadece cevabımla karşılaştırmak için mevcut Java'nın sözdizimindeki sizlerin uzunluğu 79 bayttır (benimki şu an için 86 bayttır). Ama başkalarının kodunu almak eğlenceli değil;)
Olivier Grégoire

1
@KevinCruijssen, Ben bundan daha iyiyim :) Sadece gerçekçi bir şekilde Java'nın 5-6 baytlık çözümle rekabet etmediğini hissediyorum, bu yüzden sık sık kendi cevaplarımı eklemiyorum ama yine de golf oynamak için eğlenceli buluyorum başkalarının çözümünü azalt.
cliffroot

2

Aslında, 12 bayt

;p(dX(♂$♀¿Σ+

Çevrimiçi deneyin!

Açıklama:

;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

2

CJam , 15 bayt

l~{A\:A10bb}%:+

Çevrimiçi deneyin!

açıklama

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.

2

Haskell, 65 59 bayt

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

İdeone üzerinde test et .


2

Matlab, 68 bayt

Çok yaratıcı bir çözüm değil, işte burada:

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

Testler:

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

Bir bayt ile kaydedebilirsinizfunction s=r(x);...
Luis Mendo

2

JavaScript (ES6), 54 48 40 bayt

Özyinelemeli bir yaklaşım kullandım.

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

Lmis sayesinde 6 bayt kaydedildi!
Neil sayesinde 8 bayt daha kaydedildi!


1
Sana kullanarak 3 bayt kurtarabilir miyiz parseInt(a,b)yerine parseInt(a[0],b)beri parseIntdizeye ilk argüman dönüştürür ve ilk geçersiz karaktere itibaren herşeyi görmezden (yani '').
16'da Lmis

1
Ayrıca, bazı baytları a[0]?stuff():0yerinea.length&&stuff()
Lmis

@Lmis Teşekkürler, ben güncelledim :)
Huntro

1
Sanırım bunu 40 bayta kadar kısaltabilirsin:f=([b,...a],c)=>b?parseInt(b,c)+f(a,b):0
Neil

@Neil sliceişlevini kullanmamanın güzel bir yolu
Huntro

2

Perl 6 ,  52  50 bayt

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

Açıklama:

# 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 $_
      }>"
    }
}

1

Python 2, 52 bayt

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

İdeone üzerinde test et .


1

Julia, 63 Bayt

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

Önceki öğeyi baz olarak alarak her sayıyı (ilk hariç) ayrıştırır ve toplar. Sonuna ilk elemanı ekler


1

Ruby, 52 bayt

->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("+")
  )
}

kullanım

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

1

Scala, 67 bayt

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

Açıklama:

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

1

Mathematica, 59 bayt

Keşke Mathematica'nın fonksiyon isimleri daha kısa olsaydı. Ama aksi halde mutluyum.

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

Örneğin,

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

verim 235.

{##,0}0 eklenmiş giriş argümanlarının listesi (sayıları temsil eder); {10,##}10 önceden hazırlanmış (üsleri temsil eden) giriş argümanlarının listesidir. Bu liste çiftleri, Transposeher birini baz ile bir sayı ile ilişkilendirmek için d'dir ve FromDigits(yay!), Her bir sayı-baz çiftini, sonuçları toplanan bir 10 baz değerine dönüştürür Tr.


1

Common Lisp, 83

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

ayrıntılar

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

loopYapı kabul "W sonra v" yineleme yapıları, v yineleme değişkeni hesaplanan ilk değerlendirilecek bir ekspresyon ve W sürekli olarak yinelenir için değerlendirilmesi gereken bir ifadedir. Bildirimler birbiri ardına değerlendirilir, bu basenedenle ilk önce "10", sonra stringlistenin bir önceki öğesi listyinelenir. sumAnahtar bir toplamını hesaplar: tamsayıdır okunan stringbaz ile , b , b ayrıştırılan tamsayıdır basetaban 10'da dize #1=ve #1#tanımlamak için sembol ve kullanımı vardır okuyucu değişkenleri: Birincisi bir s-ifadesini değişkene etkiler, diğeri referansı aynı nesne ile değiştirir. Bu, uzun isimler için bazı karakterleri kaydeder.

Örnek

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

1

Japt -x , 7 bayt

äÏsnX}A

Dene

äÏ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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.