Składane liczby

23

Zdefiniujmy funkcję na liczbach naturalnych , zapisanych jako 10 cyfr podstawowych , jak następuje:ndkdk1d1d0

Dopóki są równe sąsiadujące cyfry , zamień je na ich sumę od lewej do prawej. Jeśli były takie cyfry, powtórz tę samą procedurę.didi1di+di1

Innymi słowy, w każdej iteracji łapczywie bierzemy wszystkie pary równych sąsiadujących cyfr i zastępujemy je ich sumą w tym samym czasie (używając pary najbardziej lewej, jeśli się nakładają).

Przykład

Weźmy na przykład 9988 :

  1. Pierwsze sąsiadujące cyfry, które są równe, to dwie 9
  2. Zastępujemy je więc 9 + 9=18 co daje nam 1888
  3. Ponieważ nadal jesteśmy w pierwszej od lewej do prawej i przechodzenie były jeszcze dwie 8 s musimy najpierw wymienić te
  4. Mamy 1816
  5. Coś się zmieniło, więc musimy wykonać kolejną iterację
  6. Ale nie ma takich cyfr, więc przestajemy

W związku z tym 9988th liczba w tym ciągu jest 1816 .

Wyzwanie

Pierwsze 200 warunków to:

0,1,2,3,4,5,6,7,8,9,10,2,12,13,14,15,16,17,18,19,20,21,4,23,24,25,26,27,28,29,30,31,32,6,34,35,36,37,38,39,40,41,42,43,8,45,46,47,48,49,50,51,52,53,54,10,56,57,58,59,60,61,62,63,64,65,12,67,68,69,70,71,72,73,74,75,76,14,78,79,80,81,82,83,84,85,86,87,16,89,90,91,92,93,94,95,96,97,98,18,10,101,102,103,104,105,106,107,108,109,20,21,4,23,24,25,26,27,28,29,120,121,14,123,124,125,126,127,128,129,130,131,132,16,134,135,136,137,138,139,140,141,142,143,18,145,146,147,148,149,150,151,152,153,154,20,156,157,158,159,160,161,162,163,164,165,4,167,168,169,170,171,172,173,174,175,176,24,178,179,180,181,182,183,184,185,186,187,26,189,190,191,192,193,194,195,196,197,198,28

Twoim zadaniem jest również wygenerowanie tej sekwencji

  • podano n , należy zwrócić nth liczbę w tej kolejności,
  • Biorąc pod uwagę n , zwróć pierwsze n liczb w tej sekwencji
  • lub wygeneruj sekwencję w nieskończoność.

Możesz wybrać swoje zgłoszenie, aby użyć 0 lub 1 , ale określ, który z nich.

Przypadki testowe

Możesz skorzystać z powyższych warunków, ale oto niektóre z nich:

222 -> 42
1633 -> 4
4488 -> 816
15519 -> 2019
19988 -> 2816
99999 -> 18189
119988 -> 21816
100001 -> 101
999999 -> 181818
ბიმო
źródło

Odpowiedzi:

6

Python 3 , 128 bajtów

def t(z):j=z and(z[0]==z[1:2])+1;return[str(int(z[0])*j),*t(z[j:])]if j else''
def c(n):r="".join(t(n));return r!=n and c(r)or r

Wypróbuj online!

anon3128
źródło
5
Witamy w PPCG! Miły pierwszy post!
Rɪᴋᴇʀ
1
108 bajtów
Jo King
5

Python 2 , 97 96 93 bajtów

def f(n):r=re.sub(r'(.)\1',lambda m:`int(m.group(1))*2`,n);return r!=n and f(r)or r
import re

Wypróbuj online!


Wersja bez wyrażenia regularnego:

Python 2 , 133 130 122 112 98 bajtów

def f(n):
 r='';s=n
 while s:a=1+(s[0]==s[1:2]);r+=`int(s[0])*a`;s=s[a:]
 return r!=n and f(r)or r

