Перше виникнення в послідовності Шексерса


17

Послідовність Sixers - це ім'я, яке можна надати послідовності A087409 . Я дізнався про цю послідовність у відеоролику Numberphile , і її можна побудувати так:

Спочатку візьміть кратні 6, записані в базі 10:

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

Далі об’єднайте числа в потік цифр:

61218243036...

Нарешті, перегрупуйте потік у пари та інтерпретуйте кожне як ціле число:

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

Коли ми групуємо числа по парах, максимальне число в послідовності буде 99, і виявляється, що всі негативні цілі числа менше 100 представлені в послідовності. Ця задача полягає в пошуку індексу першого примірника числа в послідовності Sixers.

Вхідні дані

Ціле число в діапазоні [0-99]. Вам не потрібно обліковувати числа за межами цього діапазону, і ваше рішення може мати будь-яку поведінку, якщо такий ввід буде надано.

Вихідні дані

Індекс першого появи вхідного числа в послідовності Шексерса. Це може бути 0- або 1-індексованим; скажіть, будь ласка, що ви використовуєте у своїй відповіді.

Правила

  • Процедура генерації послідовності, зазначеної у вступі, призначена лише для ілюстративних цілей, ви можете використовувати будь-який метод, який вам подобається, якщо результати однакові.
  • Ви можете подати повні програми або функції.
  • Дозволені будь-які розумні методи введення та виведення даних.
  • Стандартні лазівки заборонені.
  • Посилання для тестування вашого коду в Інтернеті рекомендуються!
  • Це , тому найкоротша відповідь на кожній мові виграє!

Тестові справи

Ось список усіх вхідних та вихідних даних у форматі 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
Можливо, буде корисно знати, що врахування 6, 2*6, 3*6,..., 325*6достатньо для формування всіх можливих значень
Луїс Мендо

@LuisMendo Ви маєте рацію, я обговорював, чи варто включити це до опису виклику. Коментар - це добре місце і для цього: o)
Sok

Можемо чи ми взяти на себе введення-ціле число як рядок, з тими , прокладений з провідним 0 (тобто , , , ...)? n<10000102
Кевін Круїссен

10
@KevinCruijssen Hmmm, введення в якості рядка чудово, але залишене накладення з 0 трохи надто далеко IMO.
Сок

Відповіді:


12

JavaScript (ES6),  71 65  55 байт

Вихід 0-індексований.

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

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

Як?

Використовуючи рекурсивну функцію, ми або «споживаємо» перші 2 символи рядка з’єднаних кратних 6 , або додаємо нові символи, якщо їх у нас менше 2.

Приклад для 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

Прокоментував

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

Python 2 , 93 92 85 83 81 68 65 59 байт

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

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


  • -2 байти, завдяки Гримі
  • -3 байти, завдяки ArBo
  • -6 байт, завдяки xnor

1
На 3 байти коротше, ніж лямбда: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 Ще краще, f=lambda n,s='612',i=18:n-int(s[:2])and-~f(n,s[2:]+`i`,i+6)(0-індексовано).
xnor

8

Perl 6 , 31 байт

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

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

Використовує 1-індексовану послідовність.

Пояснення:

{                            } # 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 байт

₄L6*J2ôIk

0-індексований. Приймає або одне ціле число, або список цілих чисел як вхідні дані.

Спробуйте в Інтернеті або перевірте всі тестові випадки .

Пояснення:

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)

Чи є поведінка за замовчуванням для з'єднання як рядка, або є окремі оператори для приєднання до рядка та приєднання до числа?
maxb

@maxb Загалом 05AB1E не потребує явних перетворень. Усі цілі числа також можуть бути використані для рядкових функцій, таких як заміна або розділення, а всі створені рядки (цілі числа) також можуть використовуватися як числа. Отже 100, "100"і 100.0є однаковими для більшості функцій, як рівні перевірки і такі. У 05AB1E все ще є функції передачі до int та передачі до рядкових функцій для деяких функцій, наприклад сортування (числове порівняння з лексикографічним сортуванням) або для видалення десяткових цифр після коми з поплавця під час передавання до int, але вони не використовуються часто .
Kevin Cruijssen

@maxb Відповідна порада 05AB1E, яка дає кілька додаткових прикладів.
Кевін Кройсейсен

4

Вугілля деревне , 12 байт

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

Спробуйте в Інтернеті! Посилання на багатослівну версію коду. 0-індексований. Пояснення:

     φ           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 байт

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

Спробуйте в Інтернеті! - Тести для всіх дійсних входів.

Як:

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

ви можете переробити сплющений вектор, як ви можете в K? Google пропонує , але APL мене лякає ...
streetster

@streetster так, це зміна APL. Отже, якщо ви хочете змінити сплющений вектор, вам просто потрібно це зробити<new shape vector> ⍴ <vector to reshape>
J. Sallé

ви можете використовувати переформатування для створення списку 2xN, а потім перетворити кожен на ціле число?
streetster

