Інвертувати деякі комутатори на комутаційному щиті


23

Натхненний цим викликом .

Мета:

Враховуючи заздалегідь налаштований розподільний щит та перелік індексів, інвертуйте комутатори на задані індекси.

Комутаційний щит складається з деякої кількості вимикачів ( vабо ^), загорнутих у них -і розташованих у ряди різної довжини. Ось приклад комутатора:

-v-^-v-
-^-v-
-v-^-v-

Інвертувати / перевернути перемикач означає змінити його vна ^або переключити ^на v.

Перемикачі індексуються зліва направо, зверху вниз. Наприклад, у наведеному вище прикладі останній vу першому рядку знаходився б у положенні 3, а ^в середньому ряду - у 4 (використовуючи 1-індексацію).

Вхід:

  • Рядок (або список струн), що представляє розподільний щит. Це гарантовано відповідає рівню ((-[v^])+-)(\n(-[v^])+-)*.
  • Можливо порожній список номерів, що представляють індекси, може бути індексованим 0 або 1 (або якесь довільне число, якщо ви хочете). Це вимикачі, які потрібно перевернути.

Вихід:

  • Комутатор тієї самої форми, що і вхід із вказаними перемикачами. Будь-які невизначені комутатори повинні зберігати свій початковий стан.

Правила:

  • Введення завжди буде правильно відформатовано, і жоден заданий індекс не вийде за межі.
  • Список індексів буде відсортований і не буде дублікати.
  • Вказуйте у своїй відповіді, яке індексування ви використовуєте, будь то 0, 1 або якесь довільне.
  • Тривалість пробілів є прекрасною, доки вихід буде схожий на вхід.
  • Це тому виграє найкоротший код.

Приклади:

#Using 1-indexing
input: #Empty Case
[],
-v-^-v-

output:
-v-^-v-

input: #Single switch
[1],
-v-

output:
-^-

input: #Skip a line
[3,5],
-^-v-v-
-v-
-^-^-

output:
-^-v-^-
-v-
-v-^-

input: #Flip one in each line + number wrap
[3,4,6],
-^-v-v-
-v-
-^-^-

output:
-^-v-^-
-^-
-^-v-

input: #Flip 'em all
[1,2,3,4,5,6],
-^-v-v-
-v-
-^-^-

output:
-v-^-^-
-^-
-v-v-

Чи можемо ми вивести прямокутний масив знаків, проклавши праворуч коротші лінії з пробілами? Чи можемо ми взяти вклад у цій формі?
Луїс Мендо

@LuisMendo Я збираюся сказати «Ні», коли я це сприймав. Проміжок білого простору тонкий, якщо він схожий на вхід.
Веська

2
Підказка тим, хто перевіряє, чи є символи >"-": Оскільки введений рядок гарантовано починається -, ви можете перевірити ім'я параметра / аргументу / змінної, яке ви використовуєте для цього.
Кудлатий

Відповіді:


11

Vim, 60, 46, 38 , 37 байт / натискання клавіш

qq/\d
ggDJ@"/[v^]
sv^<esc>l?\V<C-r>"
x@qq4u@q

<esc>і <C-r>обидва є байтом / натисканням клавіш. Лічильник байтів

Тестовий випадок 1 (Докладний режим)

Тестовий випадок 2 (Докладний режим)

Дякую Гримі за ідеї, які призвели до скорочення на 22 байти :)


2
@Veskah ughhhhhh vim дуже вибагливий щодо кращих справ "зробити щось 0 разів". Дивіться правки
DJMcMayhem

Не може :s/\%V./\='v^'[submatch(0)=='v']бути cl<C-R>='v^'['<C-R>"'=='v']-13 байт? (кожен <CR> - лише один байт).
Grimmy

2
@Grimy Ooh, хороша ідея. Також s == cl, в -14цілому.
DJMcMayhem

Інші ідеї: s^v!<Esc>?\<C-R>"<CR>xhf!xабо s<CR>^v<Esc>:s/\V<C-R>"<CR>kgJ.
Grimmy

1
Я подумав про це, але це не вдається, якщо символ, який потрібно перевернути, знаходиться в кінці рядка ... але тоді вхідна специфікація гарантує, що за ним слід a -, тож насправді це працює! Дух.
Grimmy


4

K (oK) , 31 27 байт

Рішення:

`0:{@[x;(&x>93)y;"^v"94=]};

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

Пояснення:

Швидка відповідь, спробуємо пограти в гольф. 0-індексований.

`0:{@[x;(&x>93)y;"^v"94=]}; / the solution
`0:                       ; / print to stdout
   {                     }  / lambda taking 2 implicit args x & y
    @[ ;        ;       ]   / apply @[var;index;function]
                     94=    / 94 (ASCII "v") equal to? returns 0 or 1
                 "v^"       / index into "v^" (ie flip switch)
               y            / index into
        (     )             / do this together
          x>93              / x greater than 93 (ASCII "]")
         &                  / indices where true
      x                     / apply to x

Примітки:

  • -4 байти завдяки >93хитрістю

3

Python 3 , 140 134 103 байт

(-30 завдяки DJMcMayhem ♦, -1 ще більше завдяки Black Owl Kai)

def f(i,y,x=1):
 for c in y:q=c>'-';p=len(i)and x==i[0]*q;print([c,"v^"[c>'^']][p],end='');x+=q;i=i[p:]

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


По-друге, спробуйте пограти в гольф що-небудь взагалі. Це просто використовує досить неофіційну петлю над рядком, використовуючи xдля відстеження поточного індексу комутатора. Використовує 1-індексацію.

Безголівки:

def f(i,y):
     x = 1
     for c in y:
         nextchar = c # nextchar gets golfed out completely within the print
         if c in 'v^': # golfed as c>'-'
             if len(i) and x==i[0]:
                nextchar = 'v' if c=='^' else '^'
                i = i[1:]
             x += 1
         print(nextchar, end='')



Або 104, якщо python 3 прийнятний
DJMcMayhem

@DJMcMayhem О, спасибі за те, що замінив catch xd. Чи хочете ви опублікувати Python 3 як окрему відповідь, чи ви вважаєте, що це досить схоже, щоб додати до цього редагування?
Перетворення Фур'є Ріна

1
Сміливо додайте його :) Я можу опублікувати відповідь python 3, але, мабуть, спробую спершу придумати свій підхід.
DJMcMayhem

3

Желе , 12 байт

O^%5T⁴ịƲ¦40Ọ

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

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

Як?

O^%5T⁴ịƲ¦40Ọ - Main Link: list of characters, S; inversion indices, I
O            - to ordinals   ('\n':10, '-':45, '^':94, 'v':118)
        ¦    - sparse application...
       Ʋ     - ...to indices: last four links as a monad: f(O(S))
  %5         -   modulo 5   (10:0, 45:0, 94:4, 118:3)
    T        -   truthy indices (giving, X, indices of '^' and 'v' in S)
     ⁴       -   4th command line argument = I
      ị      -   index into X   (giving indices of '^' and 'v' to invert in S)
 ^       40  - ...action: XOR with 40   (94:118, 118:94)
           Ọ - from ordinals
             - implicit print


3

Perl 6 , 31 байт

->$_,\s{S:nth(s){\^|v}=$/~^'('}

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

(-2 байти завдяки Джо Кінгу)

Оператор підстановки Perl 6 Sзручно приймає nthприслівник, який приймає не лише єдиний індекс, за яким можна зробити заміну, але і їх перелік, як саме потрібно тут.

Заміна - це те $/ ~^ '(', де $/відповідний текст (або vабо ^) ~^є строковим ексклюзивним або оператором, і (є символом, біти якого перетворюються vна ^навпаки.





2

Желе , 14 байт

⁾^vḟ$€>”-T⁹ịƲ¦

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

Повна програма.

Це відчувається занадто довго ...


Я не знаю Jelly, тому я не можу зрозуміти, як спробувати його сам, але чи не могли б ви замінити ”-ім'я першого аргументу ( ³?), Який гарантовано почне -замість a ?
Кудлатий

@Shaggy Nope, тому що >векторизується. Ви можете бачити, що це не працює .
Ерік Аутгольфер

ах, це саме те, що я спробував :) Не знав, чи причиною цього був мій дефіцит желейних знань чи ні. Не припускайте, що вбудований один символ, щоб отримати перший символ першого аргументу?
Кудлатий

@Shaggy Еее ... тільки вбудовані модулі для аргументів командного рядка ³, , , і , для першого по п'ятий CLAs відповідно. Ви можете прочитати сторінку Atoms, щоб дізнатися, чи існує певна вбудована функція.
Ерік Аутгольфер

А, ну, варто було зняти. Одного разу, я буду занурюватися в желе правильно.
Кудлатий

2

Стакс , 13 байт

¿╫╦ÜΦ1▌X○!ΩTæ

Запустіть і налагоджуйте його

Для цього використовуються індекси на основі 0.

  1. Знайдіть усі показники регулярного вираження [v^] .
  2. Індекс в індекс масив за допомогою вводу.
  3. При кожному результаті, xor коду ascii вхідного сигналу за допомогою 40. Це xor('v', '^').

2

Чисто , 93 байти

import StdEnv
$i=foldl(\s c=s++[if(any((==)(sum[1\\k<-s|k>'-']))i&&c>'-')if(c>'^')'^''v'c])[]

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

Визначає функцію, яка $ :: [Int] -> [Char] -> [Char]бере нульовий список індексів і повертає функцію, яка приймає рядок і повертає змінену рядок.


2

JavaScript (Node.js) , 101 98 93 91 77 67 байт

a=>s=>[...s].map(c=>t+=c>s?"^v"[a.includes(i++)^c>"^"]:c,t=i=``)&&t

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

10 байт, thx до пропозицій від Shaggy .

Порт моєї відповіді Python . Не використовується для гольфу Javascript!



Або 67 байт , сплативши вперед заощаджений мені Арнольд.
Кудлатий

@Shaggy: Поради оцінено! Читаємо зараз ...
Chas Brown


1

JavaScript, 111 байт

Код

x=>y=>{x.map(i=>eval(`y=y.replace(/(((v|\\^)[^^v]*){${i}})(v|\\^)/,(a,b,c,d,e)=>b+(e<"v"?"v":"^"))`));return y}

Приймає введення у форматі f (x) (y), де x - індекси, а y - розподільний щит. Індекси індексовані 0

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

Пояснення

Для кожного індексу

x.map(i=>...

побудуйте регулярний вираз, який знаходить індекс + 1-е "^" або "v"

`.../(((v|\\^)[^^v]*){${i}})(v|\\^)/...`

вставити його в рядок, щоб замінити його протилежним символом "v" <-> "^"

y=y.replace(...,(a,b,c,d,e)=>b+(e<"v"?"v":"^"))

потім оцініть рядок як функцію

eval(...)

Після перерви через індекси для переключення поверніть розподільний щит

return y


1

Сітківка 0,8,2 , 66 62 байт

\d+
$*
T`v^`^v`.(?<=\b(?(3)$)(?<-3>1)+(,1+)*(-|¶|(v|\^))+)
1A`

Спробуйте в Інтернеті! Посилання включає тестовий випадок. 1-індексований. Пояснення:

\d+
$*

Перетворити вхідні номери в одинакові.

T`v^`^v`.(?<=\b(?(3)$)(?<-3>1)+(,1+)*(-|¶|(v|\^))+)