Wypróbuj online!

TFeld
źródło
5

Galaretka , 11 bajtów

DŒg+2/€FVµ¡

Jest to niepotrzebnie wolny, pełny program.

Wypróbuj online!

Alternatywna wersja, 12 bajtów

DŒg+2/€FVµƬṪ

Jeden bajt dłużej, ale znacznie szybciej. Działa jako program lub funkcja.

Wypróbuj online!

Jak to działa

DŒg+2/€FVµƬṪ  Main link. Argument: n (integer)

         µ    Combine the previous links into a chain. Begin a new one.
D               Decimal; yield n's digit array in base 10.
 Œg             Group adjacent, identical digits into subarrays.
   +2/€         Map non-overlapping, pairwise sum over the subarrays.
                If there is an odd number of digits in a subarray, the
                last digit will remain untouched.
       F        Flatten; dump all sums and digits into a single array.
        V       Eval; turn the result into an integer.
          Ƭ   Execute the chain 'til the results are no longer unique.
              Return all unique results.
           Ṫ  Tail; extract the last result.

Wersja 11-bajtowa robi to samo, z tym wyjątkiem, że wywołuje łącze n razy dla wejścia n , zamiast wywoływać je, aż do osiągnięcia stałego punktu.

Dennis
źródło
3
Nie jest to konieczne, jeśli pozwala zaoszczędzić 1 bajt :-)
Luis Mendo
4

Haskell, 70 bajtów

until((==)=<<f)f
f(a:b:c)|a==b=show(2*read[a])++f c|1<2=a:f(b:c)
f a=a

Dane wejściowe są traktowane jako ciąg.

Wypróbuj online!

nimi
źródło
Jak dotąd niczego ci to nie oszczędza, ale przy tej samej długości możesz zamienić drugą klauzulę na, |x<-b:c=a:f xa nawet f(a:c)=a:f cna wypadek, gdyby jeden lub drugi mógł rzeczywiście doprowadzić do poprawy :)
flawr
4

JavaScript, 48 47 46 bajtów

Dane wejściowe i wyjściowe jako ciągi. Zwraca nthtermin sekwencji.

f=s=>s-(s=s.replace(/(.)\1/g,x=>x/5.5))?f(s):s

Wypróbuj online

  • 1 bajt zapisany dzięki Arnauldowi
  • 1 bajt zapisany dzięki tsh
Kudłaty
źródło
1
x[0]*2->x/5.5
tsh
Dzięki, @tsh. Nie pomyślałbym o tym.
Kudłaty
3

Perl 6 , 37 bajtów

{($_,{S:g[(\d)$0]=2*$0}...*==*)[*-1]}

Wypróbuj online!

Jest to funkcja, która generuje n-ty ciąg sekwencji, podając n jako argument.

($_, { ... } ... * == *)jest sekwencją kolejnych zmian liczby wejściowej, generowaną przez wyrażenie w nawiasach kwadratowych (proste podstawienie wyrażenia regularnego) i zatrzymuje się, gdy * == *, to znaczy, gdy dwie ostatnie liczby w sekwencji są równe. Następnie [*-1]przyjmuje tylko ostatni element tej sekwencji jako wartość zwracaną.

Sean
źródło
Można zapisać bajtów poprzez usunięcie ==*i zastąpienie *-1z $_, ponieważ nie zawsze są mniej niż nzamienniki dla wielu n. 33 bajty
Jo King
3

Siatkówka , 16 bajtów

+`(.)\1
$.(2*$1*

Wypróbuj online! Link zawiera przypadki testowe. Wyjaśnienie:

+`

Powtarzaj, aż sygnał wejściowy przestanie się zmieniać.

(.)\1

Zamień pary sąsiednich cyfr ...

