Kejadian pertama dalam urutan Sixers

17

The Sixers urut adalah nama yang bisa diberikan kepada urutan A087409 . Saya belajar tentang urutan ini dalam video Numberphile , dan itu dapat dibangun sebagai berikut:

Pertama, ambil kelipatan 6, yang ditulis dalam basis 10:

6, 12, 18, 24, 30, 36, ...

Selanjutnya, gabungkan angka-angka ke dalam aliran digit:

61218243036...

Akhirnya, kelompokkan aliran menjadi pasangan dan tafsirkan masing-masing sebagai bilangan bulat:

61, 21, 82, 43, 3, ...

Saat kita mengelompokkan angka menjadi pasangan, angka maksimum dalam urutan akan menjadi 99, dan ternyata semua bilangan bulat non-negatif kurang dari 100 diwakili dalam urutan. Tantangan ini adalah untuk menemukan indeks dari nomor pertama dalam urutan Sixers.

Memasukkan

Bilangan bulat dalam kisaran [0-99]. Anda tidak perlu menghitung angka di luar rentang ini, dan solusi Anda dapat memiliki perilaku apa pun jika input seperti itu diberikan.

Keluaran

Indeks kemunculan pertama nomor input dalam urutan Sixers. Ini mungkin 0 atau 1 diindeks; tolong katakan yang Anda gunakan dalam jawaban Anda.

Aturan

  • Prosedur untuk menghasilkan urutan yang tercantum dalam pendahuluan adalah hanya untuk tujuan ilustrasi, Anda dapat menggunakan metode apa pun yang Anda suka asalkan hasilnya sama.
  • Anda dapat mengirimkan program atau fungsi lengkap.
  • Setiap metode input dan output yang masuk akal diizinkan.
  • Celah standar tidak diijinkan.
  • Tautan untuk menguji kode Anda daring sangat disarankan!
  • Ini , jadi jawaban tersingkat di setiap bahasa menang!

Uji kasus

Berikut adalah daftar semua input dan output, dalam format input, 0-indexed output, 1-indexed output.

0   241 242
1   21  22
2   16  17
3   4   5
4   96  97
5   126 127
6   9   10
7   171 172
8   201 202
9   14  15
10  17  18
11  277 278
12  20  21
13  23  24
14  19  20
15  29  30
16  32  33
17  297 298
18  35  36
19  38  39
20  41  42
21  1   2
22  46  47
23  69  70
24  6   7
25  53  54
26  22  23
27  11  12
28  62  63
29  219 220
30  65  66
31  68  69
32  71  72
33  74  75
34  49  50
35  357 358
36  80  81
37  83  84
38  25  26
39  89  90
40  92  93
41  27  28
42  42  43
43  3   4
44  101 102
45  104 105
46  8   9
47  177 178
48  110 111
49  13  14
50  28  29
51  119 120
52  122 123
53  417 418
54  79  80
55  128 129
56  131 132
57  134 135
58  55  56
59  437 438
60  140 141
61  0   1
62  31  32
63  75  76
64  5   6
65  120 121
66  82  83
67  10  11
68  161 162
69  164 165
70  58  59
71  477 478
72  170 171
73  173 174
74  34  35
75  179 180
76  182 183
77  497 498
78  85  86
79  188 189
80  191 192
81  18  19
82  2   3
83  78  79
84  93  94
85  7   8
86  37  38
87  168 169
88  12  13
89  228 229
90  88  89
91  218 219
92  221 222
93  224 225
94  64  65
95  557 558
96  230 231
97  233 234
98  40  41
99  239 240
Sok
sumber
6
Mungkin berguna untuk mengetahui bahwa pertimbangan 6, 2*6, 3*6,..., 325*6sudah cukup untuk menghasilkan semua nilai yang mungkin
Luis Mendo
@LuisMendo Anda benar, saya berdebat apakah akan memasukkan itu ke dalam deskripsi tantangan. Sebuah komentar adalah tempat yang baik untuk itu juga: o)
Sok
Bisakah kita mengambil input-bilangan bulat sebagai string, dengan yang empuk dengan terkemuka 0 (yaitu , , , ...)? n<10000102
Kevin Cruijssen
10
@KevinCruijssen Hmmm, input sebagai string baik-baik saja, tetapi meninggalkan padding dengan 0 agak terlalu jauh IMO.
Sok

