Policz ruchy wieży 1D

31

Biorąc pod uwagę pozycję z rzędem wież i / lub pustych przestrzeni, wypisz ile różnych ruchów wież jest możliwych. Wieża może przesunąć się w lewo lub w prawo na puste miejsce, ale nie na takie, które wymaga przejścia przez inną wieżę. Kiedy wieża się porusza, pozostałe wieże pozostają na swoim miejscu.

Na przykład z tej pozycji możliwe jest 6 ruchów :

.R..RRR.
  • Pierwsza (lewa skrajna) wieża może przesunąć się o 1 pole w lewo lub 1 lub 2 pola w prawo (3 ruchy)
  • Następna wieża może przenieść tylko 1 lub 2 pola do końca (2 ruchy)
  • Trzecia wieża w ogóle się nie porusza, ponieważ jest wciśnięta między dwie inne wieże (0 ruchów)
  • Ostatnia wieża może przesunąć tylko 1 pole w prawo (1 ruch)

Zauważ, że pozycja może w ogóle nie mieć wież lub w ogóle nie mieć pustych miejsc.

Dane wejściowe: niepusta lista (łańcuch, tablica itp.) Wież i pustych spacji. Możesz przedstawić je jako True/ False, 1/ 0, 'R'/ '.'lub dowolne dwa spójne odrębne jednobajtowe znaki lub jednocyfrowe liczby do wyboru. Od Ciebie zależy, która z nich oznacza wieżę, a która pustą przestrzeń.

Dane wyjściowe: nieujemna liczba całkowita. Również liczby zmiennoprzecinkowe są w porządku.

Przypadki testowe

Dane wyjściowe to liczba po lewej stronie.

6 .R..RRR.
0 .
0 R
4 R..RR
3 ...R
8 ..R..R..
0 ......

Aby uzyskać więcej przypadków testowych, tutaj są wszystkie dane wejściowe do długości 5.

0 .
0 R
0 ..
1 .R
1 R.
0 RR
0 ...
2 ..R
2 .R.
1 .RR
2 R..
2 R.R
1 RR.
0 RRR
0 ....
3 ...R
3 ..R.
2 ..RR
3 .R..
3 .R.R
2 .RR.
1 .RRR
3 R...
4 R..R
3 R.R.
2 R.RR
2 RR..
2 RR.R
1 RRR.
0 RRRR
0 .....
4 ....R
4 ...R.
3 ...RR
4 ..R..
4 ..R.R
3 ..RR.
2 ..RRR
4 .R...
5 .R..R
4 .R.R.
3 .R.RR
3 .RR..
3 .RR.R
2 .RRR.
1 .RRRR
4 R....
6 R...R
5 R..R.
4 R..RR
4 R.R..
4 R.R.R
3 R.RR.
2 R.RRR
3 RR...
4 RR..R
3 RR.R.
2 RR.RR
2 RRR..
2 RRR.R
1 RRRR.
0 RRRRR
xnor
źródło

Odpowiedzi:

9

Siatkówka , 14 9 bajtów

