Urutan Eksponensial


13

Tambang garam Polandia tertua , yang terletak di Bochnia *, dimulai pada tahun 1248, yang dapat kita anggap sebagai angka ajaib . Kita bisa melihat bahwa itu sama dengan 4 digit dari urutan eksponensial: 2 ^ 0, 2 ^ 1, 2 ^ 2, 2 ^ 3.

Karena tanggal sebenarnya 4 digit dari urutan, kita bisa membuatnya lebih lama. Kita bisa mengulangi prosesnya sampai kita mencapai tak terbatas. Urutannya akan terlihat seperti ini, jika kita batasi jumlahnya2048

124816326412825651210242048

Agar terlihat sedikit lebih baik, kita dapat memisahkan angka:

1|2|4|8|16|32|64|128|256|512|1024|2048

Mari kita coba urutan khusus yang lebih panjang dari tanggal. Katakanlah, kami ingin memiliki 5 digit - ada lebih dari satu kemungkinan:

  • 24816
  • 81632
  • 64128

Atau 3 digit:

  • 124
  • 248
  • 816

Kita juga bisa menambahkan angka 3 digit ini, tetapi katakanlah, bahwa suatu urutan harus memiliki setidaknya dua angka .

* Tidak ada informasi tentang ini di Wikipedia bahasa Inggris. Jika Anda memasukkan versi Polandia - maka ada. Jika Anda mengunjungi tambang, para pekerja juga akan memberi tahu Anda, bahwa itu dimulai pada 1248.

Tantangan

Buat urutan eksponensial seperti pada contoh di atas dengan 2 sebagai dasarnya.

Diberi angka dari rentang 2-27, output semua bagian yang mungkin dari urutan (2048 satu atau lebih besar jika Anda mau) dengan jumlah digit yang sama dengan input. Anda tidak dapat memotong angka, jadi hasilnya seperti481 tidak valid, karena 16 dipotong setengah.

Aturan:

  • Celah standar dilarang.
  • Anda dapat berasumsi bahwa input adalah angka di dalam rentang.
  • Program Anda dapat menerima input yang lebih besar dari kisaran (28+), tetapi itu tidak akan menambah / menurunkan skor.
  • Spasi dalam output diabaikan. Anda dapat menampilkan suka 124atau suka4 8 16 .
  • Kemungkinan yang berbeda harus dipisahkan oleh karakter apa pun dari daftar: ,./| atau umpan baris.
  • Anda dapat menampilkan sebagai array.
  • Setiap kemungkinan harus menyertakan setidaknya 2 nomor yang berbeda .
  • Anda harus menampilkan bagian dari urutan, Anda tidak dapat mencampur angka yang tidak bersebelahan, seperti:14 .
  • Output hardcoded tidak diizinkan, namun, Anda dapat membuat hardcode string / angka / array yang berisi urutan penuh.
  • Input 27 harus mengembalikan urutan 2048 penuh.
  • Seperti yang sudah disebutkan sebelumnya, jangan potong angka . Ex. 16harus tetap 16- Anda tidak dapat menggunakan 481- Anda harus menggunakan 4816.
  • EDIT: Saya mungkin mengatakan sesuatu yang salah di sana; 2048 adalah angka terakhir yang harus didukung oleh program Anda, Anda dapat menambahkan dukungan untuk int yang lebih besar.

Uji kasus

Memasukkan: 2

12, 24, 48

Memasukkan: 3

124, 248, 816

Memasukkan: 4

1248, 4816, 1632, 3264

Memasukkan: 5

24816, 81632, 64128

Memasukkan: 27

124816326412825651210242048

Dan kemudian angka ...

Jika saya membuat kesalahan dalam salah satu kasus uji, katakan padaku atau edit pertanyaannya.


Ini adalah , jadi kode terpendek dalam byte menang!


1
Jadi ini hanya dengan 2 sebagai dasarnya, benar? Bisakah Anda menjelaskannya dalam pertanyaan? Saya tidak yakin apakah itu tersirat oleh "Sequence of Exponentiations," tetapi bahkan jika itu, saya yakin ada orang di luar sana seperti saya yang tidak tahu itu.
cole

