Die Eingabe ist ein Wort aus Kleinbuchstaben, die nicht durch Leerzeichen getrennt sind. Eine neue Zeile am Ende ist optional.
Das gleiche Wort muss in einer modifizierten Version ausgegeben werden: Verdoppeln Sie es für jedes Zeichen, wenn es das zweite Mal im Originalwort vorkommt, verdreifachen Sie es das dritte Mal usw.
Beispiel Eingabe:
bonobo
Beispielausgabe:
bonoobbooo
Es gelten die Standard-E / A-Regeln. Der kürzeste Code in Bytes gewinnt.
Von @Neil bereitgestellte Tests:
tutu -> tuttuu
queue -> queuuee
bookkeeper -> boookkkeeepeeer
repetitive -> repeetittiiveee
uncopyrightables -> uncopyrightables
abracadabra -> abraacaaadaaaabbrraaaaa
mississippi -> misssiisssssssiiipppiiii
Pyth, 6 Bytes
Vielen Dank an @Doorknob für das Abheben von 1 Byte.
Danke an @Maltysen für die 5 Bytes.
Probieren Sie es online!
Wie es funktioniert
Nehmen Sie zum Beispiel die Zeichenfolge
"bonobo"
.._
macht eine Liste:['b', 'bo', 'bon', 'bono', 'bonob', 'bonobo']
VQ._
bedeutet "die vorhergehende Funktion vektorisiert (parallel angewendet) überQ
und._
", was bedeutet, dassQ
(die ausgewertete Eingabe) als Liste behandelt wird:['b', 'o', 'n', 'o', 'b', 'o']
und dann werden sie wie folgt gepaart@
:Daher
@VQ._
wird produzieren['b', 'o', 'n', 'oo', 'bb', 'ooo']
.Das
s
fügt sie dann alle zusammen und erzeugt einen String'bonoobbooo'
, der dann implizit ausgedruckt wird, um zu werdenbonoobbooo
.quelle
VQ
bedeutet nur,for N in Q
wenn es sich nicht innerhalb einer Funktion befindet. In diesem Fall ist das, was eigentlich vor sich geht , dass die@V
Mittel die@
Funktion vektorisiert (parallel angelegt) über seine nächsten zwei Argumente,Q
und._
. Dies fehlt in den Dokumenten, daher werde ich es beheben.Retina ,
3419 BytesEinsparung von 15 Byte durch Anregung durch die isaacg-Lösung.
Die Anzahl der Bytes setzt die Kodierung nach ISO 8859-1 voraus.
Die führenden und nachfolgenden Leerzeilen sind signifikant.
Probieren Sie es online!
Erläuterung
Dies ist eine Ersetzungsstufe, die mit dem leeren regulären Ausdruck (dh jeder Position mit der Breite Null in der Zeichenfolge) übereinstimmt und
$`¶
diesen ersetzt, wobei$`
das Präfix der Übereinstimmung ist und¶
ein Zeilenvorschub eingefügt wird. Dies berechnet im Grunde genommen alle Präfixe und fügt sie zusammen mit dem letzten Zeichen dieses Präfixes in eine separate Zeile ein:Es wird einige führende und nachfolgende Zeilenvorschübe geben, aber wir können sie ignorieren.
Von jedem dieser Präfixe möchten wir die Zeichen behalten, die gleich dem letzten Zeichen sind. Dafür verwenden wir eine andere Ersetzungsstufe:
Das passt zu allem, was wir nicht behalten wollen und ersetzt es durch ein Nichts. Wir stimmen mit jedem Zeichen überein (verwenden,
\D
da wir wissen, dass die Eingabe keine Ziffern enthält) und stellen dann sicher, dass am Ende der Zeile keine weitere Kopie dieses Zeichens vorhanden ist .quelle
Python, 56 Bytes
Ich habe offenbar zwei Antworten von gleicher Länge:
Bearbeiten: Siehe @ pacholiks Antwort für einen kürzeren, alternativen Python-Ansatz.
quelle
+1
mit ausreichend hoher Priorität, so dass Parens nicht erforderlich sindHaskell, 39 Bytes
Anwendungsbeispiel:
f "bonobo"
->"bonoobbooo"
.Ganz anders als @ Damiens Antwort . Erstellt die Zeichenfolge von rechts, indem alle Vorkommen des letzten Zeichens aus der Zeichenfolge extrahiert und einem rekursiven Aufruf alle Zeichen bis auf das letzte vorangestellt werden.
quelle
> <> 27 Bytes
Erfordert den offiziellen Interpreter, der beim Versuch, den Codepunkt -1 zu drucken, mit einem Fehler beendet wird. Probieren Sie es online!
Der Code liest jedes Zeichen einzeln ein und verwendet die erste Zeile der Codebox als großes Array, in dem gespeichert wird, wie oft jedes Zeichen bisher gesehen wurde (> <> initialisiert Nicht-Programmzellen auf 0). Die zweite Zeile ist eine Schleife zum mehrmaligen Ausgeben eines Zeichens.
Alternativ ist hier eine Version, die sauber beendet wird (37 Bytes, nicht richtig golfen):
quelle
chr(-1)
. Der animierte DolmetscherJavaScript (ES6),
48-45ByteBearbeiten: 3 Bytes dank @ user81655 gespeichert.
quelle
Haskell,
504241 Bytes8 Bytes dank Lynn gespeichert
quelle
f t=[c|(i,c)<-zip[0..]t,j<-[0..i],c==t!!j]
MATL , 8 Bytes
Probieren Sie es online! Oder überprüfen Sie alle Testfälle auf einmal .
Erläuterung
quelle
Labyrinth ,
5425 BytesEine weitere Zusammenarbeit mit @ MartinBüttner, der eigentlich
am meistengetan hatfast alle der Golf für diese ein. Durch die Überarbeitung des Algorithmus ist es uns gelungen, die Programmgröße um einiges zu reduzieren!Probieren Sie es online!
Erläuterung
Ein kurzer Labrinth-Primer:
Labyrinth ist eine stapelbasierte 2D-Sprache. Es gibt zwei Stapel, einen Haupt- und einen Hilfsstapel, und das Abspringen von einem leeren Stapel ergibt Null.
An jeder Kreuzung, an der es mehrere Pfade gibt, auf denen sich der Befehlszeiger nach unten bewegen kann, wird die Oberseite des Hauptstapels überprüft, um festzustellen, wohin er als nächstes gehen soll. Negativ ist links abbiegen, Null ist geradeaus und positiv ist rechts abbiegen.
Die zwei Stapel von Ganzzahlen mit willkürlicher Genauigkeit sind hinsichtlich der Speicheroptionen nicht sehr flexibel. Um die Zählung durchzuführen, verwendet dieses Programm die beiden Stapel tatsächlich als Band, wobei das Verschieben eines Wertes von einem Stapel zum anderen der Bewegung eines Speicherzeigers um eine Zelle nach links / rechts gleicht. Es ist jedoch nicht ganz dasselbe, da wir auf dem Weg nach oben einen Schleifenzähler mitziehen müssen.
Zunächst wird mit
<
und>
an beiden Enden ein Versatz eingefügt, und die Codezeile wird um einen Versatz nach links oder rechts gedreht. Dieser Mechanismus wird verwendet, um den Code in einer Schleife laufen zu lassen - das<
Pops eine Null und dreht die aktuelle Zeile nach links, wobei die IP rechts vom Code steht, und das>
Pops eine weitere Null und repariert die Zeile zurück.Folgendes passiert bei jeder Iteration im Zusammenhang mit dem obigen Diagramm:
quelle
Perl, 17
(16-Byte-Code, +1 für -p)
Verwendungszweck:
quelle
Pyth, 7 Bytes
Testsuite
Testsuite dank DenkerAffe
Erläuterung:
quelle
Python 3, 52
quelle
f=lambda s:s and f(s[:-1])+s[-1]*s.count(s[-1])
PowerShell v2 +,
5247 BytesErstellt eine leere Hashtabelle und speichert sie in
$b
. Dies ist unser "Zähler" für die Buchstaben, die wir gesehen haben. Wir nehmen dann die Eingabe$args[0]
, wandeln sie in ein Zeichen-Array um und senden sie durch eine Schleife. Bei jeder Iteration nehmen wir das aktuelle Zeichen"$_"
und multiplizieren es mit dem vorinkrementierten Zähler mit dem angegebenen Wert, wodurch das erste Vorkommen mit1
, das zweite mit multipliziert wird2
usw. . Wir fassen dies mit einem zusammen,-join
sodass nur ein Wort ausgegeben wird.Dank TessellatingHeckler konnten 5 Byte mithilfe einer Hashtabelle anstelle eines Arrays eingespart werden, sodass das ASCII-Zeichen nicht um dekrementiert werden musste
97
, um den entsprechenden Index zu erreichen. Dies funktioniert, weil vor dem Inkrementieren des Hash-Index implizit.Add()
im Hintergrund aufgerufen wird, wenn dieser Index nicht vorhanden ist, da Hash- Tabellen veränderbar sind.quelle
Dyalog APL , 6 Bytes
TryAPL!
4 Funktionen ist eine Spitze (2-Zug) einer Gabel (3-Zug):
Zuerst
⊢
(rechts - ein No-Op) auf der angegebenen Zeichenfolge geben'bonobo'
Dann
,\
(Verkettungsscan) auf den String geben'b' 'bo' 'bon' 'bono' 'bonob' 'bonobo'
Die beiden werden zusammen mit (jeweils als rechtes und linkes Argument an gegeben)
∩¨
(Schnittmenge) gegabelt , dh('b'∩'b') ('bo'∩'o') ('bon'∩'n') ('bono'∩'o') ('bonob'∩'b') ('bonobo'∩'o')
welches ist'b' 'o' 'n' 'oo' 'bb' 'ooo'
Schließlich wird
∊
(enlist) auf das Ergebnis angewendet, um es zu verflachen und zu geben'bonoobbooo'
Hey, zumindest passt es zu Pyth ! Offensichtlich ist Jelly kürzer, da es sich um eine Golfversion von J handelt, bei der es sich wiederum um einen fortgeschrittenen 2-Zeichen-pro-Funktion-Dialekt von APL handelt.
quelle
Pyth, 11 Bytes
Probieren Sie es hier aus!
Erläuterung
quelle
J, 11 Bytes
Dies ist ein monadisches Verb. Probieren Sie es hier aus. Verwendungszweck:
Erläuterung
quelle
05AB1E , 10 Bytes
Code:
Erläuterung:
Verwendet die CP-1252- Codierung. Probieren Sie es online!
quelle
CJam, 14
Probieren Sie es online aus
Erläuterung:
quelle
Perl 6, 37 Bytes
quelle
> <> , 52 Bytes
Jeder gelesene Buchstabe wird gestapelt und für jeden ähnlichen Buchstaben im Stapel erneut gedruckt.
Es benutzt das
&
Register, weil es mühsam ist, mit 3 Variablen auf dem Stapel (aktueller gelesener Brief, Position im Stapel, Buchstabe an dieser Position) umzugehen.Sie können es hier ausprobieren !
quelle
Rust, 176 Bytes
Dies verwendet eine Map, um eine Zeichenfolge für jedes Zeichen in der Eingabe zu speichern. Für jedes Zeichen wird die Zeichenfolge aus der Map entfernt, mit dem Zeichen verknüpft, wieder in die Map eingefügt und an die Ausgabe angehängt.
Am liebsten hätte ich
get(...)
stattdessen verwendetremove(...)
, aber der Leihscheck hat mich umentschieden.quelle
Mathcad, 66 Bytes
Leider hat Mathcad keine besonders gute Zeichenkettenverarbeitung, daher habe ich die Eingabezeichenkette in einen Vektor konvertiert und dann einen (zeichencodeindizierten) Vektor verwendet, um die Häufigkeit zu verfolgen, mit der ein Zeichen angetroffen wird, wobei das Zeichen hinzugefügt wird Anzahl von Malen zu einem Ergebnisvektor. Schließlich wird der Ergebnisvektor zurück in eine Zeichenfolge konvertiert. Leider ziemlich lang.
Beachten Sie, dass Mathcad eine 2D-Whiteboard-Oberfläche mit einer Mischung aus normalem Text und Operatoren verwendet. Operatoren werden normalerweise über eine Symbolleiste oder eine Tastenkombination eingegeben. Beispielsweise gibt ctl- # den for-Schleifenoperator ein, der das Schlüsselwort für das Symbolelement und 3 leere "Platzhalter" für die Iterationsvariable, den Bereichs- bzw. den Textausdruck enthält. Typing [Wenn ein Variablenname in den Array-Indexmodus wechselt, gibt Typing 'ein übereinstimmendes Klammerpaar ein ( meistens gibt es Ausnahmen, je nachdem, was im umgebenden Ausdruck noch enthalten ist ).
quelle
Javascript ES6 44 Bytes
alte Antwort
Javascript ES6 46 Bytes
quelle
x
zum Eingabearrayq=>(x=[...q]).map(a=>x[a]=(x[a]||'')+a).join``
Julia,
3835 BytesI / O ist in der Form von Zeichenfeldern. Probieren Sie es online!
Wie es funktioniert
Wir definieren den monadischen Operator (neu) ! für unsere Zwecke.
Wann ? aufgerufen wird, prüft es, ob sein Argument s leer ist. Wenn dies der Fall ist, wird das Argument zurückgegeben.
Wenn s nicht leer ist, schneiden wir s mit seinem letzten Zeichen (
s[end]
), was alle Vorkommen dieses Zeichens in s ergibt . Dieses Ergebnis wird mit dem Rückgabewert eines rekursiven Aufrufs von ! Verknüpft. mit s minus dem letzten Zeichen (s[1:end-1]
) als Argument.quelle
PHP,
54515047 BytesLaufen Sie wie folgt:
Optimierungen
null
umint
für String - Offset, als String versetzt ist sowieso int gegossen$argn
anstelle von$argv
(thx Titus)quelle
$argn
mit-R
, um drei weitere Bytes zu speichern.-n
sollte dasselbe tun wie Ihr-d error_reporting
:n
steht fürno config file
, und in der Standardkonfiguration sind die Benachrichtigungen deaktiviert. also-nr
(bzw.-nR
) sollte ausreichen.Mathematica, 57 Bytes
Wir verwenden
c[x]
als Nachschlagetabelle, wie oft Zeichenx
bereits vorgekommen sind. Dieser Wert wird jedes Mal erhöht, wenn er abgerufen wirdx~StringRepeat~++c[x]
. Leider müssen wir die Nachschlagetabelle jedes Mal mit zurücksetzen, um die Funktion wieder verwendbar zu machenClear@c;c@_=0;
, was ziemlich teuer ist.quelle
awk, 72 bytes
Die Idee ist, die Anzahl der erscheinenden Zeichen in einem assoziativen Array zu speichern und das Zeichen diesmal auszudrucken.
quelle
Strahl, 32
3342BytesDies hätte kleiner sein sollen, aber ich habe einige Bytes verloren, die die Speichersteckplätze auf 0 initialisierten. Durch das Auswechseln einiger Flussrichtungen konnte viel leerer Speicherplatz beseitigt werden.
Probieren Sie es in diesem Snippet aus
Allgemeine Erklärung.
quelle
Python,
6662 BytesProbieren Sie es hier aus
Golf gespielt
Ungolfed
quelle