Транслітеруйте між vі ^всіма символами властивість, що число vs та ^s до цих пір (включно) дорівнює одному з вхідних чисел.

1A`

Видаліть вхідні числа.


1

Вугілля деревне , 23 байти

⭆η⎇№θ⌕ΦLη№v^§ηλκ§v^⁼vιι

Спробуйте в Інтернеті! Посилання на багатослівну версію коду. 0-індексований. Пояснення:

 η                      Input string
⭆                       Map over characters and join
  ⎇                     If
   №                    Count of (i.e. exists)
     ⌕                  Index of
               κ        Current index in
       L                Length of
        η               Input string
      Φ                 Implicit range filtered by
         №              Count of (i.e. exists)
             η          Input string
            §           Indexed by
              λ         Current value
          v^            In literal string `v^`
    θ                   In input list
                 v^     Then literal `v^`
                §       Indexed by
                     ι  Current character
                   ⁼    Equal to
                    v   Literal `v`
                      ι Else current character




1

Japt , 16 14 байт

Ëc^#(*(D>V©øT°

Спробуй це

Ë>V©øT° ?Dc^#(:D     :Implicit input of multi-line string U & integer array V
Ë                    :Map each D in U
 >V                  :  Greater than V? (Coerces V to a string and, conveniently, all digits are > "\n" & "-" and < "^" & "v")
   ©                 :  Logical AND with
    ø                :  Does V contain
     T°              :    T (initially 0) postfix incremented
        ?            :  If true
         Dc          :  Charcode of D
           ^#(       :  XOR with 40
              :D     :  Else D

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