Pierwsze wystąpienie w sekwencji Sixersa

17

Sekwencja Sixers to nazwa, która może być udzielona do sekwencji A087409 . Dowiedziałem się o tej sekwencji w filmie Numberphile i można ją zbudować w następujący sposób:

Najpierw weź wielokrotności 6, zapisane w bazie 10:

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

Następnie połącz liczby w strumień cyfr:

61218243036...

Na koniec zgrupuj strumień w pary i zinterpretuj każdy jako liczbę całkowitą:

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

Gdy grupujemy liczby w pary, maksymalna liczba w sekwencji będzie wynosić 99, i okazuje się, że wszystkie nieujemne liczby całkowite mniejsze niż 100 są reprezentowane w sekwencji. Wyzwanie polega na znalezieniu indeksu pierwszego wystąpienia liczby w sekwencji Sixersa.

Wejście

Liczba całkowita w zakresie [0-99]. Nie musisz uwzględniać liczb spoza tego zakresu, a twoje rozwiązanie może mieć dowolne zachowanie, jeśli takie dane zostaną podane.

Wynik

Indeks pierwszego wystąpienia liczby wejściowej w sekwencji Sixersa. Może to być indeks 0 lub 1; proszę powiedzieć, którego używasz w swojej odpowiedzi.

Zasady

  • Procedura generowania sekwencji opisana we wstępie służy wyłącznie do celów ilustracyjnych, możesz użyć dowolnej metody, o ile wyniki są takie same.
  • Możesz przesyłać pełne programy lub funkcje.
  • Wszelkie rozsądne metody wprowadzania i wyprowadzania są dozwolone.
  • Standardowe luki są niedozwolone.
  • Zalecane są linki do przetestowania kodu online!
  • To jest , więc wygrywa najkrótsza odpowiedź w każdym języku!

Przypadki testowe

Oto lista wszystkich wejść i wyjść w formacie 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
źródło
6
Warto wiedzieć, że rozważenie 6, 2*6, 3*6,..., 325*6jest wystarczające do wygenerowania wszystkich możliwych wartości
Luis Mendo
@LuisMendo Masz rację, zastanawiałem się, czy uwzględnić to w opisie wyzwania. Komentarz również jest na to dobry: o)
Sok
Możemy przyjąć wejścia liczbę całkowitą jako ciąg, przy czym te napawa się wiodącym 0 (czyli , , , ...)? n<10000102
Kevin Cruijssen
10
@KevinCruijssen Hmmm, wprowadzanie jako ciąg znaków jest w porządku, ale lewe dopełnianie z 0 to trochę za daleko IMO.
Sok

Odpowiedzi:

12

JavaScript (ES6),  71 65  55 bajtów

Wyjście jest indeksowane na 0.

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

Wypróbuj online!

W jaki sposób?

Korzystając z funkcji rekurencyjnej, albo „konsumujemy” pierwsze 2 znaki ciągu połączonych wielokrotności 6 , albo dodajemy nowe znaki, jeśli mamy mniej niż 2 z nich.

Przykład dla 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

Skomentował

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
źródło
12

Python 2 , 93 92 85 83 81 68 65 59 bajtów

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

Wypróbuj online!


  • -2 bajty, dzięki Grimy
  • -3 bajty, dzięki ArBo
  • -6 bajtów, dzięki xnor
TFeld
źródło
1
3 bajty krótsze jako 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 Jeszcze lepiej, f=lambda n,s='612',i=18:n-int(s[:2])and-~f(n,s[2:]+`i`,i+6)(indeksowane 0).
xnor
8

Perl 6 , 31 bajtów

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

Wypróbuj online!

Wykorzystuje sekwencję 1-indeksowaną.

Wyjaśnienie:

{                            } # 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
źródło
7

Haskell , 82 ... 65 58 54 bajtów

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

Wypróbuj online!

FrownyFrog
źródło
5

05AB1E , 9 bajtów

₄L6*J2ôIk

0-indeksowane. Akceptuje jako dane wejściowe jedną liczbę całkowitą lub listę liczb całkowitych.

Wypróbuj online lub sprawdź wszystkie przypadki testowe .

