Odliczanie i recykling

14

Odliczanie

Twoim celem w tym golfowym wyzwaniu jest odliczanie, a tymczasem recykling liczb. Pozwól mi wyjaśnić.

Najpierw twoja aplikacja odczytuje liczbę jako argument programu lub za pomocą stdin. Następnie musisz po prostu odliczać w następujący sposób: 10 9 8 7 6(w kolejności malejącej )

Ale czekaj, jest więcej!

Recykling

Są sytuacje, w których możemy wydrukować każdy numer, ale nie wymieniaj każdego numeru, możemy dokonać recyklingu! Dam szybki przykład:

Input: 110

Output:   11091081071061051041031021010099... etc
Recycled:  10                        1

Nadal wymieniamy wszystkie liczby, 110, 109, 108, ale przetworzyliśmy cyfry 0 i 1 .

Inny przykład:

Input: 9900

Output:   9900989989897989698959894... etc
Recycled:        9 98  

Golf-wyzwanie

  • Przeczytaj liczbę (argument lub standardowe wyjście)
  • Wyświetlaj odliczanie w kolejności malejącej , jednocześnie przetwarzając wszystkie możliwe liczby (na standardowe wyjście lub plik)
  • Zatrzymaj się, gdy osiągniesz 1 LUB w momencie przetworzenia od 0 do 9 (cokolwiek stanie się najpierw)

Prosty przykład (do osiągnięcia 1):

Input: 15
Output: 15141312110987654321

(Notice the 110 instead of 1110)

Bardziej zaawansowany przykład (wszystkie poddane recyklingowi):

Input: 110
Output:   110910810710610510410310210100998979695949392919089887868584838281807978776757473727170696867665646362616059585756554535251504948474645443424140393837363534332313029282726252423221
Recycled:  10                            9                    8                    7                    6                    5                    4                    3                    2