w`_+R|R_+

Wypróbuj online! Link zawiera przypadki testowe. Wykorzystuje _puste miejsce, ponieważ jest to najprzyjemniejsza postać nieregexowa. Działa poprzez zliczanie liczby podciągów, które odpowiadają prawidłowemu ruchowi Wieży. Podciąg jest prawidłowym ruchem Wieży, jeśli zawiera co najmniej jeden _plus pojedynczy Rna początku lub na końcu.

Neil
źródło
Och, w zasadzie wymyśliłeś, jak zrobić to, o czym wspomniałem w mojej odpowiedzi. Nie wiem, dlaczego o tym nie pomyślałem.
mbomb007
9

Python 3 , 30 29 bajtów

lambda s:sum((s+s).strip())/9

Wypróbuj online!

-1 bajt dzięki @JoKing

Funkcja pobiera ciąg bajtów Python jako dane wejściowe. Każde puste miejsce jest kodowane jako tabulator, a każda wieża jest kodowana jako bajt b'\x00'mający wartość 0.

Obliczenia są równoważne z lambda s:(s+s).strip().count(b'\t')mniejszą liczbą bajtów.

Joel
źródło
6

JavaScript (ES6),  38  33 bajtów

Zaoszczędź 5 bajtów dzięki @JoKing

Pobiera dane wejściowe jako ciąg. Oczekuje miejsca na pusty kwadrat i każdą inną postać na wieżę.

s=>(s+s).trim().split` `.length-1

Wypróbuj online!

Skomentował

s =>          // s = input, e.g. " R  RRR "
  (s + s)     // double -> " R  RRR  R  RRR "
  .trim()     // remove leading and trailing spaces -> "R  RRR  R  RRR"
  .split` `   // split on spaces -> [ 'R', '', 'RRR', '', 'R', '', 'RRR' ]
  .length - 1 // return the length - 1 -> 6

Python 2 ,  40  33 bajtów

Zaoszczędź 7 bajtów dzięki @Grimy

lambda s:(s+s).strip().count(' ')

Wypróbuj online!

Arnauld
źródło
1
Wersja Python powinna używać countzamiast split( TIO )
Grimmy
@Grimy Dziękuję. :)
Arnauld
5

Japt , 5 bajtów

²x èS

Spróbuj

²x èS        Implicit input string of U
²            U + U
 x           Remove trailing and leading whitespace
   èS        Number of spaces
Wcielenie ignorancji
źródło
4

Perl 6 , 16 bajtów

{+m:ex/s+R|Rs+/}

Wypróbuj online!

Wyrażenie regularne, które pasuje do wszystkich wyczerpujących wystąpień wież, po których występują spacje lub spacje, po których następuje wieża, i zwraca liczbę dopasowań.

Jo King
źródło
4

05AB1E , 5 bajtów

«ðÚð¢

Wypróbuj online!

«       # concatenate the input with itself
 ðÚ     # remove leading and trailing spaces
   ð¢   # count spaces
Ponury
źródło
3

Siatkówka , 23 15 bajtów

Dwukrotnie spacja między wieżami, linie grep z co najmniej jedną wieżą, a następnie policz liczbę spacji.

R.+R
$0$0
G`R
 

Wypróbuj online!

Chociaż program używa spacji zamiast kropek, dodałem kod prefiksu, aby podane przypadki testowe można było łatwo wkleić i użyć.

Miałem nadzieję, że uda mi się użyć nakładających się meczów (?<=R.*) | (?=.*R), ale nakładanie się nie jest aż tak agresywne. Musi liczyć wszystkie możliwe sposoby uzyskania dopasowania, aby zwrócić prawidłowy wynik za pomocą tej metody.

mbomb007
źródło
1
Wydaje się, że daje zły wynik, .R.R.R.chociaż zmiana pierwszej linii R.+Rmoże pomóc?
Neil
@Neil Naprawiono. Dzięki.
mbomb007
2

Galaretka , 6 bajtów

t1;ḟẠS

Wypróbuj online!

Monadyczny link pobierający listę 0forów i 1spacji i zwracający liczbę całkowitą z liczbą ruchów. Link TIO pobiera wklejoną listę możliwych tablic podanych w pytaniu, konwertuje do odpowiedniego formatu, a następnie wyświetla obliczone i poprawne odpowiedzi.

Wyjaśnienie

t1     | Trim 1s from end
  ;    | Concatenate to input
   ḟẠ  | Filter out 1s if all input were 1s, otherwise filter out 0s
     S | Sum
Nick Kennedy
źródło
2

Japt , 6 bajtów

Miejsca na spacje, każda inna postać dla wież.

²x ¸ÊÉ

Spróbuj

Kudłaty
źródło
1
Pokonaj o 10 minut: P
Oliver
Cholera, @Oliver! : p
Kudłaty
2

Ślimaki, 7 bajtów

Przynajmniej bije Retinę :)

o
\.+\R

Wypróbuj online!

feersum
źródło
2

Galaretka , 5 bajtów

ḲẈ+ƝS

Wypróbuj online!

-1 dzięki Jonathan Allan .