Wyjaśnienie:

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
źródło
Czy domyślnym zachowaniem jest łączenie jako ciąg, czy też istnieją oddzielne operatory dla łączenia jako ciąg i łączenia jako liczba?
maxb
@maxb Ogólnie 05AB1E nie wymaga żadnych wyraźnych konwersji. Wszystkie liczby całkowite mogą być również używane do funkcji łańcuchowych, takich jak zamiana lub podział, a wszystkie utworzone łańcuchy (które są liczbami całkowitymi) mogą być również używane jako liczby. Tak więc 100, "100"i 100.0są takie same dla większości funkcji, takich jak równe kontrole i tym podobne. Nadal istnieją funkcje rzutowania na int i rzutowania na ciąg w 05AB1E dla niektórych funkcji, takich jak sortowanie (sortowanie numeryczne vs leksykograficzne) lub do usuwania cyfr dziesiętnych po przecinku z liczby zmiennoprzecinkowej podczas rzutowania na int, ale nie są one używane tak często .
Kevin Cruijssen
@maxb Odpowiednia wskazówka 05AB1E podająca dodatkowe przykłady.
Kevin Cruijssen
4

Węgiel drzewny , 12 bajtów

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

Wypróbuj online! Link jest do pełnej wersji kodu. 0-indeksowane. Wyjaśnienie:

     φ           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
źródło
4

J , 29 26 bajtów

-3 bajty dzięki FrownyFrog!

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

Wypróbuj online!

W oparciu o 0