(We've recycled all 0-9)
Roy van Rijn
źródło
1
Powiązane
Peter Taylor
2
To naprawdę nie jest w ogóle związane z problemem „jeden pierścień, by rządzić nimi wszystkimi”.
Czy
@RoyvanRijn w swoim pytaniu nie wspomniałeś o rosnącej kolejności - gdybym nie głosował tak blisko jak w duplikacie, powiedziałbym „niejasne, o co pytasz”. jeśli liczby muszą być w porządku rosnącym, to w jaki sposób 10 (w twoim drugim przykładzie) może znajdować się na początku sekwencji?
dumny haskeller
1
@proudhaskeller czy pytanie nie określa malejącej kolejności? „odliczanie” jest rozumiane jako oznaczające malejący porządek.
Czy
1
Roy, nie głosowałem za zamknięciem jako duplikat. Ale wyraźne wymienienie powiązanych pytań uzupełnia systemowe odgadywanie powiązanych pytań. @Will, oczywiście, że jest to powiązane. Usuń warunek wczesnego zatrzymania, a to pytanie wymaga wprowadzenia konkretnej nieoptymalnej strategii dla „jednego ciągu, który rządzi nimi wszystkimi”.
Peter Taylor

Odpowiedzi:

11

T-SQL - 291 277 267 217 199 191 166 158 153 145 142 128 117

Po podejściu do tego w nowy sposób udało mi się zejść do 145 (142 po kilku drobnych poprawkach), niezbyt odrapanych. Oznacza to, że mogę konkurować o srebro lub brąz. ^^

DECLARE @ INT=100;WITH N AS(SELECT 1A UNION ALL SELECT A+1FROM N WHERE A<@)SELECT LEFT(A,LEN(A)-1+A%11)FROM N ORDER BY-A

To nie drukuje listy, wybiera wyniki. Pytanie nigdy nie zawierało szczegółowych informacji na temat wyników, więc powinno być dobrze. To wciąż ma ten sam limit 100 na wejściu, częściowo dlatego, że nadużywam faktu, że co 11 termin poniżej 100 traci znak, a częściowo z powodu domyślnego limitu 100 rekurencji w typowych wyrażeniach tabelowych.

DECLARE @ INT=100;

WITH N AS
(
    SELECT 1A
    UNION ALL
    SELECT A+1
    FROM N
    WHERE A<@
)

SELECT LEFT(A,LEN(A)-1+A%11)
FROM N
ORDER BY-A
PenutReaper
źródło
1
Haha T-SQL, niezły!
Roy van Rijn
7

Python 143 147

def t(n):
 p=o='';r=0 # p is previous string, o is output string, r is recycled bitmap
 while n and r<1023: # 1023 is first 10 bits set, meaning all digits have been recycled
    s=`n`;i=-1 # s is the current string representation of n
       # i is from end; negative offsets count backwards in strings
    while p.endswith(s[:i])-1:i-=1 # find common ending with prev; s[:0] is '',
       # which all strings end with
    for j in s[:i]:r|=1<<int(j) # mark off recycled bits
    o+=s[i:];p=s;n-=1 # concatenate output, prepare for next number
 print o # done

Wcięcie pierwszego poziomu to spacja, drugi poziom to tabulator.

Wola
źródło
2
Niektóre standardowe zapisy p=o=''znaków: Dodaj do funkcji takie parametry jak opcjonalne parametry; można użyć *do andw n and r<1023a może nawet r<1023*n; while x-1:może ogolić przestrzeń jako while~-x. Ponadto może być krótsze użycie zestawu cyfr zamiast maski bitowej do przechowywania, które cyfry zostały użyte.
xnor
5

Haskell, 154 149 147 145 128 128 120 119 117 bajtów

import Data.List
(r%x)n|n>0&&r<":"=[(r\\t)%(x++(show n\\t))$n-1|t<-tails x,isPrefixOf t$show n]!!0|0<1=x
h=['0'..]%""

dodanie kontroli recyklingu kosztowało wiele znaków ... westchnienie

grał trochę w golfa, pamiętając, które cyfry nie zostały jeszcze przetworzone i zatrzymując się, gdy lista jest pusta. następnie grałem w golfa nieco bardziej, przechodząc do wyraźnej rekurencji i kilku innych sztuczek.

przykładowe dane wyjściowe:

*Main> h 110
"110910810710610510410310210100998979695949392919089887868584838281807978776757473727170696867665646362616059585756554535251504948474645443424140393837363534332313029282726252423221"
dumny haskeller
źródło
5

Python 2: 119 117

Oznaczając to jako wiki społeczności, ponieważ jest to bardziej golfowa wersja odpowiedzi Willa .

n=input()
d=s,={''}
exec"t=`n`;i=len(t)\nwhile(s*i)[-i:]!=t[:i]:i-=1\ns+=t[i:];d|=set(t[:i]);n-=len(d)<11;"*n
print s
trzęsienie ziemi
źródło
fantastyczny! Jak d=s,={''}działa
Czy
2
@Will d=s,={''}jest równoważne z d={''}; s,={''}. s,={''}używa rozpakowywania sekwencji, funkcji częściej stosowanej w instrukcjach takich jak a, b = (b, a), ale można go również użyć do wyodrębnienia jedynego elementu z sekwencji jednoelementowej.
trzęsienie ziemi
1
@flornquake O, mój błąd. Myślę, że nadal możesz to zrobić len(d)%11*n, choć wygląda na to , że jest to dyskusyjne przy użyciu pętli exec.
xnor
1
@Will Jako tło dla tego, dlaczego ta sprytna sztuczka jest skuteczna, ironicznie dłużej jest robić pusty zestaw set()niż zestaw z jednym elementem {x}. Tak więc flornquake inicjuje go elementem wypełniającym i sprawdza, czy ma wszystkie dziesięć cyfr, sprawdzając, czy ma jedenaście elementów. Ponieważ należy zainicjować pusty ciąg s, służy on jako ten element wypełniający, łącząc te inicjalizacje w celu zapisania znaków.
xnor
1
@ Will Tak, len(d)%11*nbyłoby miło. :)
trzęsienie ziemi
4

Rubin, 145 139 130 bajtów

