Angenommen, wir verwenden die folgenden Regeln, um eine einzelne Zeichenfolge aus einer anderen Zeichenfolge zu ziehen, die nur ASCII-druckbare Zeichen enthält und als *
-string bezeichnet wird. Wenn die Zeichenfolge ausgeht, bevor der Prozess angehalten wird, ist dies ein Fehler, und das Ergebnis des Prozesses ist in diesem Fall undefiniert:
- Beginnen mit
d=1, s=""
- Immer wenn Sie auf ein
*
treffen, multiplizieren Sied
mit 2. Immer wenn Sie auf ein anderes Zeichen treffen, verketten Sie es bis zum Endes
und subtrahieren 1 vond
. Wenn jetztd=0
, halt an und kehre zurücks
Definierte Beispiele :
d->d
769->7
abcd56->a
*abcd56->ab
**abcd56->abcd
*7*690->769
***abcdefghij->abcdefgh
Undefinierte Beispiele : (Beachten Sie, dass die leere Zeichenfolge auch eine davon sein würde.)
*7
**769
*7*
*a*b
*
Ihre Aufgabe ist es, eine Zeichenfolge zu nehmen und die kürzeste *
Zeichenfolge zurückzugeben, die diese Zeichenfolge erzeugt.
Programmbeispiele :
7->7
a->a
ab->*ab
abcd->**abcd
769->*7*69
Ihr Programm sollte alle Zeichenfolgen verarbeiten, die mindestens ein Zeichen und nur Nicht- *
ASCII-druckbare Zeichen enthalten. Sie können niemals Zeichenfolgen zurückgeben, für die der Prozess undefiniert ist, da sie per Definition keine Zeichenfolgen erzeugen können.
Es gelten Standard-Regelungslücken und I / O-Regeln.
*
?Antworten:
Pyth (
3627 Bytes)Danke an Jakube für die 9 Byte Verbesserung! Derzeit nicht so gut wie die Antwort von Schlammfischen , aber wie auch immer
Test Suite
Übersetzung in Python:
quelle
JavaScript (ES6), 61 Byte
Rekursive Funktion, die Folgendes ausführt:
Wenn
d
kleiner oder gleich der verbleibenden Zeichenfolgenlänge geteilt durch 2 ist:*
An Ausgabe anhängen undd
mit 2 multiplizierenSonst:
Verschieben Sie den String und hängen Sie ihn an die Ausgabe an. Subtrahieren Sie 1 von
d
.Sehen Sie es in Aktion:
quelle
f=(s,d=2)=>s?d>s.length?s[0]+f(s.slice(1),d-2):'*'+f(s,d*2):s
Pyth,
2927( Festgestellt, gebrochen)272625 BytesErklärung zu kommen.
Test Suite
quelle
C 125 Bytes
Dies nutzt das sehr regelmäßige Muster der Sternpositionen aus, um die richtige Codierung auszugeben. Anfangs habe ich eine rekursive Bruteforce-Lösung ausprobiert, aber im Nachhinein hätte es offensichtlich sein müssen, dass es eine einfachere mathematische Lösung gab.
Grundsätzlich haben Sie immer
2^floor(log_2(length))
Sterne am Anfang Ihrer Ausgabe und einen letzten Stern nach den2^ceil(log_2(length)) - length
Zeichen (wenn dies mindestens 1 Zeichen ergibt).Die (leicht) ungolfed Version ist wie folgt
quelle
JavaScript (ES6),
8877 BytesZuerst dachte ich, das
abcde
müsste sein,*a**bcde
aber es stellt sich heraus, dass**abc*de
das genauso gut funktioniert. Dies bedeutet, dass die Ausgabe leicht unter Verwendung der führenden Sterne des Bodens (log & sub2; (s.length)) plus eines zusätzlichen Sterns für Zeichenketten konstruiert werden kann, deren Länge keine Potenz von zwei ist.Bearbeiten: 8 Bytes durch rekursives Berechnen der Anzahl der führenden Sterne gespeichert. Weitere 3 Bytes wurden durch Zeichenfolgen mit Sondergehäusen der Länge 1 gespeichert, sodass Zeichenfolgen mit einer Länge von 2 Potenzen als zusätzlicher führender Stern behandelt werden können.
quelle
Haskell, 68 Bytes
Genau wie die anderen Antworten. Bei EOF wird eine leere Zeichenfolge ausgegeben. Wenn die verbleibende Länge mehr als das Doppelte beträgt
d
, geben Sie einen Stern und das Doppelte ausd
. Ansonsten geben Sie das nächste Zeichen aus und subtrahieren eines vond
.Ungolfed:
quelle