Codierer versuchen immer, Arrays in langweilige eindimensionale Entitäten zu verwandeln, und das macht mich traurig.
Ihre Aufgabe ist es, eine beliebige Zeichenfolge zu glätten, um eine schöne Stadt-Himmelslandschaft auszugeben.
Betrachten Sie die Zeichenfolge: aaabbbbbccqrrssstttttttPPw
Es sieht viel besser so aus:
tt
tt
bb tt
bb tt
aabb sstt
aabbcc rrssttPP
aabbccqqrrssttPPww
(Ok, ja, die Buchstaben sind dupliziert, damit es mehr nach Skyline aussieht.)
Nimm eine Eingabezeichenfolge, dupliziere jeden Unterabschnitt der übereinstimmenden Zeichen (nicht unbedingt alphabetische Buchstaben) und baue mir eine Stadt!
Kürzeste Code-Bytes gewinnen.
Ich dachte eigentlich, ich hätte die Anforderungen genagelt, aber um einige Fragen zu beantworten:
- es muss auf dem Boden liegen
- Sie können zusätzlichen Himmel haben, wenn Sie möchten (führende Leerzeilen, umgebende Leerzeichen) - aber nicht zwischen den Gebäuden
- Buchstaben können innerhalb des Strings wiederverwendet werden (gleiche Architektur, unterschiedliche Position)
- Es wird angenommen, dass die Buchstaben ASCII sind, aber diejenigen, die zusätzliche Codierungen (UTF8 usw.) unterstützen, erhalten mehr Flair.
aaabbbbaa
?Antworten:
05AB1E , 6 Bytes
Probieren Sie es online!
In einer neueren Version als die Herausforderung wurde
ζ
als Ersatz für hinzugefügt.Bø
05AB1E , 8 Bytes
Erläuterung:
Probieren Sie es online!
quelle
z⁶
für.Bø
... aber es hat auchŒgx'2
fürγ€D
> _>γ.BD)ø˜øR»
was ich ohne hinzusehen hatte,€D
ist viel besser; Ich habe das Gefühl, dass wir beide die 1-Byte-Lösung für Inline-Duplizierung vermissen.CJam , 23 Bytes
Probieren Sie es online!
Erläuterung:
quelle
Gelee , 9 Bytes
Probieren Sie es online!
Erläuterung:
quelle
'
, die Listen selbst und nicht die darin enthaltenen Elemente zu wiederholen, aber insgesamt ist es gut. :)Python 3 ,
155136134132 Bytes-19 Bytes dank @LeakyNun
-2 Bytes dank @officialaimm
-1 Bytes dank @Wondercricket
Probieren Sie es online!
quelle
Python 2 , 117 Bytes
Probieren Sie es online!
quelle
Java 8,
412400330324312319 Bytes-6 Bytes dank VisualMelon
-12 Bytes dank Kevin Cruijssen,
aber +19 Bytes, weil ich vergessen habe, die Importe in die Byteanzahl einzubeziehen .
Probieren Sie es online!
quelle
i=0
oder besseri=l
, und herunterzählenfor(;i-->0;h=d>h?d:h)
(und dash=
Bit dort hineinstecken ). Die gleiche Rückzählung funktioniert auch für die innere Schleife. Das Innereif
braucht auch keine Zahnspange{}
. Und sei immer müde von<=
oder>=
, du kannst den Ternär mit umdrehen>
und ein Byte speichern.import java.util.*;
fürMap
undHashMap
, Importe sind Teil der Byteanzahl; und -1 durch Entfernen des nachgestellten Semikolons, was nicht der Fall ist Teil der Byteanzahl).import java.util.*;x->{Map m=new HashMap(),n;int l=x.length(),i=l,v,y,h=0,d=1;char c,k;for(;i-->0;m.put(c,d=m.get(c)!=null?d+1:1),h=d>h?d:h)c=x.charAt(i);for(y=h;y>0;y--){n=new HashMap(m);for(i=0;i<l;i++)if(n.get(k=x.charAt(i))!=null){v=(int)m.get(k);System.out.print((y>v?" ":k+""+k)+(i==l-1?"\n":""));n.remove(k);}}}
HashMap<>
→HashMap
;Map n=
→,n
undn=
;m.put(c,d=m.get(c)!=null?d+1:1);
in der for-Schleife, um die Klammern loszuwerden;k=x.charAt(i)
in derif(n.get(k)!=null)
, um die Klammern des Semikolons und der for-loop loszuwerden. Nochmals herzlich willkommen und tolle Antwort! +1 von mir. Für den Fall, dass Sie es noch nicht gesehen haben: Tipps zum Golfen in Java und Tipps zum Golfen in <jeder Sprache> könnten interessant sein, durchzulesen.Japt ,
1918151312 BytesSchließt nachfolgende Leerzeichen in jede Zeile ein.
Probier es aus
Erläuterung
quelle
Mathematica, 150 Bytes
quelle
R , 135 Bytes
Probieren Sie es online!
Liest von stdin, schreibt nach stdout (mit einem nachgestellten Zeilenumbruch).
Erläuterung:
rle
Ermittelt die Länge der Zeichenstreifen, die Höhe der einzelnen Türme.sub
Ausdruck ersetzt jedes Zeichen durch das Doppelte (so musste ich mich nicht mit dem Setzen benachbarter Indizes herumschlagen).sapply
gibt ein Array zurück (in diesem Fall eine Matrix):sum(e$l|1)
ist die Anzahl der verschiedenen Zeichen; wir gehen von oben nach untenifelse( ... )
ist eine Vektorisierung, dieif...else
es uns ermöglicht, eine Matrix aus Türmen und Doppelräumen zu bauenwrite
Schreibt in die Konsole mit einigen Formatierungsoptionen.quelle
Pyth , 13 Bytes
Probieren Sie es online!
quelle
PHP , 138 Bytes
Probieren Sie es online!
quelle
MATL , 15 Bytes
Probieren Sie es online!
Erläuterung
quelle
Kohle , 40 Bytes:
Probieren Sie es online! Link ist eine ausführliche Version des Codes. Ursprünglich habe ich eine einfache Schleife über die Eingabezeichenfolge versucht, um bei jeder Änderung des Buchstabens ein Rechteck auszudrucken, aber ich habe auf diese Listenerstellungsmethode umgestellt, da sie 5 Bytes sparte. Erläuterung: Die Variable
l
enthält eine verschachtelte Liste der eingegebenen Buchstaben. Zeichen, die mit den aktuellen Elementen der letzten Liste übereinstimmen, werden in die letzte Liste verschoben, andernfalls wird eine neue Unterliste für dieses Zeichen erstellt. Anschließend müssen die Buchstaben in jeder Unterliste zusammengefügt werden, damit sie zweimal vertikal gedruckt werden können.quelle
C
259231 BytesGolf Code
Ausführlicher Code
Kompiliert mit GCC, keine speziellen Flags
Bearbeiten
28 Bytes dank adelphus gespart. Seine Änderung erlaubte mir, eine Definition zu erstellen. Und ich habe die while-Schleifen zu for-Schleifen gemacht, um jeweils 2 Bytes zu sparen, indem ich die Schleife neu anordnete. Ich habe auch ein Problem behoben, bei dem der Code unterbrochen wurde, wenn das letzte eingegebene Zeichen kein Singleton war. Der Code schlägt fehl, wenn es nur einen eindeutigen Buchstaben gibt, sollte aber in allen anderen Fällen funktionieren.
quelle
while (i < strlen(argv[1]))
kann verkürzt werden ,while (argv[1][i])
bis Null - Zeichen - Schleife -Pip , 22 Bytes
21 Byte Code, +1 für
-l
Flag.Probieren Sie es online!
Erläuterung
quelle
QuadS , 15 + 1 = 16 Bytes
+1 Byte für das
1
Flag.Probieren Sie es online!
⊖⍵
Nachbearbeitung durch Umdrehen(.)\1*
Läufe mit identischen Zeichen2/⍪⍵M
duplizieren die kolumnifizierten M atchDas
1
Flag bewirkt, dass die Ergebnisse zusammengeführt werden.quelle
Haskell, 144 Bytes
Ich bin ziemlich zuversichtlich, dass ich es besser machen kann, aber dies ist das Beste, was ich mir vorerst einfallen lassen kann.
quelle
Data.List
die standardmäßig nicht im Umfang enthalten sind. Sie müssen entwederimport Data.List
die Byteanzahl erhöhen oder eine Haskell-Umgebung angeben, in der sie standardmäßig enthalten ist (z. B. die Sprache vonHaskell
nach ändernHaskell (lambdabot)
. - Einige Tipps: a) Verwenden Sie Pattern Guards, um Variablen zu binden, anstatt Hilfsfunktionen zulet
deklarieren direkt:l=length;f s|x<-groupBy(==)s,m<-... =concatMap
. b)map l x
istl<$>x
, c)concatMap("++\n"
istunlines
. d)groupBy(==)
ist gerechtgroup
. e)concat
istid=<<
. Du verwendest esm
nur einmal, also inline es()
heruml y
,replicate ... ' '
undmap ... x
. Alles in allem:import Data.List;l=length;f s|x<-group s=unlines$reverse$transpose$id=<<[[z,z]|z<-map(\y->y++replicate(maximum(l<$>x)-l y)' ')x]
.groupBy(==)
=group
, obwohl ich nicht sicher bin, ob einer im Prelude ist und der andere nicht.concatMap
kann geschrieben>>=
werden undmap
kann als<$>
, undconcat[[z,z]|z<-…]
könnte sein,(replicate 2)=<<…
oder(\z->[z,z])=<<…
(\z->[z,z])
is(:)<*>pure
, ie...transpose$(:)<*>pure=<<map(\y...)x
Gestapelt , 42 Bytes
Probieren Sie es online!
quelle
Ruby , 116 Bytes
Probieren Sie es online!
quelle
puts a.map{...}
kann ersetzt werden durchp(a.map{})
p
wird Anführungszeichen ausgeben, so dass es hier nicht passtAPL (Dyalog) , 37 Bytes
Probieren Sie es online!
quelle
q / kdb + 53 Bytes
Lösung:
Beispiel:
Erläuterung:
quelle
Perl 5 , 92 + 1 (-p) = 93 Bytes
Probieren Sie es online!
quelle