n=gets.to_i
d=*?0..?9
s=''
n.times{|i|j=(t=(n-i).to_s).size;j-=1 while s[-j,j]!=u=t[0,j];d-=u.chars;s=t;$><<t[j..-1];exit if[]==d}

Podobne podejście do Willa, z tym, że nie używam maski bitowej, ale zestaw tablic nieużywanych cyfr. Wejście odbywa się przez STDIN.

Istnieje alternatywna wersja używająca whilezamiast, timesale cokolwiek spróbuję, liczba bajtów jest taka sama:

n=gets.to_i
d=*?0..?9
s=''
(j=(t=n.to_s).size;j-=1 while s[-j,j]!=u=t[0,j];d-=u.chars;s=t;$><<t[j..-1];exit if[]==d;n-=1)while 0<n
Martin Ender
źródło
3

CJam, 80 77 65 57 54 znaków

Prawdopodobnie wcale nie jest zoptymalizowany, ale Po wielu optymalizacjach i debugowaniu tutaj jest bezpośrednia konwersja mojej odpowiedzi ES6 w CJam:

Mr{s:C_,{:H<M_,H->=!_CH@-@}g:T>+:MCT<_O@-+:O,A<Ci(*}h;

Wypróbuj online tutaj . Funkcja przyjmuje numer jako STDIN i generuje odliczanie do recyklingu, zatrzymując się pomiędzy, jeśli recykling jest zakończony.

Spróbuję dalej zagrać w golfa.

Jak to działa:

Podstawową ideą jest to, że dla każdego numeru odliczania C sprawdź, czy pierwsze cyfry H są równe ostatnim cyfrom H wynikowego łańcucha, gdzie H zmienia się z liczby cyfr w C na 0

Mr                                    "Put an empty string and input on stack";
  { ... }h;                           "Run while top element of stack is true, pop when done";
s:C                                   "Store string value of top stack element in C"
   _,                                 "Put the number of characters in C to stack";
     { ... }g                         "Run while top element of stack is true";
:H<                                   "Store the digit iteration in H and slice C";
   M                                  "M is the final output string in making";
    _,H-                              "Take length of M and reduce H from it";
        >                             "Take that many digits of M from end and..."
         =!_                          "Compare with first H digits of C, negate and copy";
            CH@                       "Put C and H on stack and bring the above result to top of stack";
               -                      "Reduce H if the matched result was false";
                @                     "Bring the matched result on top in order continue or break the loop"
             :T                       "Store top stack element in T after the loop";
               >+:M                   "Take everything but first T digits of C and add it to M and update M";
                   CT<_               "Take first T digits of C and copy them";
                       O@             "Put saved digits on stack, and rotate top three elements";
                         -            "Remove all occurence of first T digits of C from O";
                          +:O         "Add first T digits of C to O and update O";
                             ,A<      "Compare number of saved digits with 10";
                                Ci(   "Decrement integer value of C and put it on stack";
                                   *  "If number of saved digits greater than 9, break loop";
Optymalizator
źródło
2

JavaScript ES6, 149 146 znaków

Taki pełny, wiele postaci, wow.

C=n=>{s=c='';while(n>0&s.length<10){j=1;while(t=(n+'').slice(0,-j++))if(c.endsWith(t)){s+=~s.search(t)?'':t;break}c+=(n--+'').slice(1-j)}return c}

Uruchom go w najnowszej konsoli internetowej Firefox.

Po uruchomieniu tworzy metodę, Cktórej możesz użyć podobnie

C(12)
12110987654321

AKTUALIZACJA : Czasami zwykły stary returnjest krótszy niż zamknięcie funkcji strzałki :)

Optymalizator
źródło
Nie powinien wyprowadzać cyfr, które zostały poddane recyklingowi, a jedynie odliczanie sekwencji po recyklingu
dumny haskeller
O! czy to ? Wszystkie jego przykłady również to dawały.
Optymalizator
@proudhaskeller Oh, wysyłam też przetworzone znaki. Dzięki, zaoszczędzi mi to trochę znaków.
PenutReaper,