Jawaban:

12

JavaScript (ES6),  71 65  55 byte

Output diindeks 0.

n=>(g=([a,b,...c])=>b?a+b-n&&1+g(c):g([a]+6*++i))(i='')

Cobalah online!

Bagaimana?

Dengan menggunakan fungsi rekursif, kami dapat 'mengonsumsi' 2 karakter pertama dari string kelipatan gabungan dari 6 , atau menambahkan karakter baru jika kami memiliki kurang dari 2 karakter.

Contoh untuk n=3 :

 string | operation                          | result
--------+------------------------------------+--------
 ''     | not enough characters: append '6'  |   0
 '6'    | not enough characters: append '12' |   0
 '612'  | consume '61', increment the result |   1
 '2'    | not enough characters: append '18' |   1
 '218'  | consume '21', increment the result |   2
 '8'    | not enough characters: append '24' |   2
 '824'  | consume '82', increment the result |   3
 '4'    | not enough characters: append '30' |   3
 '430'  | consume '43', increment the result |   4
 '0'    | not enough characters: append '36' |   4
 '036'  | consume '03': success              |   4

Berkomentar

n => (             // n = input
  g = (            // g is a recursive function taking either a string or an array of
                   // characters split into:
    [a, b,         //   a = 1st character, b = 2nd character,
           ...c]   //   c[] = array of all remaining characters
  ) =>             //
    b ?            // if b is defined:
      a + b - n && //   if n subtracted from the concatenation of a and b is not zero:
        1 + g(c)   //     add 1 to the final result and do a recursive call with c[]
                   //   (otherwise: yield 0 and stop recursion)
    :              // else:
      g(           //   do a recursive call with:
        [a] +      //     the concatenation of a (forced to an empty string if undefined)
        6 * ++i    //     and 6 * i, with i pre-incremented
      )            //   end of recursive call
)(i = '')          // initial call to g with an empty string,
                   // and i set to empty string as well (zero'ish)
Arnauld
sumber
12

Python 2 , 93 92 85 83 81 68 65 59 byte

f=lambda n,s='612',i=18:n-int(s[:2])and-~f(n,s[2:]+`i`,i+6)

Cobalah online!


  • -2 byte, terima kasih kepada Grimy
  • -3 byte, terima kasih kepada ArBo
  • -6 byte, terima kasih kepada xnor
TFeld
sumber
1
3 byte lebih pendek dari lambda:f=lambda n,s='612',i=3:n-int(s[:2])and f(n,s[2:]+`i*6`,i+1)or i-2
ArBo
@ ArBo Bahkan lebih baik, f=lambda n,s='612',i=18:n-int(s[:2])and-~f(n,s[2:]+`i`,i+6)(0-diindeks).
xnor
8

Perl 6 , 31 byte

{+(comb(2,[~] 1..ⅮX*6)...$_)}

Cobalah online!

Menggunakan urutan 1-diindeks.

Penjelasan:

{                            } # Anonymous code block
              1..Ⅾ             # The range 1 to 500
                   X*6         # All multiplied by 6
          [~]                  # Join as one giant string
   comb(2,            )        # Split into pairs of characters
                       ...$_   # Take up to the input
 +(                         )  # And return the length of the list
Jo King
sumber
7

Haskell , 82 ... 65 58 54 byte

k$show=<<[6,12..]
k(a:b:c)t|read[a,b]==t=0|let=1+k c t

Cobalah online!

FrownyFrog
sumber
5

05AB1E , 9 byte

₄L6*J2ôIk

Diindeks 0. Menerima bilangan bulat tunggal, atau daftar bilangan bulat sebagai input.

