Xuất hiện đầu tiên trong chuỗi Sixers


17

Chuỗi Sixers là một tên có thể được đặt cho chuỗi A087409 . Tôi đã tìm hiểu về chuỗi này trong một video Numberphile và nó có thể được xây dựng như sau:

Đầu tiên, lấy bội số của 6, được viết trong cơ sở 10:

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

Tiếp theo, nối các số thành một dòng chữ số:

61218243036...

Cuối cùng, tập hợp lại luồng thành các cặp và diễn giải từng luồng như một số nguyên:

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

Khi chúng ta nhóm các số thành cặp, số tối đa trong chuỗi sẽ là 99 và hóa ra tất cả các số nguyên không âm dưới 100 được biểu diễn trong chuỗi. Thử thách này là tìm chỉ số của phiên bản đầu tiên của một số trong chuỗi Sixers.

Đầu vào

Một số nguyên trong phạm vi [0-99]. Bạn không cần tính đến các số ngoài phạm vi này và giải pháp của bạn có thể có bất kỳ hành vi nào nếu đầu vào như vậy được đưa ra.

Đầu ra

Chỉ số xuất hiện đầu tiên của số đầu vào trong chuỗi Sixers. Điều này có thể là 0- hoặc 1 chỉ mục; hãy nói rằng bạn đang sử dụng câu trả lời của bạn.

Quy tắc

  • Quy trình tạo chuỗi được ghi chú trong phần giới thiệu chỉ nhằm mục đích minh họa, bạn có thể sử dụng bất kỳ phương pháp nào bạn muốn miễn là kết quả giống nhau.
  • Bạn có thể gửi các chương trình hoặc chức năng đầy đủ.
  • Bất kỳ phương pháp hợp lý của đầu vào và đầu ra đều được cho phép.
  • Sơ hở tiêu chuẩn là không được phép.
  • Liên kết để kiểm tra mã của bạn trực tuyến được khuyến khích!
  • Đây là , vì vậy câu trả lời ngắn nhất trong mỗi ngôn ngữ sẽ thắng!

Các trường hợp thử nghiệm

Dưới đây là danh sách tất cả đầu vào và đầu ra, ở định dạng 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

6
Có thể hữu ích khi biết rằng xem xét 6, 2*6, 3*6,..., 325*6là đủ để tạo ra tất cả các giá trị có thể
Luis Mendo

@LuisMendo Bạn nói đúng, tôi đang tranh luận liệu có nên đưa nó vào phần mô tả thử thách hay không. Một bình luận cũng là một nơi tốt cho nó: o)
Sok

Chúng ta có thể lấy đầu vào-nguyên như chuỗi, với những người đệm với một hàng đầu 0 (tức là , , , ...)? n<10000102
Kevin Cruijssen

10
@KevinCruijssen Hmmm, đầu vào dưới dạng một chuỗi là tốt, nhưng phần đệm trái với 0 thì hơi quá IMO.
Sok

Câu trả lời:


12

JavaScript (ES6),  71 65  55 byte

Đầu ra là 0-index.

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

Hãy thử trực tuyến!

Làm sao?

Sử dụng hàm đệ quy, chúng ta sẽ 'tiêu thụ' 2 ký tự đầu tiên của chuỗi bội số 6 nối hoặc nối thêm các ký tự mới nếu chúng ta có ít hơn 2 ký tự.

Ví dụ cho 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

Đã bình luận

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)

12

Trăn 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)

Hãy thử trực tuyến!


  • -2 byte, nhờ Grimy
  • -3 byte, nhờ ArBo
  • -6 byte, nhờ xnor

1
3 byte ngắn hơn như 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 Thậm chí tốt hơn, f=lambda n,s='612',i=18:n-int(s[:2])and-~f(n,s[2:]+`i`,i+6)(0 chỉ mục).
xnor

8

Perl 6 , 31 byte

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

Hãy thử trực tuyến!

Sử dụng trình tự 1 chỉ mục.

Giải trình:

{                            } # 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


5

05AB1E , 9 byte

₄L6*J2ôIk

Chỉ số 0. Chấp nhận một số nguyên duy nhất hoặc danh sách các số nguyên làm đầu vào.

Hãy thử trực tuyến hoặc xác minh tất cả các trường hợp thử nghiệm .

Giải trình:

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)

Là hành vi mặc định để tham gia dưới dạng chuỗi hoặc có các toán tử riêng biệt để tham gia dưới dạng chuỗi và tham gia dưới dạng số?
maxb

