Po plotce, że Codegolf zorganizuje turniej Rock-Paper-Scissors , przyjrzysz się słowu bez kwadratów . Słowo z liter R
, P
, S
jest plac wolne , jeśli nie zawierają sekwencję który powtarza dwukrotnie. To znaczy, słowa tego nie można zapisać jako
a x x b
gdzie a
i b
są wyrazy o dowolnej długości i x
jest słowem o długości co najmniej jeden, wszystkie wykonane z liter R
, P
, S
.
Zadanie
Napisz program, który generuje kwadratowych wolnej od słów z liter R
, P
, S
długości n
, w których liczba 1 <= n <= 10
jest traktowana jako wejścia.
Przykład
Na przykład słowa bez kwadratów o długości 3 to
RPR
, RSR
, RPS
, RSP
, SPS
, SRS
, SRP
, SPR
, PRP
, PSP
, PSR
,PRS
a te o długości 4 są
RPRS
, RPSR
, RPSP
, RSRP
, RSPR
, RSPS
, PRPS
, PRSR
, PRSP
, PSRP
, PSRS
, PSPR
, SRPR
, SRPS
, SRSP
, SPRP
, SPRS
,SPSR
i zauważ, że na przykład SPSP
lub PRPR
nie są kwadratowe
Zasady
- To jest codegolf, najkrótszy program wygrywa, standardowe luki są zamknięte.
- Możesz wydrukować słowa lub utworzyć je w pamięci.
- Twój program może być napisany jako funkcja.
Referencje
Wpis w Wikipedii dotyczący słów bez kwadratów
Liczba kwadratowych słów trójskładnikowych o podanej długości znajduje się w https://oeis.org/A006156
Powiązane: Arbitrary-Length Ternary Squarefree Słowa
n>3
byłby dobrym pomysłem, ponieważ pojawiły się pewne nieporozumienia dotyczące powtarzanych znaków w porównaniu z powtarzanymi sekwencjami.Odpowiedzi:
Rubin, 39 bajtów
Ta przezabawnie nieefektywna funkcja generuje wszystkie ciągi długości N, które leżą alfabetycznie między N Ps i N Ss, a następnie odfiltrowuje ogromną większość, która zawiera znaki spoza RPS. Rzeczywista kontrola kwadratem po prostu wykorzystuje wstecznych RegExp:
(.+)\1
.Więcej idiomatycznych 65 bajtów, które kończą się w rozsądnym czasie dla N = 10:
Edycja: Zapisano bajt dzięki G B.
źródło
Galaretka ,
1514 bajtówWypróbuj online!
Jak to działa
źródło
Siatkówka , 28 bajtów
Wypróbuj online!
Pobiera dane wejściowe jednoargumentowe .
Wyjaśnienie
Generuje to wszystkie ciągi złożone
RPS
z długościn
. Robimy to w ten sposób, że wielokrotnie zastępujemy pierwszą1
w każdej linii. Pomyślmy o linii jako<1>
, gdzie<
jest wszystko przed meczem i>
wszystko po meczu (są one$`
i$'
odpowiednio w składni podstawienia wyrażenia regularnego, ale te wyglądają mniej intuicyjnie). Możemy wymienić1
zR>¶<P>¶<S
, gdzie¶
są karetki. Tak pełny wynik tego podstawienia jest w rzeczywistości<R>¶<P>¶<S>
, która jest trzy kopie linii, przy czym1
zastąpićR
,P
,S
, odpowiednio, w każdym z trzech egzemplarzach. Proces ten kończy się, gdy wszystkie1
s zostaną zastąpione.Wreszcie po prostu odrzucamy wszystkie wiersze zawierające powtórzenie.
źródło
1(.*)
z$1R¶$1P¶$1S
ale bajt-count jest taka sama.Łuska ,
1514 bajtów-1 bajt dzięki Zgarb!
Wypróbuj online!
Buduje wszystkie możliwe sekwencje o prawidłowej długości i zachowuje tylko te, których wszystkie podłańcuchy (oprócz pustego) składają się z dwóch różnych połówek.
Cholera, naprawdę chciałem pokonać Jelly tutaj.
źródło
Mathematica, 61 bajtów
Wypróbuj online!
źródło
Java 8,
285277 bajtówChociaż Java jest prawie zawsze gadatliwa, w tym przypadku zdecydowanie nie jest to odpowiedni język do takich wyzwań. Generowanie permutacji z podciągami jest szkodliwe dla wydajności i nieefektywne.
Zdecydowanie można jednak jeszcze zagrać w golfa.
-8 bajtów dzięki @Jakob .
Wyjaśnienie:
Wypróbuj tutaj. (Wydajność jest zbyt niska dla przypadków testowych powyżej 3, ale działa lokalnie ..)
źródło
n->p("",((1<<3*n)+"").replaceAll(".","PRS"),n)
. Ponadto, dlaczego niefor(;i<1;p(...));
dokonać refaktoryzacjiwhile(i<l)p(...);
?for(;...;)
szczerze mówiąc, zawsze używam kodegolfing-habbit. W najgorszym przypadku jest to ta sama liczba bajtówwhile(...)
, co w najlepszym przypadku coś można umieścić wewnątrz pętli for, aby zaoszczędzić bajty. Dlatego staram się po prostu nie używaćwhile
w kodegolfingu, ponieważ i tak nigdy nie korzysta z liczenia bajtów. To albo go zwiększa, albo pozostaje takie samo, więc osobiście nie zawracam sobie głowy lepszą czytelnością. ;)PRS
sekwencji, podczas gdy twoja oryginalna pętla wygenerowała jedną z 2 ^ ( n -2) sekwencjami.n
razy „PRS” jest poprawny. Mój generował więcej, ponieważ oszczędzał bajty (i zmniejszał wydajność, ale kogo to obchodzi z codegolfem). ;)Python 3 ,
9796 bajtówZwraca zestaw ciągów.
Wypróbuj online!
źródło
Julia 0.6 , 65 bajtów
Wypróbuj online!
źródło
Perl 5 , 37 bajtów
Wypróbuj online!
Funkcja zwraca tablicę kwadratowych wolnych ciągów.
Wyjaśnił:
glob
Generuje wszystkie kombinacje R, S i P, o długości równej wejściu. Tegrep
filtry oświadczenie, te, które nie są kwadratowe darmo.źródło
R , 97 bajtów
Wypróbuj online!
combn(rep(c('p','r','s'),n),n,paste,collapse='')
oblicza wszystkien
dwuznakowe strunyp
,r
,s
, ale niestety powiela wiele (*), więc uniquify go i wziąć te, które pasują do wyrażenia regularnego(.+)\1
, używając Perl dopasowanie stylu, potem wydrukować listę wynikową.(*) technicznie generuje wszystkie kombinacje
3n
literp,r,s
powtarzane 3 razy,n
a następnie stosuje siępaste(..., collapse='')
do każdej kombinacji zamiast3^n
bezpośrednio obliczać ciągi, ale jest to bardziej golfowe niżexpand.grid
(prawdziwy produkt kartezjański).źródło
JavaScript (Firefox 30-57), 69 bajtów
Ponieważ wszystkie podciągi słów bez kwadratów są również pozbawione kwadratów, sprawdzanie można wykonać rekurencyjnie.
źródło
Haskell ,
10198 bajtówWypróbuj online!
źródło
JavaScript (ES6), 93 bajty
Konwertuje wszystkie liczby całkowite od 0 do 3ⁿ do (odwróconej) bazy 3 za pomocą
RPS
cyfr i filtruje je pod kątem słów bez kwadratów.źródło
Julia, 88 lat
Nic fajnego.
źródło
C # / LINQ, 169
Musi być lepszy sposób na to :)
źródło
F #, 143
źródło
k, 56 bajtów
Brak natywnego wyrażenia regularnego stawia raz wartość k za krzywą. Poszedłem z rozwiązaniem rekurencyjnym, ponieważ postacie, które go wdrożyły, zostały zapisane przez prostsze sprawdzenie bez kwadratów.
jest trójskładnikowym operatorem k, tutaj robimy ciekawe rzeczy dla niezerowej długości i zwracamy pojedynczy pusty ciąg, jeśli zostaniesz zapytany o słowa o zerowej długości.
bierze iloczyn kartezjański „RPS” i wszystkich kwadratowych słów o długości n-1. , /: \: łączy każdy element od prawej do lewej, dając tablicę o długości 3 o długości n tablic. , / spłaszcza to do tablicy o długości 3n.
bierze pierwsze n liter każdego łańcucha i porównuje je z drugim n, a następnie redukuje tablicę tylko tam, gdzie się nie zgadzają. Ponieważ wiemy, że poprzedni wynik nie zawiera kwadratów, tylko podciągi zaczynające się od pierwszego znaku wymagają dopasowania - uproszczenie zaznaczenia tutaj było warte znaków spędzonych na rekurencji. Wreszcie,
stosuje lambda do początkowego zestawu wyników po jego lewej stronie, iterując po każdej długości podłańcucha od 1 do (długości słowa) -1. ! x generuje listę od 0 do x-1, a następnie 1_ usuwa pierwszy element (ponieważ podciągi o długości 0 zawsze będą pasować)
Poświęcając kilka znaków, możemy użyć .zs do samodzielnego odwoływania się, zamiast polegać na nazwie funkcji, i zamiast sprawdzać podciągi do długości n-1, sprawdzamy tylko wydajność podłogi (n / 2). Znajduje całą długość 49 słów (z których jest 5207706) w około 120 sekund na 7700k, powyżej tego dochodzę do limitu 4 GB wolnego 32-bitowego k.
źródło
Python 2 , 99 bajtów
Wypróbuj online!
źródło