Cobalah secara online atau verifikasi semua kasus uji .

Penjelasan:

L         # Create a list in the range [1,1000]
  6*       # Multiply each value by 6
    J      # Join the entire list of integers together to a string
     2ô    # Split into parts of size 2
       Ik  # Get the index of the input integer(s)
           # (and output the result implicitly)
Kevin Cruijssen
sumber
Apakah perilaku default untuk bergabung sebagai string, atau apakah ada operator terpisah untuk bergabung sebagai string dan bergabung sebagai angka?
Maks
@maxb Secara keseluruhan 05AB1E tidak memerlukan konversi eksplisit. Semua bilangan bulat juga dapat digunakan untuk fungsi string seperti ganti atau pisahkan, dan semua string yang dibuat (yang bilangan bulat) juga dapat digunakan sebagai angka. Jadi 100,, "100"dan 100.0sama untuk sebagian besar fungsi seperti pemeriksaan yang sama dan semacamnya. Masih ada fungsi cast to int dan cast to string di 05AB1E untuk beberapa fungsionalitas, seperti pengurutan (numeric vs lexicographic sorting), atau untuk menghilangkan angka desimal setelah koma dari float saat casting ke int, tetapi mereka tidak sering menggunakannya. .
Kevin Cruijssen
@maxb Tip 05AB1E yang relevan memberikan beberapa contoh tambahan.
Kevin Cruijssen
4

Arang , 12 byte

I⌕I⪪⭆φ×⁶⊕ι²N

Cobalah online! Tautan adalah untuk mengucapkan versi kode. Diindeks 0. Penjelasan:

     φ           Predefined constant 1000
    ⭆           Map over implicit range and join
        ι       Current index
       ⊕        Incremented
     ×⁶         Multiplied by 6
   ⪪      ²     Split into pairs of digits
  I             Cast to integer
           N    Input as a number
 ⌕              Find its index
I               Cast to string
                Implicitly print
Neil
sumber
4

J , 29 26 byte

-3 byte terima kasih kepada FrownyFrog!