$.(2*$1*

... z podwójną cyfrą. ( $1*generuje ciąg $1 _s, 2*powiela to i $.(przyjmuje długość. W rzeczywistości silnik Retina jest sprytniejszy niż to i po prostu podwaja się $1).

Neil
źródło
3

C # (.NET Core) , 231 , 203 , 200 , 196 , 192 bajty

EDYCJA: Funkcja ma teraz 185 bajtów plus 18 dla using System.Linq;

Dzięki BMO (dla 1> 0 jest równe true plus usunięcie nowego wiersza) i Mr. XCoder (dla instrukcji f =! F)!

EDYCJA 2: Do 182 bajtów plus 18 za using System.Linqpodziękowania dla Dany za podzielenie się kilkoma wskazówkami golfowymi!

EDYCJA 3: Dzięki Embodiment of Ignorance za int [] -> var, usunięcie zwarcia i& -> i oraz zmianę ToArray -> ToList! (178 bajtów + 18 przy użyciu)

EDYCJA 4: Wcielenie ignorancji zmniejszyło 4 bajty, zmieniając przypisanie. Atrapa mnie powinna się liczyć! Jeszcze raz dziękuję: D

p=>{var f=1>0;while(f){var t=p.Select(n=>n-48).ToList();p="";f=!f;for(var j=0;j<t.Count;j++){if(j<t.Count-1&t[j]==t[1+j]){p+=t[j]+t[++j];f=!f;continue;}p+=t[j];}};return p;};

Wypróbuj online!

Destroigo
źródło
2
174 przed użyciem
Embodiment of Ignorance
2

Japt v2.0a0 -h, 15 14 bajtów

Zwraca nthtermin sekwencji.

Æ=s_r/(.)\1/ÏÑ

Spróbuj

Powinno to działać przez 10 bajtów, ale wydaje się, że jest błąd w rekurencyjnej metodzie zastępczej Japt.

e/(.)\1/ÏÑ
Kudłaty
źródło
2

05AB1E , 11 bajtów

Δγε2ôSO}˜J

Wypróbuj online lub sprawdź wszystkie przypadki testowe .

Wyjaśnienie:

Δ             # Continue until the (implicit) input no longer changes:
 γ            #  Split the integer in chunks of the same adjacent digits
              #   i.e. 199999889 → [1,99999,88,9]
  ε     }     #  Map each to:
   2ô         #   Split it into parts of size 2
              #    i.e. 99999 → [99,99,9]
     S       #   Split each part into digits
              #    i.e. [99,99,9] → [[9,9],[9,9],[9]]
       O      #   And take the sum of each part
              #    i.e. [[9,9],[9,9],[9]] → [18,18,9]
         ˜    #  Flatten the list
              #   i.e. [[1],[18,18,9],[16],[9]] → [1,18,18,9,16,9]
          J   #  Join everything together
              #   i.e. [1,18,18,9,16,9] → 118189169
              # (And output the result implicitly at the end)
              #  i.e. output = 28189169
Kevin Cruijssen
źródło
2

Język Wolfram 108 bajtów

