Граф грак рухається 1D


31

Враховуючи позицію з рядом граків та / або порожніх пробілів, виведіть, скільки можливих різних переміщень шахрайства. Грак може переміщуватися вліво або вправо на порожнє місце, але не на той, який вимагає переходу іншого грака. Коли грак рухається, інші граки залишаються на місці.

Наприклад, з цієї позиції можливі 6 ходів :

.R..RRR.
  • Перший (крайній лівий) лад може перемістити 1 пробіл ліворуч або 1 або 2 пробіли праворуч (3 ходи)
  • Наступний лад може переміщати лише 1 або 2 пробіли (2 ходи)
  • Третій грак взагалі не може рухатися, оскільки він стиснувся між двома іншими граками (0 ходів)
  • Останній грак може рухатись лише на 1 пробіл (1 хід)

Зауважте, що позиція може взагалі не мати граків або взагалі порожніх пробілів.

Введення: Непорожній список (рядок, масив тощо) граків та порожніх пробілів. Ви можете представити їх у вигляді True/ False, 1/ 0, 'R'/ '.'або будь-яких двох послідовних відмінних однобайтових символів або одноцифрових чисел на ваш вибір. Ви самі вирішите, що означає грак, а що - порожній простір.

Вихід: Невід'ємне ціле число. Поплавці з цілою кількістю також добре.

Тестові справи

Вихід - число зліва.

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

Для більшої кількості тестових випадків наведено всі входи довжиною до 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

Відповіді:


9

Сітківка , 14 9 байт

w`_+R|R_+

Спробуйте в Інтернеті! Посилання включає тестові випадки. Використовує _порожній простір, оскільки це найприємніший персонаж, що не повторюється. Працює, підраховуючи кількість підрядів, які відповідають дійсному ходу Rook. Підрядка - це дійсний хід Rook, якщо він містить принаймні один _плюс одиничний Rна початку або в кінці.


О, ви в основному придумали, як зробити те, про що я згадував у своїй відповіді. Айк, чому я про це не думав.
mbomb007

9

Python 3 , 30 29 байт

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

Спробуйте в Інтернеті!

-1 байт завдяки @JoKing

Функція приймає рядок байт Python як вхід. Кожен порожній пробіл кодується у вигляді вкладки, а кожен грак кодується як байт, що b'\x00'має значення 0.

Обчислення еквівалентно тим lambda s:(s+s).strip().count(b'\t'), що має менший кількість байтів.


6

JavaScript (ES6),  38  33 байт

Збережено 5 байт завдяки @JoKing

Вводиться як рядок. Очікує пробіл для порожнього квадрата та будь-якого іншого символу для грака.

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

Спробуйте в Інтернеті!

Прокоментував

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 байт

Збережено 7 байт завдяки @Grimy

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

Спробуйте в Інтернеті!


1
Версію Python слід використовувати countзамість split( TIO )
Grimmy

@Grimy Дякую :)
Арнольд




3

Сітківка , 23 15 байт

Подвойте кількість пробілів між граками, греп-лініями принаймні одним граком, а потім підрахуйте кількість пробілів.

R.+R
$0$0
G`R
 

Спробуйте в Інтернеті!

Хоча програма використовує пробіли замість періодів, я додав код префікса, щоб надані тестові випадки легко вставлялися та використовувалися.

Я сподівався, що я можу використовувати збіги (?<=R.*) | (?=.*R), що перекриваються, але перекриття не настільки агресивні. Необхідно було б порахувати всі можливі способи відповідності, щоб повернути правильний результат за допомогою цього методу.


1
Здається, дає неправильний результат, .R.R.R.хоча, R.+Rможливо, допоможе змінити перший рядок ?
Ніл

@Neil Виправлено. Спасибі.
mbomb007

2

Желе , 6 байт

t1;ḟẠS

Спробуйте в Інтернеті!

Монадійне посилання, що містить список 0для ладья та 1пробілу та повертає ціле число з кількістю ходів. Посилання TIO приймає вкладений список можливих дощок, наведених у запитанні, перетворюється у потрібний формат і виводить обчислені та правильні відповіді.

Пояснення

t1     | Trim 1s from end
  ;    | Concatenate to input
   ḟẠ  | Filter out 1s if all input were 1s, otherwise filter out 0s
     S | Sum



2

Желе , 5 байт

ḲẈ+ƝS

Спробуйте в Інтернеті!

-1 завдяки Джонатану Аллану .

