Инвертировать некоторые переключатели на коммутаторе


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 байт / нажатие клавиши. Счетчик байтов

Тестовый пример 1 (подробный режим)

Тестовый пример 2 (подробный режим)

Спасибо Grimy за идеи, которые привели к сокращению на 22 байта :)


2
@Veskah ughhhhhh vim очень привередлива в крайних случаях "сделай что-нибудь 0 раз". Посмотреть правку
DJMcMayhem

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

2
@ Грими Ох, хорошая идея. Кроме того 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 -, так что это на самом деле работает! Duh.
Grimmy


4

K (ок) , 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:]

Попробуйте онлайн!


Oof, вторая попытка игры в гольф вообще. Это просто использует довольно простой цикл над строкой, который используется xдля отслеживания текущего индекса переключателя. Использует 1-индексацию.

Ungolfed:

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, если приемлем питон 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⁹ịƲ¦

Попробуйте онлайн!

Полная программа.

Это слишком долго ...


Я не знаю, Джелли, поэтому не могу понять, как это попробовать сам, но не могли бы вы заменить ”-имя первого аргумента ( ³?), Который гарантированно будет начинаться с a -?
Мохнатый

@ Shaggy Нет, потому что >векторизация. Вы можете видеть, что это не работает .
Эрик Outgolfer

ах, это именно то, что я пытался :) Не знал, было ли это моим недостатком знания желе, что было причиной или нет, хотя. Не думаете ли вы, что для получения первого символа первого аргумента есть встроенный единственный символ?
лохматый

@Shaggy Эээ ... только встроенные модули для аргументов командной строки ³, , , и , для первого по пятый CLAs соответственно. Вы можете прочитать страницу Atoms, чтобы узнать, существует ли конкретная встроенная функция.
Эрик Outgolfer

Ах, ну, стоило того. Однажды, я буду погружаться в желе правильно.
лохматый

2

Stax , 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 байтов, спасибо предложениям Шегги .

Порт моего Python ответа . Не привыкли к игре в гольф на JavaScript!



Или 67 байт , заплатив вперед за спасение, которое дал мне Арно.
лохматый

@ Shaggy: Советы приветствуются! Читая сейчас ...
Час Браун


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

Retina 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|\^))+)

Transliterate между vи ^все символы с тем свойством , что число vх и ^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)
Веска
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.