Trình tự nhẫn Olympic


18

Thử thách:

Cho một số nguyên chỉ mục n, xuất ra nmục thứ 'trong chuỗi này hoặc xuất trình tự lên đến và bao gồm chỉ mục 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

Trình tự này hoạt động như thế nào?

LƯU Ý: Trong phần giải thích này, chỉ mục nlà 1 chỉ mục.
Đặt những con số 1thông qua xtrên hai dòng thời gian n*6 - 1, nơi mà xphụ thuộc vào lặp hiện tại và độ dài của các con số được sử dụng, và sau đó tổng các chữ số của n'th / phải nhất Olympic Rings của hai dòng.

Số đầu tiên trong chuỗi được tính như sau:

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

Vì vậy, n=1kết quả trong 25.

Số thứ hai trong chuỗi được tính như sau:

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

Vì vậy, n=2kết quả trong 25.

Số thứ ba trong chuỗi được tính như sau:

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

Vì vậy, n=3kết quả trong 7.

Vân vân.

Quy tắc thử thách:

  • Khi bạn xuất nmục thứ tự trong chuỗi, bạn được phép lấy đầu vào là 0 được lập chỉ mục thay vì 1 chỉ mục, nhưng hãy nhớ rằng các tính toán n*6 - 1sau đó sẽ trở thành (n+1)*6 - 1hoặc (n+1)*5 + n.
  • Các số đơn lẻ có nhiều hơn một chữ số có thể được tách ra ở cuối dòng đầu tiên khi chúng ta đạt đến độ dài n*5 + n-1, do đó, có thể một số có 2 chữ số trở lên là một phần của dòng 1 và một phần phần đầu của dòng 2.

Quy tắc chung:

  • Đây là , vì vậy câu trả lời ngắn nhất bằng byte thắng.
    Đừng để ngôn ngữ mã-golf ngăn cản bạn đăng câu trả lời với các ngôn ngữ không mã hóa. Cố gắng đưa ra một câu trả lời càng ngắn càng tốt cho ngôn ngữ lập trình 'bất kỳ'.
  • Các quy tắc chuẩn áp dụng cho câu trả lời của bạn, vì vậy bạn được phép sử dụng STDIN / STDOUT, các hàm / phương thức với các tham số thích hợp và kiểu trả về, các chương trình đầy đủ. Cuộc gọi của bạn.
  • Lỗ hổng mặc định bị cấm.
  • Nếu có thể, vui lòng thêm một liên kết với một bài kiểm tra cho mã của bạn.
  • Ngoài ra, xin vui lòng thêm một lời giải thích nếu cần thiết.

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

Dưới đây là một thùng dán của các trường hợp thử nghiệm 1-1.000 , vì vậy hãy thoải mái chọn bất kỳ trong số chúng.

Một số trường hợp thử nghiệm cao hơn bổ sung:

1010:   24
1011:   24
2500:   19
5000:   23
7500:   8
10000:  8
100000: 25

1*5 + 1-1 = 5? Có nên không 1*5 + 5 - 1 = 9?
NieDzejkob

@NieDzejkob Không, n=1vì vậy , n*5 + n-1trở thành 1*5 + 1-1, lần lượt là 5 - 0 = 5.
Kevin Cruijssen

không n * 5 + n - 1bằng n * 6 - 1?
Brian H.

@BrianH. Bạn nói đúng, nó thực sự là. Cũng nhận thấy điều đó sau khi xem câu trả lời Retina của Martin. Tôi đã chỉnh sửa mô tả thử thách để sử dụng công thức ngắn hơn này.
Kevin Cruijssen

Câu trả lời:


4

Husk , 16 byte

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

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

-3 byte nhờ H.PWiz .

(Vội vã) giải thích:

ΣĊ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

@KevinCruijssen Lạ, vì tôi chỉ định thêm một cái. Tuy nhiên tôi không khuyên bạn nên chấp nhận một câu trả lời nào. ;-)
Erik các Outgolfer

@KevinCruijssen Tôi đã thêm một lời giải thích vội vã-up, mặc dù nó không atm rất tốt ...
Erik các Outgolfer

Đủ tốt cho tôi, chấp nhận. Và cá nhân tôi thích chấp nhận thử thách, mặc dù nó thực sự không cần thiết. Nếu ai đó tình cờ đăng một câu trả lời ngắn hơn của bạn, tất nhiên tôi sẽ thay đổi nó một lần nữa.
Kevin Cruijssen 6/2/18

@KevinCruijssen Mục tiêu chính chống lại điều đó không xảy ra sau khi một câu trả lời ngắn hơn được đăng, nhưng ai đó có thể không khuyến khích đăng một câu trả lời khác. Dù sao, cuộc gọi của bạn.
Erik the Outgolfer 6/2/18

