Bir sayı üçgeni!


28

Biz terimi "kare alma" için kullanılır n hesaplanması anlamına n 2 . Ayrıca terim "cubing" için kullanılır n anlamında n 3 . Olduğu söyleniyor, neden bir de üçgeni üçe çeviremiyoruz?

Sayı nasıl üçgenlenir?

  • İlk önce, bir numara seçelim 53716.

  • Yan uzunluğu sayının rakam sayısına eşit olan ve aşağıda gösterildiği gibi çapraz olarak konumlandırılmış iki tarafa sahip olan bir paralelkenaride yerleştirin.

        53716
       53716
      53716
     53716
    53716
    
  • Şimdi, onu istiyoruz, değil mi? Bunu yapmak için, dik açılı bir üçgene uymayan tarafları kırpın:

        5
       53
      537
     5371
    53716
    
  • Bu satır için, her satırın toplamını alın [5, 8, 15, 16, 22]:

        5 -> 5
       53 -> 8
      537 -> 15
     5371 -> 16
    53716 -> 22
    
  • [5, 8, 15, 16, 22]Sonuçta ortaya çıkan listeyi toplayın 66. Bu, bu sayının üçgeni!

Özellikleri ve kuralları

  • Giriş, negatif olmayan bir tamsayı olacaktır n ( n ≥ 0, n ∈ Z ).

  • Herhangi bir izin verilen yoldan girdi alabilir ve çıktı alabilirsiniz .

  • Giriş, bir tamsayı, bir tamsayı dizgi gösterimi veya basamak listesi olarak biçimlendirilebilir.

  • Varsayılan boşluklara izin verilmez.

  • Bu , yani bayttaki en kısa kod kazanır!

Daha Test Kılıfları

Giriş -> Çıkış

0 -> 0
1 -> 1
12 -> 4
123 -> 10
999 -> 54 
100000 -> 6
654321 -> 91

İlham. Açıklamalar teşvik edilir!


Bundan emin 645321 -> 91misin?
Rod,

@Rod Üzgünüz, haklısınız. Onun 645321yerine yazdım 654321.
Bay Xcoder

1
Girişleri basamak listesi olarak alabilir miyim?
tamamen insan

@totallyhuman Evet, ikinci belirtime bakın.
Bay Xcoder,

1
İlginç bir meydan okuma. Benimkinden ilham aldığına sevindim!
Gryphon - Monica

Yanıtlar:




12

Brain-Flak , 65, 50, 36 bayt

([])({<{}>{<({}[()])>[]}{}<([])>}{})

Çevrimiçi deneyin!

Çok revize ettikten sonra, şimdi bu cevapla gurur duyuyorum. Algoritmayı ve beyin-flakta ne kadar güzel ifade edilebileceğini seviyorum.

Bayt sayısının çoğu, girdideki 0'ları işlemden gelir. Aslında, girişte 0 olmadığını varsayabilirsek, 20 baytlık bir cevap güzel olurdu:

({{<({}[()])>[]}{}})

Çevrimiçi deneyin!

Ancak ne yazık ki, beyin-lapa, kenar vakalarının kötü ele alınmasıyla ünlüdür.

açıklama

İlk önce, benim bir gözlemim:

Girdi n rakam uzunsa, ilk hane n kez üçgeni görünecek , ikinci hane n-1 kez görünecek ve böylece bir kez görünecek olan son haneye gelecek. Bundan faydalanabiliriz, çünkü beyin-flakta kaç tane girdi kaldığını hesaplamak gerçekten kolay, yani

[]

İşte kod böyle çalışıyor.

# Push the size of the input (to account for 0's)
([])

