Bei dem Gerücht, dass Codegolf ein Rock-Paper-Scissors-Turnier veranstalten wird, beschäftigen Sie sich mit dem Thema der quadratfreien Wörter . Ein Wort der Buchstaben gemacht R
, P
, S
ist Platz frei , wenn es eine Sequenz, die wiederholt nicht zweimal enthalten. Das heißt, das Wort kann nicht als geschrieben werden
a x x b
wo a
und b
sind Wörter beliebiger Länge und x
ist ein Wort mit einer Länge von mindestens einem, alle Buchstaben gemacht R
, P
, S
.
Aufgabe
Ein Programm schreiben, das die erzeugt quadratfreie Wörter aus den Buchstaben R
, P
, S
der Länge , n
wo die Zahl 1 <= n <= 10
wird als Eingabe genommen.
Beispiel
Zum Beispiel sind die quadratfreien Wörter der Länge 3
RPR
, RSR
, RPS
, RSP
, SPS
, SRS
, SRP
, SPR
, PRP
, PSP
, PSR
,PRS
und die der Länge 4 sind
RPRS
, RPSR
, RPSP
, RSRP
, RSPR
, RSPS
, PRPS
, PRSR
, PRSP
, PSRP
, PSRS
, PSPR
, SRPR
, SRPS
, SRSP
, SPRP
, SPRS
,SPSR
und beachten Sie, dass zum Beispiel SPSP
oder PRPR
nicht quadratfrei sind
Regeln
- Dies ist Codegolf, kürzeste Programmgewinne, Standardlücken sind geschlossen.
- Sie können die Wörter drucken oder im Speicher erstellen.
- Ihr Programm kann als eine Funktion geschrieben werden.
Verweise
Wikipedia-Eintrag zu quadratfreien Wörtern
Die Anzahl der quadratfreien ternären Wörter der angegebenen Länge ist in https://oeis.org/A006156 angegeben
Verwandt: Ternäre Rechteckwörter beliebiger Länge
n>3
wäre eine gute Idee, da es einige Verwirrungen über wiederholte Zeichen gegenüber wiederholten Sequenzen gab.Antworten:
Ruby, 39 Bytes
Diese unglaublich ineffiziente Funktion generiert alle Zeichenfolgen der Länge N, die alphabetisch zwischen N Ps und N Ss liegen, und filtert dann die überwiegende Mehrheit heraus, die Nicht-RPS-Zeichen enthält. Die tatsächliche quadratPrüfung verwendet nur eine Regexp Rückreferenzierung:
(.+)\1
.Weitere idiomatische 65 Bytes , die in angemessener Zeit für N = 10 enden:
Edit: Speichert ein Byte dank G B.
quelle
Jelly ,
15 bis14 BytesProbieren Sie es online!
Wie es funktioniert
quelle
Retina , 28 Bytes
Probieren Sie es online!
Nimmt unäre Eingaben auf .
Erläuterung
Dies erzeugt alle Zeichenfolgen, die aus
RPS
der Länge bestehenn
. Auf diese Weise ersetzen wir1
in jeder Zeile wiederholt die erste . Denken sie über die Linie wie<1>
, wo<
alles vor dem Spiel ist und>
alles ist nach dem Spiel (sie sind$`
und$'
jeweils in regex Substitution Syntax, aber die Optik weniger intuitiv). Wir ersetzen die1
mitR>¶<P>¶<S
, wo¶
Zeilenvorschübe sind. So ist das vollständige Ergebnis dieser Substitution ist eigentlich<R>¶<P>¶<S>
, die drei Kopien der Linie sind, mit dem1
ersetzenR
,P
,S
jeweils in jedem der drei Kopien. Dieser Vorgang stoppt, sobald alle1
s ersetzt wurden.Schließlich verwerfen wir einfach alle Zeilen, die eine Wiederholung enthalten.
quelle
1(.*)
mit ,$1R¶$1P¶$1S
aber die Byte-Anzahl ist das gleiche.Schale ,
15 bis14 Bytes-1 Byte danke an Zgarb!
Probieren Sie es online!
Erstellt alle möglichen Sequenzen mit der richtigen Länge und behält nur die bei, deren alle Teilzeichenfolgen (außer der leeren) aus zwei verschiedenen Hälften bestehen.
Verdammt, ich wollte Jelly hier unbedingt schlagen.
quelle
Mathematica, 61 Bytes
Probieren Sie es online!
quelle
Java 8,
285277 BytesObwohl Java fast immer ausführlich ist, ist es in diesem Fall definitiv nicht die richtige Sprache für eine solche Herausforderung. Das Generieren von Permutationen mit Teilzeichenfolgen ist für die Leistung schlecht und ineffizient.
Kann aber definitiv noch mehr golfen werden.
-8 Bytes dank @Jakob .
Erläuterung:
Probieren Sie es hier aus. (Die Leistung ist für Testfälle über 3 zu schlecht, funktioniert jedoch lokal.)
quelle
n->p("",((1<<3*n)+"").replaceAll(".","PRS"),n)
. Auch, warum nicht Refactoringfor(;i<1;p(...));
zuwhile(i<l)p(...);
?for(;...;)
aus Codegolf-Habbit um ehrlich zu sein. Im schlimmsten Fall ist es die gleiche Anzahl von Bytes wiewhile(...)
im besten Fall kann etwas in die for-Schleife gestellt werden, um Bytes zu sparen. Deshalb versuche ich, überhaupt keinwhile
Codegolfing zu verwenden, weil es sowieso nie der Byteanzahl zugute kommt. Entweder wird es vergrößert oder es bleibt gleich, sodass ich mich persönlich nicht um die bessere Lesbarkeit kümmere. ;)PRS
Sequenzen generiert , während Ihre ursprüngliche Schleife eine Folge mit 2 ^ ( n -2) Sequenzen generiert hat.n
mal "PRS" ist richtig. Meins hat mehr generiert, weil es Bytes gespart hat (und die Leistung verringert hat, aber wen interessiert das mit Codegolf). ;)Python 3 ,
9796 BytesGibt eine Reihe von Zeichenfolgen zurück.
Probieren Sie es online!
quelle
Julia 0,6 , 65 Bytes
Probieren Sie es online!
quelle
Perl 5 , 37 Bytes
Probieren Sie es online!
Die Funktion gibt ein Array der quadratischen freien Zeichenketten zurück.
Erklärt:
Das
glob
erzeugt alle Kombinationen von R, S und P mit der Länge der Eingabe. Diegrep
Anweisung filtert diejenigen heraus, die nicht quadratfrei sind.quelle
R 97 Bytes
Probieren Sie es online!
combn(rep(c('p','r','s'),n),n,paste,collapse='')
berechnet allen
-Charakter Saiten mitp
,r
,s
, aber es leider viele (*) dupliziert, so dass wir es, und nehmen diejenigen uniquify, die die Regex(.+)\1
, perl-Stil Matching wir die resultierende Liste auszudrucken dann.(*) Technisch gesehen werden alle
3n
Buchstabenkombinationenp,r,s
dreimal hintereinander wiederholtn
und dannpaste(..., collapse='')
auf jede Kombination3^n
angewendet, anstatt die Zeichenfolgen direkt zu berechnen. Dies ist jedoch Golfspieler als einexpand.grid
(echtes kartesisches Produkt).quelle
JavaScript (Firefox 30-57), 69 Byte
Da alle Teilstrings von quadratfreien Wörtern auch quadratfrei sind, kann die Prüfung rekursiv durchgeführt werden.
quelle
Haskell ,
10198 BytesProbieren Sie es online!
quelle
JavaScript (ES6), 93 Byte
Wandelt alle Ganzzahlen von 0 auf 3ⁿ in (umgekehrt gepolsterte) Basis 3 um
RPS
und filtert sie nach quadratfreien Wörtern.quelle
Julia, 88
Nichts Außergewöhnliches.
quelle
C # / LINQ, 169
Es muss einen besseren Weg geben, dies zu tun :)
quelle
F #, 143
quelle
k, 56 Bytes
Der Mangel an nativem Regex lässt k ausnahmsweise einmal hinter der Kurve liegen. Ich entschied mich für eine rekursive Lösung, da die zu implementierenden Zeichen durch eine einfachere Überprüfung ohne Rechtecke gespeichert wurden.
ist ks ternärer Operator. Hier machen wir interessante Sachen für die Länge ungleich Null und geben eine einzelne leere Zeichenkette zurück, wenn wir nach Wörtern der Länge Null gefragt werden.
Nimmt das kartesische Produkt von "RPS" und allen n-1 längenquadratfreien Wörtern. , /: \: verbindet jedes Element von rechts nach links und ergibt ein Array der Länge 3 mit einer Länge von n Arrays. , / reduziert dies auf ein 3n-Array.
Nimmt die ersten n Buchstaben jeder Zeichenfolge und vergleicht sie mit den zweiten n. Reduziert dann das Array auf nur diejenigen, bei denen sie nicht übereinstimmen. Da wir wissen, dass das vorherige Ergebnis keine Quadrate enthält, müssen nur die Teilzeichenfolgen ab dem ersten Zeichen abgeglichen werden. Die Vereinfachung der Prüfung hat sich für die Zeichen gelohnt, die für die Implementierung der Rekursion aufgewendet wurden. Endlich,
Wendet das Lambda auf die erste Ergebnismenge auf der linken Seite an und iteriert über jede Teilzeichenfolgenlänge von 1 bis (Wortlänge) -1. ! x generiert eine Liste von 0 bis x-1, dann entfernt 1_ das erste Element (da Teilzeichenfolgen mit der Länge 0 immer übereinstimmen).
Wenn wir ein paar Zeichen opfern, können wir .zs verwenden, um auf sich selbst zu verweisen, anstatt uns auf den Funktionsnamen zu verlassen, und anstatt Teilzeichenfolgen bis zur Länge n-1 zu überprüfen, überprüfen Sie nur Floor (n / 2) auf Leistung. Es findet alle Länge 49 Wörter (von denen es 5207706 gibt) in ungefähr 120 Sekunden auf einem 7700k, darüber laufe ich in die 4 GB-Grenze von freiem 32-Bit-k.
quelle
Python 2 , 99 Bytes
Probieren Sie es online!
quelle