@cole Sebenarnya, ya, hanya dengan 2. Terima kasih telah menyebutkan!
RedClover

1
Bisakah output dipisahkan oleh baris baru?
H.PWiz

1
Jangan khawatir; seperti yang saya katakan, saya mendorongnya. Beberapa penulis tantangan bisa sangat fleksibel pada format output sehingga, demi satu atau dua byte, patut ditanyakan;) (Catatan: Itu tidak harus ditafsirkan sebagai saran!)
Shaggy

1
Dalam intro, Anda harus menggunakan huruf besar Bahasa Polandia. "semir" adalah kata bahasa Inggris yang berbeda .
Peter Cordes

Jawaban:


7

05AB1E , 12 11 10 byte

Mendukung urutan hingga 2^95 = 39614081257132168796771975168

₃ÝoŒʒg≠}Jù

Cobalah online!

Penjelasan

₃Ý            # push range [0 ... 95]
  o           # raise 2 to the power of each
   Œ          # get a list of all sublists
    ʒ         # filter, keep elements that satisfy:
     g        # length
      ≠       # false (not equal to 1)
       }      # end filter
        J     # join each
         ù    # keep numbers of length matching the input

Disimpan 1 byte berkat Erik the Outgolfer
Tersimpan 1 byte berkat Riley


X›bisa
Erik the Outgolfer

@EriktheOutgolfer: Oh yeah. Saya selalu lupa bahwa yang ada sekarang. Terima kasih :)
Emigna

Bisa Y₃Ýmmenjadi ₃Ýo?
Riley

@Riley: Yap. Saya pernah memiliki itu sebelumnya, tetapi untuk beberapa alasan saya pasti telah mengubahnya. Terima kasih :)
Emigna

Mencoba kode sekarang (sangat terlambat setelah tantangan berakhir) ... dan solusi Anda sepertinya mengembalikan berton-ton array kosong untuk saya ... Apakah saya melakukan sesuatu yang salah?
RedClover


4

Jelly ,  19 18  16 byte

Mungkin ada solusi yang lebih pendek sekarang bahwa kita dapat menggunakan cut-off apa pun (tidak hanya 2048), meskipun perubahan pada spesifikasi ini memungkinkan penghematan satu byte dari implementasi ini dengan beralih ke cut-off 32768. -
ya. ..

-2 bytes terima kasih kepada Erik the Outgolfer (penggunaan Vuntuk memungkinkan argumen benar implisit dari filter dan pengetatan) -
ya itu sangat mirip dengan yang tidak efisien sekarang; pergi upvote-nya !

⁴Ḷ2*Ẇṫ17VDL$⁼¥Ðf

Tautan monadik yang mengambil nomor dan mengembalikan daftar nomor.

Cobalah online!

Bagaimana?

⁴Ḷ2*Ẇṫ17VDL$⁼¥Ðf - Link: number, n        e.g. 3
⁴                - literal sixteen             16
 Ḷ               - lowered range               [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15]
  2              - literal two                 2
   *             - exponentiate                [1,2,4,8,16,32,...,32768]
    Ẇ            - all sublists                [[1],[2],...,[1,2],[2,4],...,[1,2,4],...]
      17         - literal seventeen           17
     ṫ           - tail from index             [[1,2],[2,4],...,[1,2,4],...]]
        V        - evaluate as Jelly code      [12,24,...,124,...]
              Ðf - filter keep:
             ¥   -   last two links as a dyad
           $     -     last two links as a monad:
         D       -       decimal list (of entry) (i.e. 816 -> [8,1,6] or 24 -> [2,4])
          L      -       length                  (i.e. 816 -> 3, or 24 -> 2)
            ⁼    -   equals (n)                  (i.e. 816 -> 1, or 24 -> 0)
                 - ...resulting in             [816, 124, 248]

1
Apakah ini terlalu mirip dengan milik Anda? (harap jujur: p)
Erik the Outgolfer

Lucunya Aku hanya mencoba untuk menggunakan Vdan itu akan bekerja selama 16 daripada 1000: ⁴Ḷ2*Ẇṫ17VDL$⁼¥Ðf.
Jonathan Allan