0reprezentują wieżę, 1reprezentują pustą przestrzeń.

Erik the Outgolfer
źródło
1
Jeśli użyjesz spacji dla Wieży i innej postaci, możesz użyć tej piątki:ḲẈ+ƝS
Jonathan Allan
@JonathanAllan LOL o tym nie pomyślał. A wcześniej eksperymentowałem, ale ṣ0zamiast
tego używałem
2

Stax , 7 6 5 bajtów

àσQ█ε

Uruchom i debuguj

Użyj tabu dla pustego kwadratu i dowolnej innej postaci dla wieży.

Jozuego
źródło
2

C (brzęk) , 57 bajtów

i,r,o;g(*n,z){for(o=r=i=0;z--;i=-~i*!*n++)o+=*n?r=1,i:r;}

Wypróbuj online!

  • Zapisano 1 dzięki @ceilingcat

Uświadomiłem sobie, że to nie działa na puste listy .. Teraz to działa! Plus zaoszczędziłem trochę bajtów!

1 = wieża. 0 = spacja.

for (.. i + = n ++? - i: 1) // zlicza spacje lub resetuje dodatkowe ruchy => i = - ~ i ! * n ++ (@ceilingcat)

o + = * n? r = 1, i: r; // dodaje do wyniku -i- (dodatkowe ruchy), gdy wieża jest spełniona plus zestawy -r- (wieża spełniona), -i- zostanie wyczyszczone w celu zwiększenia zdania.

dodaje -r- do każdego miejsca (gwarantowane spełnienie wieży)

AZTECCO
źródło
Skały Czy twoje skały się poruszają?
Maszt
1
@Mast Lol przepraszam! Edytowano
AZTECCO,
2

Haskell , 36 bajtów

f s=sum$snd.span(>0)=<<[s,reverse s]

Wypróbuj online!

Używa 1 do pustej przestrzeni, 0 do wieży. Zlicza liczbę jedynek nie w początkowym bloku jedynek i dodaje ją do wyniku dla odwróconego ciągu.

xnor
źródło
2

Haskell , 33 bajty

sum.(t.reverse<>t)
t=snd.span(>0)

Wypróbuj online!

Anonimowa funkcja, która przyjmuje dane wejściowe jako listę 1s (spacje) i 0s (gawrony). Spowoduje to przycięcie spacji od początku i końca listy, a następnie połączy dwie wersje listy i zsumuje je.

Wykorzystuje GHC 8.4.1 lub nowszy, aby mieć dostęp do <>operatora bez importowania go.

Jo King
źródło
1

Python 2 , 59 bajtów

def f(r):S=map(len,r.split('R'));return sum(S)*2-S[0]-S[-1]

Wypróbuj online!

Chas Brown
źródło
1

Java 11, 35 32 bajtów

s->(s+s).strip().chars().sum()/9

Port odpowiedzi @Joel na Python 3 .
-3 bajty również dzięki @Joel .

Używa NULL-bytes ( \0) dla wież i tabs ( \t) dla spacji.

Wypróbuj online.

Próbowałem użyć s->(s+s).trim().chars().sum()/9początkowo jako 31-bajtowego, ale to nie działa, ponieważ String#trimwbudowane nie tylko usuwa początkowe i końcowe spacje / tabulatory / nowe linie, ale także wszystkie inne bajty, które są mniejsze lub równe U+0020(Unicode 32; spacja) , więc będzie to usunąć NULL bajty jak dobrze ..
Dzięki Joel polecając mi nową Java 11+ String#strippolecenie wbudowane (które zapomniałem dodali) jako alternatywa. Ten usuwa również części końcowe / wiodące, ale w tym przypadku tylko białe znaki , więc zachowane są bajty NULL.

Wyjaśnienie:

s->                              // Method with String as parameter & integer return-type
  (s+s)                          //  Concatenate the input to itself
       .strip()                  //  Then trim all leading and trailing tabs
               .chars().sum()    //  Sum the unicode values of the remaining characters
                             /9  //  And divide it by 9 to get the amount of remaining tabs