ToExpression[""<>ToString/@Total/@Flatten[Partition[#,UpTo@2]&/@Split@IntegerDigits@#,1]]&~FixedPoint~#&

Wyjaśnienie

IntegerDigits przekształca liczbę wejściową w listę jego cyfr.

Split grupuje kolejne powtarzające się cyfry.

Partition[#, UpTo@2]&/@ dzieli przebiegi podobnych cyfr na listy o długości co najwyżej 2.

Flatten[...,1] eliminuje sporadycznie nadmiernie zagnieżdżone nawiasy klamrowe - np. {{2,2}} staje się {2,2}

Total/@sumuje sumy sparowanych cyfr. Pojedyncze cyfry nie muszą być sumowane.

ToString konwertuje sumy (i pojedyncze cyfry) na ciągi.

""<> łączy wszystkie ciągi na liście.

ToExpression konwertuje wynik na liczbę całkowitą.

...~FixedPoint~#& stosuje tę funkcję, dopóki wynik nie przestanie się zmieniać.

DavidC
źródło
2

C # (interaktywny kompilator Visual C #) z flagą /u:System.Text.RegularExpressions.Regex, 70 bajtów

s=>{for(;s[0]!=(s[0]=Replace(s[0],@"(.)\1",m=>m.Value[0]*2-96+"")););}

Wyjścia poprzez modyfikację wejścia. Pobiera listę zawierającą jeden ciąg wejściowy.

Dzięki @dana za grę w golfa całe 23 bajty!

Wypróbuj online!

Wcielenie ignorancji
źródło
95 + 34 - 33 + 1 za dodatkowe miejsce, którego potrzebujesz w wierszu poleceń, iirc
tylko ASCII
Najpierw należy zdefiniować rekurencyjne funkcje anonimowe, a definicja jest uwzględniona w liczbie bajtów.
Embodiment of Ignorance
Och, to rekurencyjne
tylko
1
Miły! Wydaje mi się, że mogę to trochę obniżyć
Embodiment of Ignorance
To całkiem niezły wynik, biorąc pod uwagę, że to C # :)
dana
1

Czysty , 118 bajtów

import StdEnv,Data.List
$[a,b:t]|a==b=[1,(a*2)rem 10]%(1-a/5,1)++ $t=[a: $[b:t]]
$l=l

limit o iterate$o map digitToInt

Wypróbuj online!

Pobiera pierwszą powtarzaną wartość ( limit) z nieskończonej listy aplikacji ( iterate) lambdy wykonującej pojedynczy krok procesu zwijania. Dane wejściowe traktowane jako [Char].

Obrzydliwe
źródło
1

Czerwony , 84 83 80 bajtów

func[n][if parse s: form n[to some change[copy d skip d](2 * do d)to end][f s]s]

Wypróbuj online!

Zwraca nthtermin sekwencji.

Wyjaśnienie:

Red[]
f: func [ n ] [
    if parse s: form n [  ; parse the input converted to a string
        to some change [  ; find and change one or more
            copy d skip   ; digit (in fact any character, no predefined character classes)
            d             ; followed by itself
        ] (2 * do d)      ; with its doubled numeric value 
        to end            ; go to the end of the string
    ] [ f s ]             ; call the function with the altered string if parse returned true
    s                     ; finally return the string 
]
Galen Iwanow
źródło
1

C # (interaktywny kompilator Visual C #) , 111 bajtów

s=>{var t=s;do{s=t;t="";for(int i=0;i<s.Length;)t+=s[i]%48*(s[i++]!=(s+0)[i]?1:2*++i/i);}while(t!=s);return t;}

Wypróbuj online!

Ogromne uznanie dla @ASCII Tylko za grę w golfa ~ 30;) Na początku oboje publikowaliśmy aktualizacje jednocześnie, ale w pewnym momencie wyraźnie pojechał do miasta!

-2 dzięki @EmbodimentOfIgnorance!

Kod mniej golfowy ...

// s is the input as a string
s=>{
  // t is another string used
  // to hold intermediate results
  var t=s;
  // the algorithm repeatedly
  // processes s and saves the
  // result to t
  do{
    // copy the last result to s
    // and blank out t
    s=t;
    t="";
    // iterate over s
    for(int i=0;i<s.Length;)
      // append either 1 or 2 times
      // the current digit to t
      t+=s[i]%48*
        // compare the current digit
        // to the next digit. to prevent
        // an out-of-bounds exception,
        // append a 0 to s which either
        // gets ignored or collapses
        // to 0
        (s[i++]!=(s+0)[i]
          // if they are different, then
          // the multiplier is 1
          ?1
          // if they are the same, then
          // the multiplier is 2, and we
          // have to increment i
          :2*++i/i);
  }
  // continue this until the input
  // and output are the same
  while(t!=s);
  return t;
}
dana
źródło
139
Tylko
134
Tylko
@ASCIIOnly - Dobry ruch :) (s[i++]-48)*2=>s[i++]*2-96
dana
131
Tylko
1
114
Tylko