Urutan Cincin Olimpiade

18

Tantangan:

Diberikan bilangan bulat indeks n, baik output nitem 'dalam urutan ini, atau output urutan hingga dan termasuk indeks n:

25,25,7,28,29,20,21,22,23,14,35,26,7,28,29,20,16,29,12,15,28,21,14,17,30,13,16,29,12,15,28,21,10,6,12,18,15,11,7,13,19,17,13,9,15,21,18,14,10,16,22,19,15,11,17,23,20,16,12,18,24,21,17,13,19,25,23,19,15,21,27,24,20,16,22,28,25,21,17,23,29,16,13,9,15,21,18,14,10,16,22,20,16,12,18,24,21,17,13,19

Bagaimana cara kerja urutan ini?

CATATAN: Dalam penjelasan ini, indeks n1-diindeks.
Masukan nomor 1melalui xdua jalur panjang n*6 - 1, di mana xtergantung pada iterasi saat ini dan panjang nomor yang digunakan, dan kemudian menjumlahkan angka dari n'th / paling kanan Olympic Rings dari dua baris.

Angka pertama dalam urutan dihitung sebagai berikut:

The length of the lines are 5 (because 1*6 - 1 = 5):
12345
67891(0)

Then leave the digits in an Olympic Rings pattern:
1 3 5
 7 9

And sum them:
1+3+5+7+9 = 25

Jadi n=1hasilnya 25.

Angka kedua dalam urutan dihitung sebagai berikut:

The length of the lines are 11 (because 2*6 - 1 = 11):
12345678910
11121314151(6)

Then leave the digits in the second/right-most Olympic Rings pattern:
      7 9 0 
       4 5

And sum them:
7+9+0+4+5 = 25

Jadi n=2hasilnya 25.

Angka ketiga dalam urutan dihitung sebagai berikut:

The length of the lines are 17 (because 3*6 - 1 = 17):
12345678910111213
14151617181920212(2)

Then leave the digits in the third/right-most Olympic Rings pattern:
            1 2 3
             0 1

And sum them:
1+2+3+0+1 = 7

Jadi n=3hasilnya 7.

dll.

Aturan tantangan:

  • Saat Anda mengeluarkan nitem 'dalam urutan, Anda diizinkan untuk mengambil input sebagai 0-diindeks daripada 1-diindeks, tetapi perlu diingat bahwa perhitungan n*6 - 1kemudian akan menjadi (n+1)*6 - 1atau (n+1)*5 + n.
  • Angka tunggal lebih dari satu digit dapat dipisah pada akhir baris pertama ketika kami telah mencapai panjangnya n*5 + n-1, jadi ada kemungkinan bahwa angka dengan 2 digit atau lebih sebagian adalah bagian trailing dari baris 1, dan sebagian bagian terdepan dari baris 2.

Aturan umum:

  • Ini adalah , jadi jawaban tersingkat dalam byte menang.
    Jangan biarkan bahasa kode-golf mencegah Anda memposting jawaban dengan bahasa non-codegolf. Cobalah untuk memberikan jawaban sesingkat mungkin untuk bahasa pemrograman 'apa saja'.
  • Aturan standar berlaku untuk jawaban Anda, jadi Anda diperbolehkan menggunakan STDIN / STDOUT, fungsi / metode dengan parameter yang tepat dan tipe pengembalian, program lengkap. Panggilanmu.
  • Celah default tidak diperbolehkan.
  • Jika memungkinkan, silakan tambahkan tautan dengan tes untuk kode Anda.
  • Juga, silakan tambahkan penjelasan jika perlu.

Kasus uji:

Berikut adalah nampan tempel dari kotak uji 1-1.000 , jadi jangan ragu untuk memilih salah satu dari mereka.

Beberapa kasus uji tambahan yang lebih tinggi:

1010:   24
1011:   24
2500:   19
5000:   23
7500:   8
10000:  8
100000: 25
Kevin Cruijssen
sumber
1*5 + 1-1 = 5? Bukankah seharusnya begitu 1*5 + 5 - 1 = 9?
NieDzejkob
@NieDzejkob ada, n=1sehingga n*5 + n-1menjadi 1*5 + 1-1, yang pada gilirannya 5 - 0 = 5.
Kevin Cruijssen
tidak n * 5 + n - 1sama dengan n * 6 - 1?
Brian H.
@BrianH. Anda benar, memang benar. Mengetahui hal itu juga setelah melihat jawaban Retina Martin. Saya telah mengedit deskripsi tantangan untuk menggunakan rumus yang lebih pendek ini.
Kevin Cruijssen

Jawaban:

4

Sekam , 16 byte

ΣĊ2ṁ↑_5↑2CṁdN←*6

Cobalah online!

-3 byte terima kasih kepada H.PWiz .

Penjelasan (terburu-buru):

ΣĊ2ṁ↑_5↑2CṁdN←*6⁰
Σ                 Sum
 Ċ2                Drop every second element
   ṁ↑_5             Map "take last 5 elements", then concatenate
       ↑2            Take first 2 elements
         C            Cut x into sublists of length y
          ṁdN          [1,2,3,4,5,6,7,8,9,1,0,1,1,1,2,1,3,...] (x)
             ←         Decrement (y)
              *6        Multiply with 6
                ⁰        First argument
Erik the Outgolfer
sumber
@KevinCruijssen Aneh, karena saya hanya akan menambahkan satu. Namun saya tidak merekomendasikan menerima jawaban. ;-)
Erik the Outgolfer
@KevinCruijssen Saya telah menambahkan penjelasan tergesa-gesa, meskipun itu bukan atm yang ...
Erik the Outgolfer
Cukup bagus untukku, diterima. Dan secara pribadi saya lebih suka menerima tantangan, meskipun itu sebenarnya tidak terlalu diperlukan. Jika seseorang mengirim jawaban yang lebih pendek daripada jawaban Anda, saya tentu akan mengubahnya lagi.
Kevin Cruijssen
@KevinCruijssen Tujuan utama menentang itu bukanlah yang terjadi setelah jawaban yang lebih pendek dikirimkan, tetapi seseorang mungkin berkecil hati untuk mengirim jawaban lain sama sekali. Pokoknya, teleponmu.
Erik the Outgolfer
5

Retina , 70 68 62 byte

.+
10**
.
$.>`
~(`.+
6*$+*
)`.(.+)
L`.{$.1}
%,-6`.

,2,9`.
*
_

Cobalah online!

Penjelasan

Mari kita panggil input n , dan kita akan gunakan 3sebagai contoh.

.+
10**

The 10**adalah singkatan 10*$&*_yang menggantikan input dengan string 10n garis bawah.

.
$.>`

Sekarang kami mengganti setiap garis bawah dengan panjang string hingga dan termasuk garis bawah itu. Jadi ini hanya menghasilkan angka dari 1 hingga 10n semua digabung bersama ( 10n selalu cukup untuk mengisi dua baris dari panjang yang diperlukan).

~(`.+
6*$+*

Eval! Tahap ini dan selanjutnya akan menghasilkan kode sumber dari program lain, yang kemudian dijalankan melawan string bilangan bulat bersambung.

Untuk menghasilkan program itu, tahap ini pertama-tama mengganti bilangan bulat dengan string garis bawah 6n ( $+mengacu pada input asli program).

)`.(.+)
L`.{$.1}

Kemudian menggantikan mereka garis bawah dengan L`.{…}, di mana adalah 6n-1 (panjang garis yang kita cari di). Jadi kami telah membuat regex, yang kuantifiernya bergantung pada input asli.

Ketika program ini dievaluasi, itu cocok dengan potongan panjang 6n-1 , yang akan ada setidaknya dua. Sebagai contoh input 3kami, kami berakhir dengan:

12345678910111213
14151617181920212
22324252627282930

Sekarang kita hanya perlu mengekstraksi digit yang relevan.

%,-6`.