Aku paling sering pergi: p
Erik the Outgolfer

@EriktheOutgolfer mereka sekarang mungkin sama tetapi saya berpikir kita berdua harus menjaga mereka. Saya yakin Anda datang dengan Anda secara mandiri dan saya yakin saya akan menemukan trik eval juga (karena saya melihat persis seperti itu , hanya perlu melakukan chaining dengan benar).
Jonathan Allan

@EriktheOutgolfer Saya telah membuat asumsi Anda laki-laki, dan lebih suka disebut seperti itu, tetapi sebenarnya tidak tahu baik sebagai fakta; jangan beri tahu saya jika Anda lebih suka kata ganti yang berbeda!
Jonathan Allan


4

Japt , 22 20 19 16 byte

Mendukung input hingga 639tetapi kesenjangan mulai muncul dalam urutan setelahnya 234(Lihat daftar lengkap rentang input yang didukung di sini ). Menghasilkan array string.

IÆIo!²ãX m¬lUäc

Menguji

I(64) dapat diganti dengan L(100) tetapi kita akan masuk ke notasi ilmiah dan ketidakakuratan presisi. Memfilternya akan meningkatkan jumlah byte dan hanya meningkatkan input maksimum 736.

                     :Implicit input of integer U
I                    :64
 Æ                   :Map each X in [0,64)
  Io                 :  Range [0,64)
    !²               :  Raise 2 to the power of each
      ãX             :  Subsections of length X
         m           :  Map
          ¬          :    Join
           lU        :  Filter elements of length U
             Ã       :End map
              ¤      :Slice off the first 2 elements
               c     :Flatten


3

Sekam , 18 17 byte

Output dipisahkan oleh baris baru

fo=⁰LmṁsftQ↑12¡D1

Cobalah online!

Bagaimana?

           ↑12¡D1    The sequence [1,2,4...2048]
              ¡      Repeatedly apply function, collecting results in a list
               D     double
                1    initially applying to 1
           ↑12       Take the first 12 elements
          Q          Get all sublists
        ft           With a length greater than 1
     mṁs             Convert each list into a string, e.g [4,8,16] -> "4816"
fo=⁰L                Keep only those whose length is equal to the input

3

Jelly , 16 byte

ȷḶ2*ẆṫȷḊVDL$⁼¥Ðf

Cobalah online!

Catatan: sangat tidak efisien. Mengembalikan daftar angka.


Tio sepertinya tidak dapat menguraikan kode ini ... Selalu melebihi 60 detik ...
RedClover


1
@ Soaku itu bekerja secara teori - hanya keluar karena sangat tidak efisien.
Jonathan Allan

1
@ Soaku saya maksudkan pada komentar saya. Saya sudah menggantinya di sana, dan ada output [12, 24, 48].
Erik the Outgolfer

1
@ Soaku Mengapa tidak pergi paling jika Anda bisa tanpa biaya tambahan? ;)
Erik the Outgolfer

3

JavaScript (ES7), 102 100 byte

Mencetak semua sub-urutan yang cocok dengan alert().

l=>[...1e11+''].map((_,k,a)=>a.map((_,x)=>(s=(g=n=>x<=k|n<k?'':g(n-1)+2**n)(x)).length-l||alert(s)))

Demo

NB : Potongan ini buffering hasil dan mencetaknya ke konsol untuk ramah pengguna.


3

Haskell , 72 67 byte

f n=[s|i<-[0..99],j<-[i+1..99],s<-[show.(2^)=<<[i..j]],length s==n]

Cobalah online!

Disimpan 5 byte berkat Laikoni

Saya menggunakan batas 99karena 2^99memiliki panjang > 27.


Ini mengembalikan case ekstra untuk input 27 sekalipun.
Jonathan Allan

Anda dapat mengganti 99 dengan 11, sehingga menjadi lebih valid. Meskipun, saya tidak menyatakan bahwa angka> 2048 tidak valid. Saya hanya menyatakan, bahwa 2048 adalah kisaran minimum .
RedClover