Galen Iwanow
źródło
1
i.~_2(".\;)6<@":@*1+i.@325
FrownyFrog
@FrownyFrog Dziękujemy! Miłe użycie boksu!
Galen Iwanow
4

APL (Dyalog Unicode) , 26 bajtów

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

Wypróbuj online! - Testy dla wszystkich ważnych danych wejściowych.

W jaki sposób:

{⍵⍳⍨⍎¨((≠\=⍨)⊂⊢)∊⍕¨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é
źródło
czy możesz przekształcić spłaszczony wektor tak jak w K? Google sugeruje, ale APL mnie przeraża ...
streetster
@streetster tak, to zmiana APL-a. Jeśli więc chcesz przekształcić spłaszczony wektor, po prostu musisz to zrobić<new shape vector> ⍴ <vector to reshape>
J. Sallé
więc czy możesz użyć przekształcenia, aby utworzyć listę 2xN, a następnie przekonwertować każdą liczbę całkowitą?
streetster
Możesz, ale nie sądzę, że byłoby to krótsze niż moja obecna odpowiedź. Jednym z problemów byłoby to, że dla mojej odpowiedzi przekształcenie łańcucha na matrycę 1117 × 2, a następnie konwersja na liczby całkowite stworzyłoby wektor z 1117, cyframi całkowitymi. Zobacz różnicę między metodą, której używam, a przekształceniem
J. Sallé
Ach, mój spłaszczony sznurek przekształca się w coś bardziej praktycznego :)
streetster
3

Python 3 , 87 81 bajtów:

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

wejście całkowite, wyjście 0-indeksowane.

Wypróbuj online!


-6 bajtów, dzięki @TFeld.

MrGeek
źródło
3

R , 75 62 bajtów

-13 bajtów dzięki Giuseppe.

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

Wypróbuj online!

Robin Ryder
źródło
2

MathGolf , 10 bajtów

•╒6*y░2/i=

Wypróbuj online!

Zasadniczo taki sam jak odpowiedź 05AB1E, ale tracę bajt, ponieważ muszę jawnie przekonwertować skonkatenowaną liczbę na ciąg znaków.

Wyjaśnienie

•╒             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
maxb
źródło
2

C # (interaktywny kompilator Visual C #) , 123 bajty 115 bajtów

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

Wypróbuj online!

Wygasły dane
źródło
Myślę, że w twoim rozwiązaniu jest jakiś błąd, który f(61)powinien zostać zwrócony 0(wygląda na to, że Twoje rozwiązanie ma 0 indeksów)
Sok
1
Dzięki @sok należy teraz naprawić
Data
2

K (oK) , 22 bajty

Rozwiązanie:

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

Wypróbuj online!

Wyjaśnienie:

0-indeksowane.

(.:'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
źródło
2

Galaretka , 10 bajtów

ȷ×€6DFs2Ḍi

Wypróbuj online!

Łącze TIO podaje wszystkie wartości od 0 do 99.

Wyjaśnienie

ȷ          | 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
źródło
2

Java 10, 119 104 102 bajtów

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 odpowiedzi @TFeld na Python 2 .
-2 bajty dzięki @Imus .

1-indeksowany.

Wypróbuj online.

Wyjaśnienie:

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

Oryginalna wersja 119 117 bajtów:

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

Wypróbuj online.

Wyjaśnienie:

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
źródło
1
Możesz zapisać 2 bajty, używając „” + n / 10 + n% 10 zamiast n> 9? N + „”: „0” + n
Imus
1

CJam , 17 bajtów

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

Wypróbuj online!

W oparciu o 0.

Wyjaśnienie

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
źródło
Z ciekawości, dlaczego CJam ma wbudowane funkcje dla wszystkich liczb całkowitych z tego zakresu [10,20], a także pięć różnych wbudowanych domyślnie pustych ciągów znaków "", ale bez wbudowanych100 lub 1000?
Kevin Cruijssen
@KevinCruijssen Nie jestem pewien ... Ale posiadanie zmiennych o predefiniowanych wartościach takich jak 0lub ""jest czasem przydatne w pętlach, ponieważ często są to pożądane wartości początkowe. Jeśli chodzi o brak 100lub 1000, tak, zgadzam się, że byłyby bardziej przydatne niż powiedzieć 18lub19
Luis Mendo
1
To wstyd, że wiodące zera są irytujące, w przeciwnym razie można rów :~i ize swojego kodu. :(
Erik the Outgolfer
1

Japt , 12 bajtów

0-indeksowane.

L²õ*6 ¬ò b¥U

Wypróbuj lub przetestuj wszystkie wejścia

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)
Kudłaty
źródło
1

Stax , 11 bajtów

Æ▒§±~>ûπ╞öt

Uruchom i debuguj

Dane wejściowe są liczbami całkowitymi. Wyjście jest indeksowane na 0.

rekurencyjny
źródło
1

Retina , 83 77 bajtów

Naprawdę nie mam praktyki w skomplikowanym programowaniu w Retinie, ale jestem zadowolony z długości, w której udało mi się to zrobić.

Wysyła wynik z indeksem 0.

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

L`..
m`^0

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

C`¶

Wypróbuj online


Wyjaśnienie

.+                   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
źródło
1

Retina 0.8.2 , 36 bajtów

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

Wypróbuj online! Link zawiera pakiet testowy. 1-indeksowany. Wyjaśnienie:

^
2406$*_

Przedrostek 2406 _s na wejściu.

_{6}
$.`

Zastępuj co 6 _s liczbą poprzedzających _. Generuje to sekwencja 0, 6, 12... 2400, ale automatycznie Łączy liczb.

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

Pomiń początkowe 0 i znajdź pierwszą parę cyfr, która pasuje do dwóch ostatnich cyfr, tj. Wejścia z dopełnieniem zerowym (ponieważ łańcuch kończy się na 0; w rzeczywistości pakiet testowy wykorzystuje fakt, że kończy się na 00).

$#1

Podaj liczbę par cyfr aż do dopasowania włącznie.

Retina 1 zapisuje kilka bajtów, ponieważ jej operator powtarzania ciągów jest krótszy i domyślnie jest już _operandem po prawej stronie, dzięki czemu drugi wiersz kodu staje się sprawiedliwy 2406*. Inną cechą Retina 1 jest pomnożenie przez 6 w podstawieniu. Co ciekawe, nie wpływa to również na całkowitą liczbę bajtów, ponieważ końcowy wynik wygląda następująco:> modyfikator, który generuje podstawienie w kontekście separatora po dopasowaniu, co w przypadku $.>`powoduje włączenie długości dopasowania do wyniku. Mimo że kosztuje to bajt, zapisujemy go natychmiast, ponieważ nie musimy dopasowywać0 . (Powtórzenia również muszą zostać zmniejszone o 6.) Siatkówka 1 może również wykonywać podstawową arytmetykę w zamianie. Oznacza to, że nie musimy uciekać się do sztuczek, aby wziąć wielokrotności 6, zamiast tego po prostu generujemy liczby1..400

^
400*
_
$.(6*$>`
^(..)+?.*\1$
$#1
Neil
źródło
1

Bash , 80 bajtów

1-indeksowany.

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

Wypróbuj online!

jnfnt
źródło
1

Clojure, 102 bajty

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

Tak długo! :(

NikoNyrh
źródło