# Push...
(

    # While True
    {

        # Pop the stack height (evaluates to 0)
        <{}>

        # For each digit *D*...

        # While true
        {

            # Decrement the counter (the current digit we're evaluating), 
            # but evaluate to 0
            <({}[()])>

            # Evaluate the number of digits left in the input
            []

        # Endwhile
        }

        # This whole block evaluates to D * len(remaining_digits), but 
        # without affecting the stack

        # Since we looped D times, D is now 0 and there is one less digit.
        # Pop D (now 0)
        {}

        # Push the stack height (again, evaluating it as 0)
        <([])>

    # End while
    }

    # Pop a 0 off (handles edge case of 0)
    {}

# end push
)

Benim ipucu burada size kaydedebilirsiniz iki bayt
Buğday Sihirbazı





7

Japt , 7 6 4 bayt

å+ x

Çevrimiçi deneyin!

açıklama

å+ x    Implicit: input = digit list
å+      Cumulative reduce by addition. Gives the sum of each prefix.
   x    Sum.

Eski çözüm:

å+ ¬¬x

Çevrimiçi deneyin!

açıklama

å+ ¬¬x   Implicit: input = string
å+       Cumulative reduce by concatenation. Gives the list of prefixes.
   ¬     Join into a single string of digits.
    ¬    Split back into digits.
     x   Sum.
         Implicit: output result of last expression

Uh sandbox çok mu? Ya da soruyu okudun, kod yazdın ve hepsini bir dakika içinde gönderdiniz?
Jonathan Allan,

@JonathanAllan Bu sandboxed değildi. Düşündüğünden çok daha kolay.
Bay Xcoder,

1
Şey, peki zamanını bile okuyamıyorum
Jonathan Allan 19

@JonathanAllan Sandbox okuması yok, sadece yayınlandıktan hemen sonra soruyu yakalamak ve neredeyse bir algoritma bulmak için oldu.
ETHproductions

Soruyu okumak için bana ~ 4 dakika sürdü, bu yüzden hızlı okuma / hız anlama için +1 :)
Jonathan Allan

7

Brain-Flak , 28 bayt

(([]){[{}]({}<>{})<>([])}{})

Çevrimiçi deneyin!

Sıfırları desteklememiz gerekmiyorsa 14 bayt (ki yapıyoruz)

({({}<>{})<>})

Çevrimiçi deneyin!

DJMcMayhem burada kontrol etmeniz gereken harika bir cevap var . Maalesef onun için kendi dilinde kazanmasına izin vermeyecektim: P

O nasıl çalışır?

Basit versiyonla başlayalım.

({({}<>{})<>})

Buradaki ana eylem ({}<>{})<>, sol yığının tepesini alan ve sağ yığının tepesine ekleyen eylemdir . Bu işlemi ilmekleyerek mevcut yığını toplar (sıfıra gelene kadar) toplamı kapalı yığına yerleştiririz. Bu oldukça sıradan, ilginç olan kısım, tüm bu koşuların sonuçlarını sonuç olarak özetlememiz. Bu istenen değeri hesaplar. Niye ya? Peki bir örneğe bakalım 123. İlk kavramada sadece 1 alıyoruz, yani değerimiz 1

1

Bir sonraki kavramada 1 artı 2 değerini döndürürüz

1
1+2

Son seferde üçümüz de beraberiz.

1
1+2
1+2+3

Üçgeni görüyor musun? Tüm çalışmaların toplamı listenin "üçgeni" dir.


Tamam, ama şimdi sıfırlar için çalışmamıza gerek var, işte DJMcMayhem ile aynı numarayı kullandım, ayrıca biraz süslü ayak işi. Dönene kadar sıfıra çarpıncaya kadar döngü boşalıncaya kadar döngü yaparız.

([])({<{}>({}<>{})<><([])>}{})

Daha sonra bu ipucunu sizinkinden başkası tarafından yazılmayan bir başka 2 byte'ı atmak için kullandım.

(([]){[{}]({}<>{})<>([])}{})

Ve işte orada. Daha kısa bir çözüm olsaydı şaşırırdım, ama sonra yine garip şeyler oldu.