@ Jonathan Allan Saya pikir itu masih benar: "Yang 2048 satu atau lebih besar jika Anda mau" Saya mengambil urutan 633825300114114700748351602688, karena itu menjamin bahwa tidak akan ada solusi lain (dalam kisaran 2-27). Sebenarnya, saya pikir batas 45 akan cukup, karena length$(show$2^44)++(show$2^45)==28.
jferard

@ jferard yang sebenarnya diedit setelah jawaban Anda (sebenarnya menyatakan "terbatas pada 2048" sebelumnya). Saya dapat mempersingkat milik saya dalam hal ini juga.
Jonathan Allan

1
@ JonathanAllan Ya, saya benar-benar menyadari bahwa beberapa aturan dalam pertanyaan itu salah dan menyesatkan setelah memposting anwer ini.
RedClover

2

Mathematica, 122 byte

(s=#;FromDigits@F[f/@#]&/@Select[Subsequences[Array[2^#&,99,0]],l@#>1&&(l=Length)@(F=Flatten)[(f=IntegerDigits)/@#]==s&])&  


Memasukkan

[27]

Keluaran

{879129 lebih banyak lagi untuk-lebih banyak lagi ...

Input [1000]
Output  1441151880758558722882303761517117445764607523034234881152921504606846976230584300921369395246116860184273879049223372036854775808184467440737095516163689348814741910323273786976294838206464147573952589676412928295147905179352825856590295810358705651712118059162071741130342423611832414348226068484722366482869645213696944473296573929042739218889465931478580854784377789318629571617095687555786372591432341913615111572745182864683827230223145490365729367654460446290980731458735308812089258196146291747061762417851639229258349412352483570327845851669882470496714065569170333976494081934281311383406679529881638685626227668133590597632773712524553362671811952641547425049106725343623905283094850098213450687247810566189700196426901374495621121237940039285380274899124224247588007857076054979824844849517601571415210995964968969903520314283042199192993792198070406285660843983859875843961408125713216879677197516879228162514264337593543950336158456325028528675187087900672316912650057057350374175801344

2

C, 170 byte

i,j;f(n){char t[99],s[12][5]={"1"};for(i=j=1;i<12;)sprintf(s+i++,"%d",j*=2);for(i=0;i<12;++i,strlen(t)-n||j>1&&puts(t))for(j=*t=0;strlen(t)<n&&j+i<12;)strcat(t,s+i+j++);}

Cobalah online!

Belum dibuka:

i,j;
f(n)
{
    char t[99], s[12][5] = {"1"};
    for (i=j=1; i<12;)
        sprintf(s+i++, "%d", j*=2);
    for (i=0; i<12; ++i, strlen(t)-n || j>1 && puts(t))
        for (j=*t=0; strlen(t)<n && j+i<12;)
            strcat(t, s+i+j++);
}



1

Japt, 24 byte

Jangan kecewa

Sekarang saya menyadari bahwa ini adalah cara yang sama untuk melakukan ini seperti yang dilakukan @ Shaggy, hanya sedikit bermain golf. (Haruskah saya menghapus jawabannya?)

Setelah beberapa lama sejak memposting pertanyaan ini, saya belajar bahasa golf pertama saya. Karena ini, saya memutuskan untuk mencoba keberuntungan saya di sini.

2oI,@IÆ2pYÃãX ®q
c f_Ê¥N

Cobalah online!

Skornya bukan yang terbaik, bahkan tidak baik, tetapi butuh banyak waktu untuk melakukan ini .-.

Saya kehilangan banyak skor, karena untuk beberapa alasan, ã hanya dapat mengembalikan array panjang x ... Bisa jadi bahkan ~ 10 byte, jika tidak.

Penjelasan:

2oI,@IÆ2pYÃãX ®q # All 2^ combinations:
2oI              # Range 2-64
   ,@            # Map (X as index)
     IÆ          #   Range 0-64, map (Y as index)
       2pY       #   2^Y
          Ã      #   End function (map)
                 #   this = array of powers.
           ãX    #   All combinations with X length
              ®q # Join then (arrays to numbers)

c f_Ê¥N          # Filter length to input:
c                # Flatten
  f_             # Filter
    Ê            #  Length
     ¥           #  ==
      N          #  Parsed input

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.