Pertama, di setiap baris (% ) kami menghapus semua kecuali lima digit terakhir ( ,-6). Itu memberi kita

11213
20212
82930

Akhirnya:

,2,9`.
*

Kami memperluas setiap digit lainnya ( 2) dalam sepuluh pertama (9 , ini berbasis 0) di unary. Mereka kebetulan berada di posisi Cincin Olimpiade.

_

Dan kami menghitung jumlah garis bawah yang dihasilkan, untuk menjumlahkannya dan mengonversi hasilnya menjadi desimal.

Martin Ender
sumber
59 byte Meskipun agak berantakan
H.PWiz
@ H.PWiz Sepertinya tidak berfungsi untuk input 1.
Martin Ender
Oh ya, itu akan menjadi-7
H.PWiz
3

Python 2 , 94 90 byte

n=input()*6
s=''.join(map(str,range(n*2)))
print sum(map(int,s[n-5:n:2]+s[n*2-5:n*2-1:2]))

Cobalah online!

tongkat
sumber
3

Japt , 33 32 30 29 28 27 byte

Oh, ini tidak cantik!

Menghasilkan istilah ke- n , diindeks 1.

*6É
*2 õ ¬òU mt5n)¬¬ë2 ¯5 x

Cobalah


Penjelasan

                         :Implicit input of integer U           :e.g., 3
*6É    
*6                       :Input times 6                         :18
  É                      :Subtract 1                            :17
   \n                    :Assign the above to variable U

*2 õ ¬òU mt5n)¬¬ë2 ¯5 x
*2 õ                     :[1,U*2]                               :[1,2,3,...,33,34]
     ¬                   :Join to a string                      :"123...3334"
      òU                 :Partitions of length U                :["123...13","1415...212","22324...30","31323334"]
         m               :Map
          t5n)           :  Get last 5 characters               :["11213","20212","82930","23334"]
              ¬          :Join to a string                      :"11213202128293023334"
               ¬         :Split to an array                     :["1","1","2","1","3","2","0","2","1","2","8","2","9","3","0"],["2","3","3","3","4"]]
                ë2       :Get every second element              :["1","2","3","0","1","8","9","0","3","3"]
                   ¯5    :Get first 5 elements                  :["1","2","3","0","1"]
                      x  :Reduce by addition                    :7
                         :Implicit output of result
Shaggy
sumber
2

Python 2 , 97 byte

n=input()*6;k=1;s=''
exec's+=`k`;k+=1;'*n*2
print sum(int(s[p])for p in(n-2,n-4,n-6,n*2-4,n*2-6))

Cobalah online!

ovs
sumber
2

Python 3, 129 123 byte

p=lambda r,x='',i=1:sum(map(int,str(x[6*r-2]+x[6*r-4]+x[6*r-6]+x[12*r-4]+x[12*r-6])))if len(x)>12*r-2else p(r,x+str(i),i+1)

Cobalah secara Online

Ini cukup banyak yang berantakan, tetapi berhasil.

Manish Kundu
sumber
2

05AB1E , 22 21 20 byte

6*<xLJsô2£íε5£}SāÉÏO

Cobalah online!

Penjelasan

6*<                    # push input*6-1
   xL                  # leave it on the stack while pushing [1 ... 12*input-2]
     J                 # join the numbers to a single string
      sô               # split the string into pieces of size input*6-1
        2£             # take the first 2 such pieces
          í            # reverse each string
           ε5£}        # take the first 5 chars of each
               S       # split to a single list of digits
                ā      # push range [1 ... len(list)]
                 ÉÏ    # keep only the numbers in the list of digits which are odd in this
                   O   # sum

Pendekatan alternatif 21 byte

6*<©·LJƵYS24S®-ì®-(èO
Emigna
sumber
@KevinCruijssen: Tentu. Saya berniat untuk mencoba dan bermain golf lebih banyak sebelum menambahkan penjelasan, tapi saya belum benar-benar punya waktu jadi ini dia :)
Emigna
Terima kasih! Dan saya tahu kebanyakan orang lebih suka golf dulu sebanyak mungkin sebelum menambahkan penjelasan, tetapi karena belum ada pembaruan untuk jawaban Anda dalam 15 + jam saya pikir saya hanya akan meminta penjelasan. :) Jawaban yang bagus, btw!
Kevin Cruijssen
2

Jelly , 19 byte

×6’µḤD€Ẏsḣ2ṫ€-4Ẏm2S

Cobalah online!

×6’µḤD€Ẏsḣ2ṫ€-4Ẏm2S Arguments: n (1-indexed)
×6                  Multiply by 6
  ’                 Decrement
   µ                Call that value N and start a new chain with argument N
    Ḥ               Double
      €             Create an inclusive range from 1 to 2N and call this link on it
     D               Get the decimal digits of each integer in the range
       Ẏ            Concatenate the lists of digits
        s           Split into length-N chunks
         ḣ2         Get the first two elements
            €-4     Map this link over the length-2 list with right argument -4
           ṫ         Get elements from this index onwards (supports negative indices too)
               Ẏ    Concatenate the two length-5 lists into one length-10 list
                m2  Take every second element starting from the first
                  S Sum
Erik the Outgolfer
sumber
Maukah Anda menambahkan penjelasan?
Kevin Cruijssen
@KevinCruijssen yakin, tapi saya biasanya melakukannya atas permintaan, kalau tidak saya fokus pada menjawab tantangan lain, melakukan hal-hal lain atau tidur: P
Erik the Outgolfer
1

J , 61, 58 57 byte

g=.3 :'+/".,_2(2{.{.)\,_5{."1(2{.(-.6*y)]\;":&.>1+i.9*y)'

Cobalah online!

Galen Ivanov
sumber
1

Ruby , 65 63 56 byte

->n{[2,4,6,4-n*=6,6-n].sum{|a|([*1..n*2]*'')[n-a].to_i}}

Cobalah online!

GB
sumber
1

Bersih , 138 101 byte

import StdEnv
$n=sum(tl[toInt([c-'0'\\i<-[1..],c<-:toString i]!!(6*i+j))\\i<-[2*n-1,n-1],j<-[4,0,2]])

Cobalah online!

Suram
sumber
1

Java 8, 138 111 109 byte

n->{String s="";int r=0,i=1;for(n=n*6-1;i<3*n;s+=i++);for(i=5;i>0;r+=s.charAt(n+n*(i%2^1)-i--)-48);return r;}

Tentu saja saya harus menjawab tantangan saya sendiri. :)
Saya kehilangan kode awal yang saya gunakan untuk membuat hasil tes dalam deskripsi tantangan, jadi saya baru saja memulai.

Penjelasan:

Cobalah online.

n->{                               // Method with integer as both parameter and return-type
  String s="";                     //  Temp String
  int r=0,                         //  Result-sum, starting at 0
      i=1;                         //  Index integer, starting at 1
  for(n=n*6-1;                     //  Replace the input with `n*6-1`
      i<3*n;                       //  Loop from 1 up to 3*n (exclusive)
      s+=i++);                     //   And append the temp-String with `i`
  for(i=5;i>0;                     //  Loop from 5 down to 0 (exclusive)
    r+=                            //   Add to the result-sum:
       s.charAt(               )-48);
                                   //    The character at index X, converted to a number,
                n+n*(i%2^1)-i--    //    with X being `n-i` (i=odd) or `n+n-i` (i=even)
  return r;}                       //  Return the result-sum
Kevin Cruijssen
sumber