Unfortunately for him I wasn't about to let him win at his own language :PSenden daha az bir şey beklemiyorum. : D
DJMcMayhem

6

JavaScript (ES6), 28 bayt

a=>a.map(d=>t+=c+=d,t=c=0)|t

Girdiyi basamak listesi olarak alır.


5

Python 3 , 37 bayt

f=lambda n:len(n)and sum(n)+f(n[:-1])

Çevrimiçi deneyin!


5
... Neden aşağı oy?
Business Cat,

Ben değiştirmek düşünüyorum leniçin sumbir şey olur inanmıyorum olsa da.
ETHproductions 20

@ETHproductions Evet. sum([])0 olan gerçeği kullanabileceğimi umuyordum , fakat hiçbir şey bir araya gelmiyordu ... bir yol olabilir
Business Cat

Bunu görmedim, aksi takdirde size gelişimimi verirdim.
Jonathan Allan,

@JonathanAllan Endişeye gerek yok: P
Business Cat

5

C # (.NET Çekirdeği) , 59 bayt

using System.Linq;N=>N.Reverse().Select((d,i)=>i*d+d).Sum()

Çevrimiçi deneyin!

Diğer C # cevaplarından önemli ölçüde farklı. Giriş, basamakların bir listesidir. Tüm test vakaları TIO bağlantısına dahil edilmiştir.

Girdiyi, 0 önceli hanelerin geriye doğru bir listesi olarak kabul etmesine izin verilirse bir demet bayt kaydedilebilir.


İyi fikir! C #’da bazı sert kodlamalar.
Grzegorz Puławski

Güzel çözüm! Ancak giriş negatif numberolmayan bir basamak listesi olarak belirtilmiyor mu?
Ian H.

@IanH. Kural 2: İzin verilen herhangi bir yoldan girdi alabilir ve çıktı alabilirsiniz. Biçim söz konusu olduğunda, girişi bir tam sayı, tamsayı bir dize temsili veya basamak listesi olarak alabilirsiniz.
Kamil Drakari


4

J , 7 bayt

