Countdown und Recycling

14

Countdown

Ihr Ziel für diese Code-Golf-Herausforderung ist es, die Zahlen herunterzuzählen und in der Zwischenzeit zu recyceln . Lassen Sie mich erklären.

Zuerst liest Ihre Anwendung eine Zahl, entweder als Programmargument oder mit stdin. Als nächstes müssen Sie einfach wie folgt herunterzählen: 10 9 8 7 6(in absteigender Reihenfolge)

Aber warte, da ist noch mehr!

Recycling

Es gibt Situationen, in denen wir jede Nummer drucken können, aber nicht jede Nummer auflisten, wir können recyceln! Lassen Sie mich ein kurzes Beispiel geben:

Input: 110

Output:   11091081071061051041031021010099... etc
Recycled:  10                        1

Wir haben jetzt noch alle Zahlen aufgeführt, 110, 109, 108, aber wir haben eine 0 und eine 1 recycelt .

Ein anderes Beispiel:

Input: 9900

Output:   9900989989897989698959894... etc
Recycled:        9 98  

Code-Golf-Herausforderung

  • Lesen Sie eine Zahl (Argument oder stdin)
  • Geben Sie den Countdown in absteigender Reihenfolge aus, während Sie alle möglichen Zahlen (zu stdout oder file) recyceln.
  • Stoppen Sie, wenn Sie 1 erreichen ODER sobald Sie 0 bis 9 recycelt haben (was auch immer zuerst passiert)

Einfaches Beispiel (bis 1 erreicht ist):

Input: 15
Output: 15141312110987654321

(Notice the 110 instead of 1110)

Erweitertes Beispiel (alle recycelt):

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

(We've recycled all 0-9)
Roy van Rijn
quelle
1
Related
Peter Taylor
2
Es hat wirklich nichts mit dem Problem "Ein Ring, der alle regiert" zu tun.
Will
@RoyvanRijn du hast in deiner Frage nichts über aufsteigende Reihenfolge gesagt - wenn ich nicht als Duplikat von enger Abstimmung hätte, hätte ich auf "unklar, was du fragst". Wenn die Zahlen in aufsteigender Reihenfolge sein müssen, wie kann dann 10 (in Ihrem zweiten Beispiel) direkt am Anfang der Sequenz stehen?
stolzer Haskeller
1
@proudhaskeller Bestimmt die Frage nicht die absteigende Reihenfolge? Unter "Countdown" wird eine absteigende Reihenfolge verstanden.
Wird
1
Roy, ich habe nicht dafür gestimmt, als Duplikat zu schließen. Die explizite Erwähnung verwandter Fragen ergänzt das automatische Erraten verwandter Fragen durch das System. @ Will, natürlich ist es verwandt. Entfernen Sie die Bedingung für das vorzeitige Anhalten, und diese Frage fordert Sie auf, eine bestimmte, nicht optimale Strategie für die "eine Zeichenfolge, die sie alle beherrscht" zu implementieren.
Peter Taylor

Antworten:

11

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

Nachdem ich dies auf eine neue Art und Weise angegangen war, schaffte ich es, auf 145 (142 nach ein paar kleinen Änderungen) zu kommen, nicht zu schäbig. Das bedeutet, dass ich möglicherweise um Silber oder Bronze konkurrieren kann. ^^

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

Dadurch wird keine Liste gedruckt, sondern die Ergebnisse ausgewählt. Die Frage enthielt niemals Einzelheiten zur Ausgabe, daher sollte dies in Ordnung sein. Dies hat immer noch das gleiche Limit von 100 für die Eingabe, zum Teil, weil ich die Tatsache missbrauche, dass jeder 11. Term unter 100 ein Zeichen verliert, und zum Teil, weil die Standardrekursionsgrenze von 100 für allgemeine Tabellenausdrücke gilt.

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
quelle
1
Haha T-SQL, schön!
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

Einzug der ersten Ebene ist Leerzeichen, zweite Ebene ist Tabulatorzeichen.

Wille
quelle
2
Einige Standard- p=o=''Zeichensicherungen : Fügen Sie der Funktion optionale Parameter hinzu. Sie verwenden können , *für andin n and r<1023oder vielleicht sogar r<1023*n; while x-1:kann einen Raum als rasieren while~-x. Es kann auch kürzer sein, einen Satz von Ziffern anstelle einer Bitmaske zu verwenden, um zu speichern, welche Ziffern verwendet wurden.
Xnor
5

Haskell, 154 149 147 145 128 120 119 117 Bytes

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'..]%""

Das Hinzufügen bei der Recycling-Prüfung hat viele Charaktere gekostet ... seufz

Erinnerte sich ein wenig daran, welche Ziffern noch nicht recycelt wurden und hörte auf, wenn die Liste leer ist. Dann wurde ein bisschen mehr Golf gespielt, indem explizite Rekursionen und ein paar weitere Tricks angewendet wurden.

Beispielausgabe:

*Main> h 110
"110910810710610510410310210100998979695949392919089887868584838281807978776757473727170696867665646362616059585756554535251504948474645443424140393837363534332313029282726252423221"
stolzer haskeller
quelle
5

Python 2: 119 117

Markieren Sie dies als Community-Wiki, da es sich nur um eine Golfversion von Wills Antwort handelt .

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
Flornquake
quelle
Fantastisch! Wie funktioniert die d=s,={''}Arbeit?
Wird
2
@Will d=s,={''}ist äquivalent zu d={''}; s,={''}. s,={''}Verwendet das Entpacken von Sequenzen, eine Funktion, die häufiger in Anweisungen wie verwendet a, b = (b, a)wird. Sie können sie jedoch auch verwenden, um das einzige Element aus einer Sequenz mit nur einem Element zu extrahieren.
Flornquake
1
@flornquake Oh, mein Fehler. Ich denke, Sie können es trotzdem tun len(d)%11*n, obwohl es so aussieht, als würde es mit Ihnen über eine Exec-Schleife gehen.
Xnor
1
@Will Vor dem Hintergrund, warum dieser clevere Trick effizient ist, ist es ironischerweise länger, eine leere Menge set()als eine Einzelelementmenge zu erstellen {x}. Flornquake initialisiert es also mit einem Füllelement und prüft, ob es alle zehn Ziffern enthält, indem es feststellt, ob es elf Elemente enthält. Da die leere Zeichenfolge initialisiert werden muss s, dient sie als Füllelement und kombiniert diese Initialisierungen, um Zeichen zu sparen.
Xnor
1
@Will Ja, len(d)%11*nwäre nett gewesen. :)
Flornquake
4

