Послідовність олімпійських кілець


18

Виклик:

З огляду на ціле число індексу n, або виведіть n'-й елемент у цій послідовності, або виведіть послідовність до та включаючи індекс 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

Як працює ця послідовність?

ПРИМІТКА. У цьому поясненні індекс n1-індексований.
Помістіть цифри 1через xна двох лініях довжиною n*6 - 1, де xзалежить від поточної ітерації і довжини використовуваних чисел, а потім підсумувати цифри в n-м / правої більшості олімпійських кілець цих двох ліній.

Перше число в послідовності обчислюється так:

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

Таким чином, n=1результати в 25.

Друге число у послідовності обчислюється так:

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

Таким чином, n=2результати в 25.

Третє число в послідовності обчислюється так:

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

Таким чином, n=3результати в 7.

тощо.

Правила виклику:

  • Коли ви виводите n'-й елемент у послідовності, вам дозволяється приймати вхід як 0-індексований замість 1-індексованого, але майте на увазі, що обчислення n*6 - 1потім стануть (n+1)*6 - 1або (n+1)*5 + n.
  • Одиничні числа, n*5 + n-1що містять більше однієї цифри, можна розділити в кінці першого рядка, коли ми досягли довжини , тому можливо, що число з 2 або більше цифрами є частково проміжною частиною рядка 1, а частково провідна частина 2 рядка.

Загальні правила:

  • Це , тому найкоротша відповідь у байтах виграє.
    Не дозволяйте мовам коду-гольфу відштовхувати вас від публікації відповідей з не кодовими гольф-мовами. Спробуйте придумати якомога коротшу відповідь на "будь-яку" мову програмування.
  • Стандартні правила застосовуються до вашої відповіді, тому вам дозволяється використовувати STDIN / STDOUT, функції / метод із відповідними параметрами та повним програмами типу "повернення". Твій дзвінок.
  • Лазівки за замовчуванням заборонені.
  • Якщо можливо, додайте посилання з тестом для вашого коду.
  • Також, будь ласка, додайте пояснення, якщо це необхідно.

Тестові приклади:

Ось контейнер для паст тестів 1-1000 , тому сміливо вибирайте будь-який із них.

Деякі додаткові вищі тестові випадки:

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

1*5 + 1-1 = 5? Чи не повинно бути 1*5 + 5 - 1 = 9?
NieDzejkob

@NieDzejkob Ні, n=1так n*5 + n-1стає 1*5 + 1-1, що в свою чергу є 5 - 0 = 5.
Кевін Кройсейсен

не n * 5 + n - 1дорівнює n * 6 - 1?
Брайан Х.

@BrianH. Ти маєш рацію, так і є. Помітив це і після того, як побачив відповідь Мартіна Ретіна. Я відредагував опис виклику, щоб використовувати цю коротку формулу.
Кевін Кройсейсен

Відповіді:


4

Лушпиння , 16 байт

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

Спробуйте в Інтернеті!

-3 байти завдяки H.PWiz .

(Кинулось) пояснення:

ΣĊ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 Дивно, тому що я тільки збирався додати його. Однак я все ж не рекомендую приймати відповідь. ;-)
Ерік Аутгольфер

@KevinCruijssen Я додав роз’яснене пояснення, хоча це не дуже добре атм ...
Erik the Outgolfer

Для мене досить добре, прийнято. І особисто я вважаю за краще приймати виклики, хоча це насправді не потрібно. Якщо хтось опублікує коротшу відповідь, ніж ваша, я, звичайно, знову її зміню.
Кевін Крейссен

@KevinCruijssen Основна мета проти цього - це не те, що станеться після опублікування коротшої відповіді, а те, що хтось може відмовитись взагалі іншу відповідь. У всякому разі, ваш дзвінок.
Ерік Аутгольфер

5

Сітківка , 70 68 62 байт

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

,2,9`.
*
_

Спробуйте в Інтернеті!

Пояснення

Назвемо вхід n , і ми використаємо 3як приклад.

.+
10**

10**Є абревіатурою , 10*$&*_яка замінює вхід з рядком 10н підкреслення.

.
$.>`

Тепер ми замінюємо кожне підкреслення на довжину рядка до і включаючи це підкреслення. Таким чином, це якраз і призводить до того, що число від 1 до 10n об'єднане разом ( 10n завжди достатньо, щоб заповнити два рядки необхідної довжини).

~(`.+
6*$+*

Евал! Цей і наступний етап генерують вихідний код іншої програми, який потім запускається проти цієї рядки зв'язаних цілих чисел.

Щоб створити цю програму, цей етап спочатку замінює цілі числа рядком 6n підкреслення ( $+стосується початкового введення програми).

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

Потім замініть ці підкреслення на L`.{…}, де є 6n-1 (довжина рядків, які ми дивимося). Таким чином, ми створили регулярний вираз, кількісний показник якого залежить від початкового введення.

Коли ця програма отримає оцінку, вона відповідає шматкам довжиною 6n-1 , з яких буде щонайменше два. Для нашого прикладу 3, ми закінчуємо:

12345678910111213
14151617181920212
22324252627282930

Тепер нам просто потрібно витягнути відповідні цифри.

%,-6`.

Спочатку з кожного рядка ( %) вилучаємо всі, крім останніх п'яти цифр ( ,-6). Це дає нам

11213
20212
82930

Нарешті:

,2,9`.
*

Розширюємо кожну іншу цифру ( 2) в першій десятці ( 9це на основі 0) в одинакові. Це випадково ті, хто знаходиться на позиціях Олімпійських кілець.

_

І ми підраховуємо кількість отриманих підкреслень, підсумовуємо їх і перетворюємо результат у десяткові.


59 байт Хоч трохи безладно
H.PWiz

@ H.PWiz Схоже, не працює для введення даних 1.
Мартін Ендер

О так, це буде-7
H.PWiz


3

Japt , 33 32 30 29 28 27 байт

О, це не дуже!

Виводить n- й член, 1-індексований.

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

Спробуй це


Пояснення

                         :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

05AB1E , 22 21 20 байт

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

Спробуйте в Інтернеті!

Пояснення

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

Альтернативний 21 байтний підхід

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

@KevinCruijssen: Звичайно. Я мав намір спробувати ще трохи пограти в гольф, перш ніж додати пояснення, але я не дуже встиг так, ось ось :)
Emigna

Спасибі! І я знаю, що більшість людей вважають за краще спочатку пограти в гольф, перш ніж додавати пояснення, але оскільки не було оновлення вашої відповіді за 15 годин, я зрозумів, що просто попрошу пояснення. :) Приємна відповідь, btw!
Кевін Кройсейсен

2

Желе , 19 байт

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

Спробуйте в Інтернеті!

×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

Ви б не хотіли додати пояснення?
Кевін Круїссен

@KevinCruijssen впевнений, але зазвичай це роблю на прохання, інакше я зосереджуюсь на відповіді на інші виклики, займаюся іншими справами або сплю: P
Erik the Outgolfer,




1

Java 8, 138 111 109 байт

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

Мені, звичайно, доведеться відповісти на власний виклик. :)
Я втратив свій початковий код, який використовував для створення результатів тесту в описі завдання, тому я тільки почав заново.

Пояснення:

Спробуйте в Інтернеті.

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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.