i.~_2(".\;)6<@":@*1+i.@325

Cobalah online!

Berbasis 0

Galen Ivanov
sumber
1
i.~_2(".\;)6<@":@*1+i.@325
FrownyFrog
@FrownyFrog Terima kasih! Penggunaan tinju yang bagus!
Galen Ivanov
4

APL (Dyalog Unicode) , 26 byte

{⍵⍳⍨⍎¨((≠\=⍨)⊂⊢)∊⍕¨6×⍳325}

Cobalah online! - Tes untuk semua input yang valid.

Bagaimana:

{⍵⍳⍨⍎¨((≠\=⍨)⊂⊢)∊⍕¨6×⍳325}  Dfn, input is ⍵.
                    6×⍳325   Generates the first 325 multiples of 6.
                  ⍕¨         Format each number into a string
                            Enlist, flattens the vector
       (      ⊂⊢)            Dyadic enclose, takes a boolean mask as left argument
        (≠\=⍨)               Generates the mask 1 0 1 0...
                             Enclose then returns the Sixers sequence as a string
     ⍎¨                      Execute each element in the string, turning it into a numeric vector
 ⍵⍳⍨                         Find the first occurrence of  in the vector
J. Sallé
sumber
dapatkah Anda membentuk kembali vektor yang diratakan seperti di K? Google menyarankan tetapi APL membuatku takut ...
streetster
@streetster ya, adalah pembentukan kembali APL. Jadi jika Anda ingin membentuk ulang vektor yang rata, Anda hanya perlu melakukannya<new shape vector> ⍴ <vector to reshape>
J. Sallé
jadi bisakah Anda menggunakan membentuk kembali untuk membuat daftar 2xN dan kemudian mengkonversi masing-masing ke integer?
streetster
Anda bisa, tetapi saya rasa itu tidak lebih pendek dari jawaban saya saat ini. Satu masalah adalah, untuk jawaban saya, membentuk kembali string menjadi matriks 1117 × 2 dan kemudian mengkonversi ke bilangan bulat akan membuat vektor dengan 1117, bilangan bulat satu digit. Lihat perbedaan antara metode yang saya gunakan versus pembentukan kembali
J. Sallé
Ah, string saya yang pipih akan dibentuk kembali menjadi sesuatu yang lebih bisa dikerjakan :)
streetster
3

Python 3 , 87 81 Bytes:

lambda n:[*zip(*[iter(''.join(map(str,range(6,1951,6))))]*2)].index((*'%02d'%n,))

input integer, output 0-diindeks.

Cobalah online!


-6 byte, terima kasih kepada @TFeld.

MrGeek
sumber
3

Brachylog , 14 byte

;İS∧⟦×₆ᵐcġ₂iSt

Cobalah online!

Terlalu lambat untuk uji kasus dengan output yang lebih besar.

Erik the Outgolfer
sumber
3

R , 75 62 byte

-13 byte terima kasih kepada Giuseppe.

match(scan(,''),substring(Reduce(paste0,3*(a=2*1:999)),a-1,a))

Cobalah online!

Robin Ryder
sumber
2

MathGolf , 10 byte

•╒6*y░2/i=

Cobalah online!

Pada dasarnya sama dengan jawaban 05AB1E, tapi saya kehilangan satu byte karena harus mengubah angka yang telah digabungkan menjadi string secara eksplisit.

Penjelasan

•╒             push [1, 2, ..., 512]
  6*           multiply by 6
    y          join array without separator to string or number
     ░         convert to string (implicit map)
      2/       split into groups of 2 characters
        i      convert to integer (implicit map)
         =     find index of implicit input in the array
maks
sumber
2

C # (Visual C # Interactive Compiler) , 123 byte 115 byte

a=>m.First(y=>int.Parse(string.Join("",m.Select((x,i)=>++i*6)).Substring(y*2,2))==a);var m=Enumerable.Range(0,640);

Cobalah online!

Data Kedaluwarsa
sumber
Saya pikir ada bug di solusi Anda di suatu tempat, seperti f(61)seharusnya kembali 0(sepertinya solusi Anda 0-diindeks)
Sok
1
Terima kasih @sok harus diperbaiki sekarang
Data Kedaluwarsa
2

K (oK) , 22 byte

Larutan:

(.:'0N 2#,/$6*1+!999)?

Cobalah online!

Penjelasan:

Diindeks 0.

(.:'0N 2#,/$6*1+!999)? / the solution
                     ? / lookup right in left
(                   )  / do this together
                !999   / range 0..999
              1+       / add 1, range 1...1000
            6*         / multiply by 6, 6...6000
           $           / convert to strings
         ,/            / flatten
    0N 2#              / reshape into 2xN
 .:'                   / value each, convert to numbers
streetster
sumber
2

Jelly , 10 byte

ȷ×€6DFs2Ḍi

Cobalah online!

TIO link memberikan semua nilai untuk 0 hingga 99.

Penjelasan

ȷ          | 1000
 ×€6       | each times 6 (using implicit range from 1..1000)
    D      | Convert to decimal digits
     F     | Flatten
      s2   | Split into pairs
        Ḍ  | Convert back from decimal digits to integer
         i | Find index of left argument to link
Nick Kennedy
sumber
2

Java 10, 119 104 102 byte

n->{int i=2;for(var s="612";!s.substring(0,2).equals(""+n/10+n%10);)s=s.substring(2)+6*++i;return~-i;}

Port dari jawaban Python 2 @TFeld .
-2 byte terima kasih kepada @Imus .

1-diindeks.

Cobalah online.

Penjelasan:

n->{                            // Method with integer as both parameter and return-type
  int i=2;                      //  Index-integer, starting at 2
  for(var s="612";              //  String, starting at "612"
      !s.substring(0,2)         //  Loop as long as the first two characters of the String
       .equals(                 //  Are not equal to:
               ""+n/10          //   The input integer-divided by 10 as String
               +n%10);)         //   Concatenated with the input modulo-10
                                //   (which will add leading 0s for inputs < 10)
    s=s.substring(2)            //   Remove the first two characters of the String
      +6*++i;                   //   And append 6 times `i`,
                                //   after we've first increased `i` by 1 with `++i`
return~-i;}                     //  Return `i-1` as result

Versi asli 119 117 byte:

n->{var s="";for(int i=0;i<2e3;)s+=i+=6;return java.util.Arrays.asList(s.split("(?<=\\G..)")).indexOf(""+n/10+n%10);}

Diindeks 0.

Cobalah online.

Penjelasan:

n->{                            // Method with integer as both parameter and return-type
  var s="";                     //  String we're building, starting empty
  for(int i=0;i<2e3;)           //  Loop `i` in the range [0, 2000):
      s+=i+=6;                  //   Increase `i` by 6 first every iteration
                                //   And then append the updated `i` to String `s`
  return java.util.Arrays.asList(
          s.split("(?<=\\G..)") //  Split the String in parts of size 2 (as array)
         )                      //  Convert the array to a List
          .indexOf(             //  And get the index of the following in this list:
                   ""+n/10      //   The input integer-divided by 10 as String
                   +n%10);}     //   Concatenated with the input modulo-10
Kevin Cruijssen
sumber
1
Anda dapat menyimpan 2 byte dengan menggunakan "" + n / 10 + n% 10 bukannya n> 9? N + "": "0" + n
Imus
1

CJam , 17 byte

325,:)6f*s2/:~ri#

Cobalah online!

Berbasis 0.

Penjelasan

325,   e# Range [0 1 2 ... 324]
:)     e# Add 1 to each: gives [1 2 3 ... 325]
6f*    e# Multiply each by 6: gives [6 12 18 ... 1950]
s      e# Convert to string: gives "61218...1950"
2/     e# Split into chunks of size 2: gives ["61" "21" ... "95" "0"]
       e# Note how the last chunk has size 1; but it is not used
:~     e# Evaluate each string in that array: gives [61 21 ... 95 0]
ri     e# Read input as an integer
#      e# Index of fist occurrence, 0-based
Luis Mendo
sumber
Karena penasaran, mengapa CJam memiliki builtin untuk semua bilangan bulat dalam jangkauan [10,20], serta lima builtin berbeda yang semuanya default ke string kosong "", tetapi tidak ada builtin untuk100 atau 1000?
Kevin Cruijssen
@KevinCruijssen Tidak yakin ... Tetapi memiliki variabel dengan nilai yang telah ditentukan seperti 0atau ""kadang-kadang berguna untuk loop, karena itu sering merupakan nilai awal yang diinginkan. Mengenai tidak memiliki 100atau 1000, ya, saya setuju mereka akan lebih bermanfaat daripada mengatakan 18atau19
Luis Mendo
1
Sayang sekali bahwa angka nol di depan menyebalkan, jika tidak, Anda dapat membuang :~dan idari kode Anda. :(
Erik the Outgolfer
1

Japt , 12 byte

Diindeks 0.

L²õ*6 ¬ò b¥U

Cobalah atau uji semua input

L²õ*6 ¬ò b¥U     :Implicit input of integer U
L                :100
 ²               :Squared
  õ              :Range [1,L²]
   *6            :Multiply each by 6
      ¬          :Join to a string
       ò         :Split to array of strings each of length 2
         b       :First 0-based index of
          ¥U     :Test for equality with U (bU wouldn't work here as each string would first need to be cast to an integer, costing more bytes)
Shaggy
sumber
1

Merah , 97 94 byte

func[n][(index? find/skip rejoin collect[repeat i 325[keep i * 6]]pad/left/with n 2 #"0"2)/ 2]

Cobalah online!

Galen Ivanov
sumber
1

Perl 5 -MList::Util=any -ap , 50 byte

$\=0,$b.=6*++$,while!any{++$\;"@F"==$_}$b=~/../g}{

Cobalah online!

Output berbasis 1

Xcali
sumber
1

Retina , 83 77 byte

Saya benar-benar tidak berlatih pemrograman rumit di Retina, tapi saya puas dengan panjangnya saya berhasil melakukannya.

Menghasilkan hasil yang diindeks 0.

.+
6*1
325+-1%`1+
$0¶6*1$0
1+
$.0
¶

L`..
m`^0

$
¶$+
s`\b(\d+)\b.*\b\1$

C`¶

Cobalah secara Online


Penjelasan

.+                   Replace the input with 6 in unary
6*1
325+-1%`1+           Do 325 times: append line with previous + 6
$0¶6*1$0
1+                   Convert all lines to decimal
$.0
¶                    Remove line breaks

L`..                 List pairs of digits
m`^0                 Remove leading zeros

$                    Append the original input N on a new line
¶$+
s`\b(\d+)\b.*\b\1$   Remove occurrences of N and anything in between

C`¶                  Count the number of line breaks
mbomb007
sumber
1

Swift 5 / Xcode 10.2.1 , 140 134 133 byte

let s=sequence(first:6){$0+6}.lazy.map{String($0)}.joined();return(0...).first{$0%2==0&&Int(String(s.dropFirst($0).prefix(2)))==n}!/2

Cobalah online!

Roman Podymov
sumber
1

Retina 0.8.2 , 36 byte

^
2406$*_
_{6}
$.`
^0(..)+?.*\1$
$#1

Cobalah online! Tautan termasuk test suite. 1-diindeks. Penjelasan:

^
2406$*_

Awalan 2406 _s ke input.

_{6}
$.`

Ganti setiap 6 _detik dengan jumlah sebelumnya _. Ini menghasilkan urutan 0, 6, 12... 2400, tetapi secara otomatis merangkai angka.

^0(..)+?.*\1$

Lewati awalan 0 dan temukan pasangan digit pertama yang cocok dengan dua digit terakhir yaitu input nol-empuk (karena string berakhir 0; pada kenyataannya test suite menggunakan fakta bahwa itu berakhir 00).

$#1

Keluarkan jumlah pasangan digit hingga dan termasuk kecocokan.

Retina 1 menyimpan beberapa byte karena operator pengulangan senarnya lebih pendek satu byte dan sudah default _sebagai operan tangan kanannya, sehingga baris kedua kode menjadi adil 2406*. Fitur lain dari Retina 1 adalah dan dikalikan dengan 6 dalam substitusi. Hebatnya, ini juga tidak mempengaruhi jumlah byte keseluruhan, karena hasil akhirnya terlihat seperti ini:> pengubah yang menghasilkan substitusi dalam konteks pemisah setelah pertandingan, yang dalam kasus$.>` penyebabnya termasuk panjang pertandingan dalam hasil. Meskipun ini membutuhkan biaya satu byte, kami segera menyimpannya karena kami tidak perlu mencocokkannya0 . (Pengulangan juga harus dikurangi dengan 6.) Retina 1 juga dapat melakukan aritmatika dasar dalam substitusi. Ini berarti bahwa kita tidak perlu menggunakan trik untuk mengambil kelipatan 6, melainkan kita hanya menghasilkan angka1..400

^
400*
_
$.(6*$>`
^(..)+?.*\1$
$#1
Neil
sumber
1

Bash , 80 byte

1-diindeks.

dc<<<6[p6+lax]salax|sed 's/./\n&/g;s/\n//'|sed 'N;s/\n//'|sed -n "/^0*$1$/{=;q}"

Cobalah online!

jnfnt
sumber
1

Clojure, 102 byte

#(count(for[i(partition 2(for[i(range 1 326)c(str(* i 6))]c)):while(not=(seq(str(if(< % 10)0)%))i)]i))

Sangat lama! :(

NikoNyrh
sumber