Kevin Cruijssen
źródło
1
Java 11+ pozwala String.strip()na usuwanie tylko białych znaków: 32 bajty
Joel
@Joel Ah, zupełnie o tym zapomniałem! Dzięki. :)
Kevin Cruijssen
1

Perl 5 -MList::Util=sum -pF/R/ , 40 bajtów

$\=2*sum map$_=y///c,@F}{$\-="@F"+$F[-1]

Wypróbuj online!

Xcali
źródło
1

Stax , 7 6 bajtów

-1 bajt dzięki rekurencyjnemu

╣ë|óêπ

Uruchom i debuguj

Oliver
źródło
1
Dobra robota. Nawiasem mówiąc, można wykonać podtratę 1 v, co pozwoli ci zaoszczędzić bajt.
rekursywny
1

C , 183 156 151 137 96 91 bajtów

Dzięki pułapowi catcat za 91 bajtów.

c,e;char*z,b[9];main(d){for(gets(z=b);e=*z>81?c-=e*~!d,d=0:e+1,*++z;);printf("%i",d?:c+e);}

R to wieża, wszystko inne to przestrzeń.

TIO

girobuz
źródło
Kilka rzeczy - funkcja (zamiast pełnego programu) jest dozwolona, ​​możesz polegać na niezdefiniowanym zachowaniu (np. Automatyczne zerowanie), o ile twój program działa poprawnie na co najmniej jednym kompilatorze, jest krótszy do użycia 82lub 'R'krótszy do użyj e+e*dniż e*(1+d), e=0,d=1;else e++; can be changed to e = -1, d = 1; e ++; , and b [a] `i b[++a]mogą być zastąpione przez *bi*++b
tylko ASCII
0

Pyth , 7 bajtów

/r6*2Qd

Wypróbuj online!

Pobiera ciąg znaków Rdla wież, (spacja) dla pustych miejsc

/     d  # Count spaces in
 r6      #  Strip spaces from
   *2Q   #   2 * input() (= concatenation)
ar4093
źródło
0

x86-64 - 26 bajtów

Dane wejściowe to tablica zawierająca do 32 bitów i liczba całkowita reprezentująca liczbę kwadratów, 1 reprezentuje wieżę, 0 oznacza pustą.

C4 E2 69 F7 C1       shlx        eax,ecx,edx
0B C1                or          eax,ecx  
F3 0F BC C8          tzcnt       ecx,eax  
D3 E8                shr         eax,cl  
F3 0F BD C8          lzcnt       ecx,eax  
F7 D0                not         eax  
F3 0F B8 C0          popcnt      eax,eax  
2B C1                sub         eax,ecx  
C3                   ret  

Kopiuje bity, tak aby były dodawane po lewej stronie i usuwa końcowe bity zerowe. Następnie pobiera liczbę wiodących zerowych bitów i odejmuje ją od całkowitej liczby zerowych bitów.

x86-64 Kod maszynowy - 22 bajty - tylko szeregi szachowe zwykłej długości.

Dane wejściowe to 32-bitowa liczba całkowita z najmniej znaczącym bajtem złożonym z 8 bitów reprezentujących wieże. 1 to wieża, 0 jest pusta.

8A E9                mov         ch,cl  
91                   xchg        eax,ecx
F3 0F BC C8          tzcnt       ecx,eax
D3 E8                shr         eax,cl 
F3 0F BD C8          lzcnt       ecx,eax
F7 D0                not         eax  
F3 0F B8 C0          popcnt      eax,eax
2B C1                sub         eax,ecx
C3                   ret  

Kopiuje bity do następnego znaczącego bajtu i usuwa końcowe bity zerowe. Następnie pobiera liczbę wiodących zerowych bitów i odejmuje ją od całkowitej liczby zerowych bitów.

mnie'
źródło
Czy to działa tylko w przypadku wierszy o długości dokładnie 8? Jeśli tak, wydaje się to zbyt specyficzne dla tego wyzwania.
ar4093
Przypadkowo założono, że były to normalne szeregi wieżowe, teraz naprawione.
ja