5

Võng mạc , 70 68 62 byte

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

,2,9`.
*
_

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

Giải trình

Hãy gọi đầu vào n và chúng ta sẽ sử dụng 3làm ví dụ.

.+
10**

Đây 10**là viết tắt của 10*$&*_thay thế đầu vào bằng một chuỗi 10n gạch dưới.

.
$.>`

Bây giờ chúng tôi thay thế mỗi dấu gạch dưới bằng độ dài của chuỗi lên đến và bao gồm cả dấu gạch dưới đó. Vì vậy, điều này chỉ dẫn đến số lượng từ 1 đến 10n tất cả được nối với nhau ( 10n luôn đủ để lấp đầy hai dòng có độ dài cần thiết).

~(`.+
6*$+*

Eval! Giai đoạn này và giai đoạn tiếp theo sẽ tạo mã nguồn của một chương trình khác, sau đó chạy theo chuỗi các số nguyên được nối.

Để tạo chương trình đó, giai đoạn này trước tiên thay thế các số nguyên bằng chuỗi 6n dấu gạch dưới ( $+tham chiếu đến đầu vào ban đầu của chương trình).

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

Sau đó thay thế các dấu gạch dưới bằng L`.{…}, trong đó 6n-1 (độ dài của các dòng chúng ta đang xem). Vì vậy, chúng tôi đã tạo một regex, có bộ định lượng phụ thuộc vào đầu vào ban đầu.

Khi chương trình này được đánh giá, nó phù hợp với các đoạn có độ dài 6n-1 , trong đó sẽ có ít nhất hai. Đối với đầu vào ví dụ của chúng tôi 3, chúng tôi kết thúc với:

12345678910111213
14151617181920212
22324252627282930

Bây giờ chúng ta chỉ cần trích xuất các chữ số có liên quan.

%,-6`.

Đầu tiên, trên mỗi dòng ( %) chúng tôi xóa tất cả trừ năm chữ số cuối ( ,-6). Điều đó cho chúng ta

11213
20212
82930

Cuối cùng:

,2,9`.
*

Chúng tôi mở rộng mọi chữ số khác ( 2) trong mười chữ số đầu tiên ( 9, đây là 0 chữ số ) trong unary. Những người tình cờ là những người ở vị trí Olympic Nhẫn.

_

Và chúng tôi đếm số lượng kết quả gạch dưới, để tổng hợp chúng và chuyển đổi kết quả thành số thập phân.


59 byte Mặc dù hơi lộn xộn
H.PWiz

@ H.PWiz dường như không hoạt động cho đầu vào 1.
Martin Ender

Ồ vâng, đó sẽ là-7
H.PWiz


3

Japt , 33 32 30 29 28 27 byte

Ồ, cái này không đẹp!

Xuất ra thuật ngữ thứ n , 1 chỉ mục.

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

Thử nó


Giải trình

                         :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


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)

Dùng thử trực tuyến

Điều này là khá nhiều lộn xộn mặc dù, nhưng hoạt động.


2

05AB1E , 22 21 20 byte

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

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

Giải trình

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

Cách tiếp cận 21 byte thay thế

6*<©·LJƵYS24S®-ì®-(èO

@KevinCruijssen: Chắc chắn rồi. Tôi đã có ý định thử và đánh gôn thêm một chút trước khi thêm lời giải thích, nhưng tôi thực sự không có thời gian nên đây là :)
Emigna

Cảm ơn! Và tôi biết hầu hết mọi người thích chơi golf trước hết mức có thể trước khi thêm một lời giải thích, nhưng vì đã không có bản cập nhật cho câu trả lời của bạn trong hơn 15 giờ nên tôi nghĩ rằng tôi chỉ cần yêu cầu một lời giải thích. :) Câu trả lời hay, btw!
Kevin Cruijssen

2

Thạch , 19 byte

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

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

×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

Bạn có phiền thêm một lời giải thích?
Kevin Cruijssen

@KevinCruijssen chắc chắn, nhưng tôi thường làm theo yêu cầu, nếu không tôi tập trung vào việc trả lời các thử thách khác, làm việc khác hoặc ngủ: P
Erik the Outgolfer 23/1/18




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

Tất nhiên tôi sẽ phải trả lời thử thách của riêng tôi. :)
Tôi đã mất mã ban đầu mà tôi đã sử dụng để tạo kết quả thử nghiệm trong mô tả thử thách, vì vậy tôi mới bắt đầu lại.

Giải trình:

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

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