@maxb Nhìn chung 05AB1E không cần bất kỳ chuyển đổi rõ ràng nào. Tất cả các số nguyên cũng có thể được sử dụng cho các hàm chuỗi như thay thế hoặc phân tách và tất cả các chuỗi được tạo (là số nguyên) cũng có thể được sử dụng làm số. Vì vậy 100, "100"100.0giống nhau cho hầu hết các chức năng như kiểm tra bằng nhau và như vậy. Vẫn còn các chức năng chuyển thành int và cast thành chuỗi trong 05AB1E cho một số chức năng, như sắp xếp (sắp xếp số và từ vựng) hoặc để xóa các chữ số thập phân sau dấu phẩy từ dấu phẩy khi truyền sang int, nhưng chúng không được sử dụng thường xuyên .
Kevin Cruijssen

@maxb Mẹo 05AB1E có liên quan đưa ra một số ví dụ bổ sung.
Kevin Cruijssen

4

Than , 12 byte

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

Hãy thử trực tuyến! Liên kết là phiên bản dài dòng của mã. Chỉ số 0. Giải trình:

     φ           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


4

APL (Dyalog Unicode) , 26 byte

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

Hãy thử trực tuyến! - Kiểm tra tất cả các đầu vào hợp lệ.

Làm sao:

{⍵⍳⍨⍎¨((≠\=⍨)⊂⊢)∊⍕¨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

bạn có thể định hình lại vectơ phẳng như bạn có thể trong K không? Google gợi ý nhưng APL làm tôi sợ ...
streetster

@streetster vâng, là định hình lại của APL. Vì vậy, nếu bạn muốn định hình lại một vectơ phẳng, bạn chỉ cần làm<new shape vector> ⍴ <vector to reshape>
J. Sallé

Vì vậy, bạn có thể sử dụng định hình lại để tạo danh sách 2xN và sau đó chuyển đổi từng thành số nguyên?
streetster

Bạn có thể, nhưng tôi không nghĩ rằng nó sẽ ngắn hơn câu trả lời hiện tại của tôi. Một vấn đề sẽ là, đối với câu trả lời của tôi, việc định hình lại chuỗi thành ma trận 1117 × 2 và sau đó chuyển đổi sang số nguyên sẽ tạo ra một vectơ với 1117, số nguyên một chữ số. Xem sự khác biệt giữa phương pháp tôi đang sử dụng so với định hình lại
J. Sallé

Ah, chuỗi phẳng của tôi được định hình lại thành một cái gì đó khả thi hơn :)
streetster


3

Ngôn ngữ Wolfram (Mathicala) , 74 byte

#&@@Position[FromDigits/@Flatten@IntegerDigits[6Range@365]~Partition~2,#]&

Hãy thử trực tuyến!

2 byte được lưu từ @Expired Data



Tôi đã làm việc với điều này trước khi tôi thấy bạn .. đã hợp nhất chúng và nhận được 77 byte
Dữ liệu hết hạn

@ExpiredData đẹp. 74 byte bây giờ
J42161217



2

MathGolf , 10 byte

•╒6*y░2/i=

Hãy thử trực tuyến!

Về cơ bản giống như câu trả lời 05AB1E, nhưng tôi mất một byte bằng cách chuyển đổi số được nối thành chuỗi một cách rõ ràng.

Giải trình

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


2

C # (Trình biên dịch tương tác Visual C #) , 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);

Hãy thử trực tuyến!


Tôi nghĩ rằng có một lỗi trong giải pháp của bạn ở đâu đó, như f(61)sẽ quay trở lại 0(có vẻ như giải pháp của bạn là 0-index)
Sok

1
Cảm ơn @sok nên được sửa ngay bây giờ
Dữ liệu hết hạn

2

K (oK) , 22 byte

Giải pháp:

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

Hãy thử trực tuyến!

Giải trình:

Chỉ số 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

2

Thạch , 10 byte

ȷ×€6DFs2Ḍi

Hãy thử trực tuyến!

Liên kết TIO cung cấp tất cả các giá trị từ 0 đến 99.

Giải trình

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

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

Cổng câu trả lời Python 2 của @TFeld .
-2 byte nhờ @Imus .

1 chỉ mục.

Hãy thử trực tuyến.

Giải trình:

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

Phiên bản gốc 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);}

Chỉ số 0.

Hãy thử trực tuyến.

Giải trình:

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