0представляють грак, 1являє собою порожній простір.


1
Якщо ви використовуєте пробіл для корінця, а інший символ для пробілу, ви можете використовувати п'ять:ḲẈ+ƝS
Джонатан Аллан

@JonathanAllan LOL не думав про це. А до цього я експериментував, але ṣ0замість цього використовував ...
Ерік Аутгольфер


2

C (стук) , 57 байт

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

Спробуйте в Інтернеті!

  • Збережено 1 завдяки @ceilingcat

Я зрозумів, що це не працює для порожніх списків .. Зараз це працює! Плюс збережено кілька байтів!

1 = грак. 0 = пробіл.

for (.. i + = n ++? - i: 1) // підраховує пробіли чи скидає зайві ходи => i = - ~ i ! * n ++ (@ceilingcat)

o + = * n? r = 1, i: r; // додає до виводу -i- (додаткові рухи), коли виконується грак плюс встановлює -r- (rook met), -i- буде очищено для збільшення вироку.

додає -r- для кожного місця (лайк, що відповідає гарантовано)


Скелі? Ваші скелі рухаються?
Щогли

1
@Mast lol вибачте! Редаговано
AZTECCO

2

Haskell , 36 байт

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

Спробуйте в Інтернеті!

Використовує 1 для порожнього місця, 0 для граку. Підраховує число 1 не в початковому блоці з одиниць і додає це до результату для зворотного рядка.


2

Haskell , 33 байти

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

Спробуйте в Інтернеті!

Анонімна функція, яка приймає введення як список 1s (пробіли) та 0s (rooks). Це обрізає пробіли від початку та в кінці списку, потім об'єднує дві версії списку та підсумовує їх.

Для використання GHC 8.4.1 або пізнішої версії для доступу до <>оператора без імпорту.







1

Java 11, 35 32 байти

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

Порт відповіді @Joel 's Python 3 .
-3 байти завдяки @Joel .

Використовує NULL-байт ( \0) для Rooks та вкладки ( \t) для пробілів.

Спробуйте в Інтернеті.

Я спробував використовувати s->(s+s).trim().chars().sum()/9спочатку як 31-байт, але це не працює, оскільки String#trimвбудований не тільки видаляє провідні та кінцеві пробіли / вкладки / нові рядки, але і всі інші байти, менші або рівні U+0020(unicode 32; пробіл) , тож він також видалить NULL-байти ..
Завдяки Джоелу за те, що він рекомендував мені новий String#stripвбудований Java 11+ (який я забув, що вони додали) як альтернативу. Цей також видаляє проміжні / провідні частини, але в цьому випадку лише пробіли , тому NULL-байти зберігаються.

Пояснення:

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

1
Java 11+ дозволяє String.strip()видаляти лише пробіли: 32 байти
Joel

@Joel Ах, зовсім забув про це! Спасибі. :)
Кевін Круїссен





1

C , 183 156 151 137 96 91 байт

Завдяки стельовій коті на 91 байт.

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 - грак, все інше - простір.

ТІО


Кілька речей - функція (замість повної програми) дозволена, ви можете розраховувати на невизначене поведінку (наприклад, автоматичне занулення), якщо ваша програма правильно працює принаймні на одному компіляторі, 82замість цього вона коротше використовувати, або 'R'коротше використання e+e*dніж e*(1+d), e=0,d=1;else e++; can be changed to e = -1, d = 1; e ++; , and b [a] `і b[++a]може бути замінено на *bта*++b
лише ASCII


0

x86-64 - 26 байт

Вхід - це масив до 32 біт і ціле число, що представляє кількість квадратів, 1 представляє грак, 0 представляє порожній.

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  

Копіює біти так, що він додається ліворуч від нього та видаляє кінцеві нульові біти. Потім отримує кількість провідних нульових біт і віднімає його від загальної кількості нульових біт.

x86-64 Код машини - 22 байти - шахові чини регулярної довжини.

Вхід - це 32-бітове ціле число з найменш значущим байтом, що складається з 8 біт, що представляють граки. 1 - грак, 0 порожній.

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  

Копіює біти в наступний значущий байт і видаляє кінцевий нульовий біт. Потім отримує кількість провідних нульових біт і віднімає його від загальної кількості нульових біт.


Отже, це працює лише для рядків рівною довжиною 8? Якщо так, то це здається трохи надто специфічним для виклику.
ar4093

Випадково припустили, що це регулярні рядові ряди, зафіксовані зараз.
мені '11
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.