[:+/+/\

Çevrimiçi deneyin!Gibi rakamların bir listesini alır f 6 5 4 3 2 1.

açıklama

[:+/+/\    (for explanation, input = 6 5 4 3 2 1)
      \    over the prefixes of the input:
     /         reduce:
    +              addition (summation)
           this gives is the cumulative sum of the input:  6 11 15 18 20 21
[:         apply to the result:
  +/           summation
           this gives the desired result:   90

Özgün sorun için biraz daha doğru [:+/@,]/olan " giriş" ( ) girişinin +/flattened ( ,) önekleri olacaktır ]\.


4

Vim , 60 59 32 tuş vuruşlarını

Özyinelemeli makro ve hhile ile bahşiş için çok @CowsQuack teşekkürler , bu beni 27 bayt kurtardı!

qqYp$xh@qq@qVHJ:s/./&+/g⏎
C<C-r>=<C-r>"0⏎

Çevrimiçi deneyin!

Ungolfed / Açıklaması

Bu, tanımlandığı şekilde üçgeni oluşturacaktır (yalnızca sola hizalı tutması için):

qq       q    " record the macro q:
  Yp          "   duplicate the line
    $x        "   remove last character
      h       "   move to the left (this is solely that the recursive macro calls stop)
       @q     "   run the macro recursively
          @q  " run the macro

Tampon şimdi şuna benziyor:

53716
5371
537
53
5

Tüm çizgileri bir araya getirin ve ondan değerlendirilebilir bir ifade oluşturun:

VH             " mark everything
  J            " join into one line
   :s/./&+/g⏎  " insert a + between all the characters

"Şimdi kaydol şu dizeyi (not 0 kayıp) içerir:

5+3+7+1+6+ +5+3+7+1+ +5+3+7+ +5+3+ +5+ +

Yani tek yapmamız gereken bir sıfır eklemek ve onu değerlendirmek:

 C                " delete line and store in " register
  <C-r>=       ⏎  " insert the evaluated expression from
        <C-r>"    " register "
              0   " append the missing 0

vim'in içinde


Sen kullanabilirsiniz &yerine (bütün maç) \1yedek komutunda
Kritixi Lithos

1
qqYp$xq:exe"norm".col('.')."@q"⏎olabilir qqYp$xh@qq@q. Bu özyinelemeli makro satırda bir karakter olduğunda bir kopma hatasıyla karşılaşır, ardından durur.
Kritixi Lithos

Böylece ikame sadece olabilir :s/./&+/g. Ayrıca :%j⏎olabilir V{J. Ve Diolabilir C(Bu konuda Vim cevaplarınızdan birisinde daha önce yorum yaptım). Çevrimiçi deneyin!
Kritixi Lithos


3

Bash + GNU yardımcı programları, 32 24

tac|nl -s*|paste -sd+|bc

Giriş STDIN'den okunur.

Güncelleme: Girişin rakamların bir listesi olarak verilebileceğini görüyorum. Giriş listem yeni satırla ayrılmış.

Çevrimiçi deneyin .

açıklama

tac                       # reverse digit list
   |nl -s*                # prefix line numbers; separate with "*" operator
          |paste -sd+     # join lines onto one line, separated with "+" operator
                     |bc  # arithmetically evaluate

3

APL, 4 bayt

+/+\

Bu, girişi basamakların bir listesi olarak alır, örneğin:

      (+/+\) 5 3 7 1 6
66

açıklama

+/    sum of
  +\  partial sums of input

3

Taksi , 1478 bayt

Go to Post Office:w 1 l 1 r 1 l.Pickup a passenger going to Chop Suey.Go to Chop Suey:n 1 r 1 l 4 r 1 l.[a]Switch to plan "b" if no one is waiting.Pickup a passenger going to The Babelfishery.Go to Zoom Zoom:n 1 l 3 r.1 is waiting at Starchild Numerology.Go to Starchild Numerology:w 4 l 2 r.Pickup a passenger going to Addition Alley.Go to Addition Alley:w 1 r 3 r 1 r 1 r.Pickup a passenger going to Addition Alley.Go to The Babelfishery:n 1 r 1 r.Go to Chop Suey:n 6 r 1 l.Switch to plan "a".[b]Go to Addition Alley:n 1 l 2 l.Pickup a passenger going to Cyclone.[c]Go to Zoom Zoom:n 1 l 1 r.Go to Cyclone:w.Pickup a passenger going to The Underground.Pickup a passenger going to Multiplication Station.Go to The Babelfishery:s 1 l 2 r 1 r.Pickup a passenger going to Multiplication Station.Go to Multiplication Station:n 1 r 2 l.Pickup a passenger going to Addition Alley.Go to The Underground:n 2 l 1 r.Switch to plan "d" if no one is waiting.Pickup a passenger going to Cyclone.Go to Addition Alley:n 3 l 1 l.Switch to plan "c".[d]Go to Addition Alley:n 3 l 1 l.[e]Pickup a passenger going to Addition Alley.Go to Zoom Zoom:n 1 l 1 r.Go to Addition Alley:w 1 l 1 r.Pickup a passenger going to Addition Alley.Switch to plan "f" if no one is waiting.Switch to plan "e".[f]Go to Zoom Zoom:n 1 l 1 r.Go to Addition Alley:w 1 l 1 r.Pickup a passenger going to The Babelfishery.Go to The Babelfishery:n 1 r 1 r.Pickup a passenger going to Post Office.Go to Post Office:n 1 l 1 r.

Çevrimiçi deneyin!

Un-golfed:

[ Pickup stdin and split into digits ]
Go to Post Office: west 1st left 1st right 1st left.
Pickup a passenger going to Chop Suey.
Go to Chop Suey: north 1st right 1st left 4th right 1st left.
[a]
[ Count the digits ]
Switch to plan "b" if no one is waiting.
Pickup a passenger going to The Babelfishery.
Go to Zoom Zoom: north 1st left 3rd right.
1 is waiting at Starchild Numerology.
Go to Starchild Numerology: west 4th left 2nd right.
Pickup a passenger going to Addition Alley.
Go to Addition Alley: west 1st right 3rd right 1st right 1st right.
Pickup a passenger going to Addition Alley.
Go to The Babelfishery: north 1st right 1st right.
Go to Chop Suey: north 6th right 1st left.
Switch to plan "a".
[b]
Go to Addition Alley: north 1st left 2nd left.
Pickup a passenger going to Cyclone.
[c]
[ Multiply each digits by Len(stdin)-Position(digit) ]
Go to Zoom Zoom: north 1st left 1st right.
Go to Cyclone: west.
Pickup a passenger going to The Underground.
Pickup a passenger going to Multiplication Station.
Go to The Babelfishery: south 1st left 2nd right 1st right.
Pickup a passenger going to Multiplication Station.
Go to Multiplication Station: north 1st right 2nd left.
Pickup a passenger going to Addition Alley.
Go to The Underground: north 2nd left 1st right.
Switch to plan "d" if no one is waiting.
Pickup a passenger going to Cyclone.
Go to Addition Alley: north 3rd left 1st left.
Switch to plan "c".
[d]
Go to Addition Alley: north 3rd left 1st left.
[e]
[ Sum all the products ]
Pickup a passenger going to Addition Alley.
Go to Zoom Zoom: north 1st left 1st right.
Go to Addition Alley: west 1st left 1st right.
Pickup a passenger going to Addition Alley.
Switch to plan "f" if no one is waiting.
Switch to plan "e".
[f]
[ Output the results ]
Go to Zoom Zoom: north 1st left 1st right.
Go to Addition Alley: west 1st left 1st right.
Pickup a passenger going to The Babelfishery.
Go to The Babelfishery: north 1st right 1st right.
Pickup a passenger going to Post Office.
Go to Post Office: north 1st left 1st right.

3

Perl 5 , 19 + 1 ( -p) = 20 bayt

s/./$\+=$p+=$&/ge}{

Çevrimiçi deneyin!

Nasıl?

$ \ kümülatif toplamı tutar, $ p ise mevcut satırdaki rakamların toplamını tutar. Paralelkenarın her bir satırı, eklenmiş sayının bir sonraki hanesi ile sadece önceki satırdır. Bu nedenle, önceki satırın artı yeni rakamın toplamıdır. Bu işlem, tüm rakamları ilerledikçe, toplamları giderken hesaplar. Gerçek ikame ilgisizdir; bu sadece gerçek bir döngü oluşturmadan rakamları yinelemenin bir yoludur. Sonunda, $ \ -pseçenek tarafından örtük olarak basılır .



2

Jöle ,  5  4 bayt

Ṛæ.J

Ondalık basamakların bir listesini alan ve listenin temsil ettiği sayının üçgenini döndüren tek renkli bir bağlantı.

Çevrimiçi deneyin!

Nasıl?

Ṛæ.J - Link: list of numbers (the decimal digits), d   e.g. [9,4,5,0]
Ṛ    - reverse d                                            [0,5,4,9]
   J - range(length(d))                                     [1,2,3,4]
 æ.  - dot-product            (0*1 + 5*2 + 4*3 + 9*4 = 58)  58

Kaldırmanın hala işe yarayacağını düşünüyordum. Yazık ...
ETHproductions

@ETHproductions ... ve henüz yardımcı olacak bir yerleşik var!
Jonathan Allan,

... tamam, vay ...
ETHproductions

@ETHproductions ooops bunu tersine çevirmek zorunda kaldı> _ <
Jonathan Allan

2

Retina , 13 bayt

.
$`$&
.
$*
1

Çevrimiçi deneyin! Link, test durumlarını içerir. Açıklama: İlk aşama orijinal sayının tüm öneklerini oluşturur, ikinci aşama her basamağı birliğe çevirir ve üçüncü aşama toplamı alır.


2

Mathematica, 49 bayt

Tr@Array[Tr@s[[;;#]]&,Length[s=IntegerDigits@#]]&

Girişi basamak listesi olarak alabilirsiniz. #.Range[Length@#,1,-1]&
alephalpha

@Alephalpha'nın çözümünün iyileştirilmesi:#.Range[Tr[1^#],1,-1]&
JungHwan Min

Tr@*Accumulate
alephalpha

2

Neim , 3 bayt

𝐗𝐂𝐬

Açıklama:

𝐗        Get prefixes of input, including itself
 𝐂       Implicitly join elements together, and create an array with all the digits
  𝐬      Sum

Çevrimiçi deneyin!

Alternatif cevap:

𝐗𝐣𝐬

Açıklama:

𝐗       Get prefixes of input, including itself
 𝐣       Join
  𝐬      Implicitly convert to a digit array, and sum

Çevrimiçi deneyin!


2

Java 8, 53 bayt

Kabul edilebilir her giriş tipi için bir lambda kullandım. Her biri bir akümülatöre her birinin uygun katını ekleyerek sayının rakamlarını yineler.

Giriş olarak tamsayı (53 bayt)

Lambda Integeriçin Integer:

n->{int s=0,i=1;for(;n>0;n/=10)s+=n%10*i++;return s;}

Giriş olarak dize gösterimi (72 bayt)

Lambda Stringiçin Integer:

s->{int l=s.length(),n=0;for(int b:s.getBytes())n+=(b-48)*l--;return n;}

Giriş olarak rakam dizisi (54 bayt)

Lambda int[](sayılardan, ilk önce en büyük yer değeri) ile Integer:

a->{int l=a.length,s=0;for(int n:a)s+=n*l--;return s;}
  • Olivier Grégoire sayesinde -7 bayt

1
a -> {int l = a.length, s = 0; (int n: a) için s + = n * l -; dizi sürümü için s;} 54 bayt.
Olivier Grégoire

2

Pyt , 9 6 bayt

ąĐŁř↔·

Açıklama:

                 Implicit input
ą                Convert to array of digits
 Đ               Duplicate digit array
   Łř↔           Create a new array [len(array),len(array)-1,...,1]
      ·          Dot product with digit array
                 Implicit output

2

Python 3, 94 58 54 bayt

Sayesinde Sn Xcoder oldukça uzun bir bayt tasarruf bana yardımcı olduğunuz için!

lambda n:sum(int(v)*(len(n)-i)for i,v in enumerate(n))

Çevrimiçi Deneyin!

Bir dize olarak girdi alır. Basitçe, her basamağı, eklenmesi gereken sayı ile çarparak toplamını döndürür.


İlk önce iyi cevap, ama lütfen gereksiz boşlukları kaldırarak ve tüm değişken / fonksiyon adlarını 1 bayt yaparak, ciddi bir rakip haline getirin. 69 bayt
Bay Xcoder


@ Mr.Xcoder Teşekkürler. Bunu aklımda tutacağım.
Manish Kundu,

1
Her zaman çağrılacağını varsaymayabilirsiniz0 . Her pzaman olması 0gerekirse , beyannamede pile yerini almalısınız . Ancak, sadece 54 bayt almak için tamamen kaldırabilirsinizp=0lambdap
caird coinheringaahing


2

Ortak Lisp, 53 52 bayt

(loop as(x . y)on(reverse(read))sum(+(reduce'+ y)x))

Rakam listesi olarak girin.

Çevrimiçi deneyin!

@Ceilingcat sayesinde -1 bayt.


@ceilingcat, bazı Common Lisp derleyicileri applynedeniyle çok uzun listelere uygulandığında aslında başarısız olur call-arguments-limit.
Renzo
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.