1
Bạn có thể lưu 2 byte bằng cách sử dụng "" + n / 10 + n% 10 thay vì n> 9? N + "": "0" + n
Imus

1

CJam , 17 byte

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

Hãy thử trực tuyến!

Dựa trên 0

Giải trình

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

Vì tò mò, tại sao CJam lại tích hợp sẵn cho tất cả các số nguyên trong phạm vi [10,20], cũng như năm nội dung khác nhau, tất cả đều mặc định là một chuỗi trống "", nhưng không có nội dung nào cho100 hoặc là 1000?
Kevin Cruijssen

@KevinCruijssen Không chắc chắn ... Nhưng có các biến có giá trị được xác định trước như 0hoặc ""đôi khi hữu ích cho các vòng lặp, vì đó thường là các giá trị bắt đầu mong muốn. Vì không có 100hoặc 1000, vâng, tôi đồng ý rằng họ sẽ hữu ích hơn là nói 18hoặc19
Luis Mendo

1
Thật xấu hổ khi các số 0 đứng đầu gây phiền nhiễu, nếu không bạn có thể bỏ mã :~itừ mã của mình. :(
Erik the Outgolfer

1

Japt , 12 byte

Chỉ số 0.

L²õ*6 ¬ò b¥U

Hãy thử hoặc kiểm tra tất cả các đầu vào

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)




1

Võng mạc , 83 77 byte

Tôi thực sự không tập luyện ở chương trình phức tạp ở Retina, nhưng tôi hài lòng với thời gian tôi xoay sở để thực hiện.

Xuất ra kết quả 0 chỉ mục.

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

L`..
m`^0

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

C`¶

Dùng thử trực tuyến


Giải trình

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


1

Retina 0.8.2 , 36 byte

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

Hãy thử trực tuyến! Liên kết bao gồm bộ kiểm tra. 1 chỉ mục. Giải trình:

^
2406$*_

Tiền tố 2406 _s cho đầu vào.

_{6}
$.`

Thay thế cứ sau 6 _giây bằng số _s trước . Điều này tạo ra chuỗi 0, 6, 12... 2400, nhưng tự động móc nối những con số.

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

Bỏ qua số 0 đứng đầu và tìm cặp chữ số đầu tiên khớp với hai chữ số cuối, tức là đầu vào có đệm bằng 0 (vì chuỗi kết thúc bằng 0; trên thực tế, bộ kiểm tra sử dụng thực tế là nó kết thúc bằng 00).

$#1

Xuất số lượng các cặp chữ số lên đến và bao gồm cả khớp.

Retina 1 lưu một vài byte bởi vì toán tử lặp lại chuỗi của nó ngắn hơn một byte và đã được mặc định _là toán hạng bên tay phải của nó, để dòng mã thứ hai trở nên chính xác 2406*. Một tính năng khác của Retina 1 là nhân và nhân 6 trong số thay thế. Đáng chú ý, điều này cũng không ảnh hưởng đến tổng số byte, vì kết quả cuối cùng trông như thế này:> sửa đổi tạo ra sự thay thế trong ngữ cảnh của dấu phân cách sau trận đấu, trong trường hợp$.>` nguyên nhân khiến nó bao gồm độ dài của kết quả khớp trong kết quả. Mặc dù chi phí này là một byte, chúng tôi lưu nó ngay lập tức vì chúng tôi không cần phải khớp 0nữa. (Sự lặp lại cũng phải giảm đi 6.) Retina 1 cũng có thể thực hiện số học cơ bản trong một sự thay thế. Điều này có nghĩa là chúng ta không phải dùng đến các thủ thuật để lấy bội số của 6, thay vào đó chúng ta chỉ tạo ra các số1..400

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


1

C # (Trình biên dịch tương tác Visual C #) , 88 byte

n=>{int i=2;for(var s="612";!s.StartsWith($"{n:d2}");s=s.Substring(2)+6*++i);return~-i;}

Hãy thử trực tuyến!

Một cổng khác của câu trả lời JavaPython .

Câu trả lời ban đầu của tôi dưới đây:

C # (Trình biên dịch tương tác Visual C #) , 102 byte

n=>{dynamic s="",t=$"{n:d2}",i=0;for(;i++<400;s+=i*6);for(i=0;s[i++]!=t[0]|s[i++]!=t[1];);return i/2;}

Hãy thử trực tuyến!

Cả hai giải pháp đều sử dụng lập chỉ mục dựa trên 1.



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

Lâu quá! :

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.