Ruby, 145 139 130 Bytes

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}

Ähnlich wie bei Will, außer dass ich keine Bitmaske verwende, sondern stattdessen eine Reihe nicht verwendeter Ziffern. Die Eingabe erfolgt über STDIN.

Es gibt eine alternative Version, die whileanstelle von verwendet wird. timesWas auch immer ich versuche, die Anzahl der Bytes ist dieselbe:

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
quelle
3

CJam, 80 77 65 57 54 Zeichen

Wahrscheinlich gar nicht optimiert, aber nach vielen Optimierungen und Debugging ist hier die direkte Umsetzung meiner ES6-Antwort in CJam:

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

Probieren Sie es hier online aus . Die Funktion nimmt die Nummer als STDIN und gibt den recycelten Countdown aus, der nach Abschluss des Recyclings unterbrochen wird.

Ich werde versuchen, weiter Golf zu spielen.

Wie es funktioniert:

Die Grundidee ist, dass für jede Countdown-Nummer C überprüft wird, ob die ersten H-Stellen den letzten H-Stellen der resultierenden Zeichenfolge entsprechen, wobei H von der Anzahl der Stellen in C bis 0 reicht

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";
Optimierer
quelle
2

JavaScript ES6, 149 146 Zeichen

Solch wortreiche, viele Charaktere, 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}

Führen Sie es in der neuesten Firefox-Webkonsole aus.

Nach dem Ausführen wird eine Methode erstellt, Cdie Sie wie folgt verwenden können

C(12)
12110987654321

UPDATE : Manchmal ist plain old returnkürzer als das Schließen der Pfeilfunktion :)

Optimierer
quelle
Es sollte nicht ausgegeben , was Ziffern wurden recycelt, nur das Zählen Down - Sequenz nach dem Recycling
stolz haskeller
Oh! ist dass ? Alle seine Beispiele gaben das auch aus.
Optimierer
@proudhaskeller Oh, ich gebe auch die recycelten Zeichen aus. Danke, das erspart mir ein paar Zeichen.
PenutReaper