Ви могли б, але я не думаю, що це буде коротше моєї нинішньої відповіді. Одна з проблем полягає в тому, що для моєї відповіді перестановка рядка в матрицю 1117 × 2 і потім перетворення на цілі числа створили б вектор з 1117 одноцифровими цілими числами. Дивіться різницю між методом, який я використовую, та переробкою
J. Sallé

Ах, моя сплющена рядок отримує реорганізована в щось більш працездатний :)
streetster


3

Мова Вольфрама (Mathematica) , 74 байти

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

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

2 байти, збережені з @Expired Data



Я працював над цим ще до того, як побачив ваші .. об’єднав їх і отримав 77 байт
Термін дії закінчився

@ExpiredData приємно. 74 байти зараз
J42161217



2

MathGolf , 10 байт

•╒6*y░2/i=

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

В основному те саме, що відповідь 05AB1E, але я втрачаю байт, маючи необхідність перетворити об'єднане число в рядок явно.

Пояснення

•╒             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 # (Visual C # Interactive Compiler) , 123 байт 115 байт

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

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


Я думаю, що десь є помилка у вашому рішенні, як і f(61)слід повернутись 0(схоже, ваше рішення 0-індексовано)
Sok

1
Дякуємо @sok має бути виправлено зараз
Термін дії минув

2

K (oK) , 22 байти

Рішення:

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

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

Пояснення:

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

Желе , 10 байт

ȷ×€6DFs2Ḍi

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

Посилання TIO дає всі значення від 0 до 99.

Пояснення

ȷ          | 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 байт

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

Порт відповіді PyThon 2 @TFeld .
-2 байти завдяки @Imus .

1-індексований.

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

Пояснення:

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

Оригінальна версія 119 117 байт:

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

0-індексований.

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

Пояснення:

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
Ви можете зберегти 2 байти, скориставшись "" + n / 10 + n% 10 замість n> 9? N + "": "0" + n
Imus

1

CJam , 17 байт

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

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

На основі 0.

Пояснення

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

З цікавості, чому CJam має вбудовані для всіх цілих чисел у діапазоні [10,20], а також п’ять різних вбудованих файлів, які за замовчуванням є порожніми рядками "", але не мають вбудованих файлів100 або 1000?
Кевін Кройсейсен

@KevinCruijssen Не впевнений ... Але наявність змінних із заздалегідь заданими значеннями, такими як 0або ""іноді корисно для циклів, тому що це часто бажані початкові значення. Що стосується відсутності 100або 1000, так, я згоден, вони були б кориснішими, ніж сказати, 18або19
Луїс Мендо

1
Прикро, що провідні нулі дратують, інакше ви можете вирватися з коду :~та iз нього. :(
Ерік Аутгольфер

1

Japt , 12 байт

0-індексований.

L²õ*6 ¬ò b¥U

Спробуйте або протестуйте всі матеріали

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

Сітківка , 83 77 байт

Я дуже не практикуюсь у складному програмуванні на Retina, але мене влаштовує тривалість, в якій мені вдалося це зробити.

Виводить 0-індексований результат.

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

L`..
m`^0

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

C`¶

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


Пояснення

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

Сітківка 0,8,2 , 36 байт

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

Спробуйте в Інтернеті! Посилання включає тестовий набір. 1-індексований. Пояснення:

^
2406$*_

Префікс 2406 _с до входу.

_{6}
$.`

Замініть кожні 6 _с на кількість попередніх _s. Це породжує послідовність 0, 6, 12... 2400, але автоматично приєднує номера.

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

Пропустіть ведучий 0 і знайдіть першу пару цифр, які відповідають останнім двом цифрам, тобто вхід із нульовим накладом (адже рядок закінчується 0; фактично тестовий набір використовує той факт, що він закінчується 00).

$#1

Виведіть кількість пар цифр до і включайте відповідність.

Retina 1 економить пару байтів, тому що його оператор повторення рядків є байтом коротшим і вже є за замовчуванням _як його праворучний операнд, так що другий рядок коду стає справедливим 2406*. Ще однією особливістю Retina 1 є >модифікатор, який генерує заміну в контексті роздільника після матчу, який у разі $.>`причини призводить до включення тривалості відповідності в результат. Хоча це коштує в байті, ми зберігаємо його негайно, оскільки нам не потрібно відповідати0 . (Повтори також повинні бути зменшені на 6.) Сітківка 1 також може робити основні арифметичні підміни. Це означає, що нам не доведеться вдаватися до хитрощів, щоб взяти кратні 6, натомість просто генеруємо числа1..400і помножимо на 6 в підстановці. Примітно, що це також не впливає на загальну кількість байтів, оскільки кінцевий результат виглядає приблизно так:

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


1

C # (Visual C # Interactive Compiler) , 88 байт

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

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

Ще один порт відповідей Java та Python .

Моя оригінальна відповідь нижче:

C # (Visual C # Interactive Compiler) , 102 байти

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

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

Обидва рішення використовують індексацію на основі 1.



1

Clojure, 102 байти

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

Так довго! :(

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