反转配电板上的某些开关


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-

我们可以输出一个矩形char数组,用空格右击较短的行吗?另外,我们可以采用这种形式输入吗?
Luis Mendo

@LuisMendo我要说“不”作为输入。只要看起来像输入,尾随空格就可以了。
维斯卡

2
提示您检查字符是否为>"-":由于保证输入字符串以开头-,因此您可以检查所使用的参数/参数/变量名称。
毛茸茸的

Answers:


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
@Grimy Ooh,好主意。还可以s == cl,所以-14总体而言。
DJMcMayhem

其他想法:s^v!<Esc>?\<C-R>"<CR>xhf!xs<CR>^v<Esc>:s/\V<C-R>"<CR>kgJ
Grimmy

1
我考虑了一下,但是如果要反转的字符在行的末尾则失败了……但是输入规范保证了它后面跟有一个-,所以它实际上可以工作!咄。
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字节

(由于DJMcMayhem♦-30,感谢Black Owl Kai -1)

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索引。

取消高尔夫:

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发布为一个单独的答案,还是您认为它足以添加为编辑内容呢?
Rin的傅立叶变换

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字节,感谢Jo King)

Perl 6的替换运算符S方便地采用了一个nth副词,该副词不仅接受在此处进行替换的单个索引,而且完全接受此处需要的替换列表。

替换为$/ ~^ '(',其中$/是匹配的文本(v^),~^是按字符串的异或运算符,并且(是位v变为^或反之的字符。





2

果冻,14字节

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

在线尝试!

完整程序。

这感觉太长了 ...


我不知道Jelly,所以无法自己弄清楚如何尝试,但是您可以”-将第一个参数的名称(³?)替换为以开头的-吗?
毛茸茸的

@Shaggy Nope,因为>矢量化。您会看到它不起作用
暴民埃里克

啊,那正是我尝试过的方法:)不知道是不是因为我缺乏果冻知识才导致了。难道没有内置一个字符来获取第一个参数的第一个字符?
毛茸茸的

@Shaggy呃...唯一的内置插件的命令行参数是³,第一至分别第五胶质液泡。您可以阅读Atoms页面以了解是否存在特定的内置函数。
暴民埃里克

嗯,值得一试。有一天,我正确地进入果冻。
毛茸茸的

2

Stax,13 个字节

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

运行并调试

这使用基于0的索引。

  1. 查找正则表达式的所有索引[v^]
  2. 使用输入索引到索引数组中。
  3. 在每个结果中,使用来对输入的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]使用零索引索引列表的函数,并返回接收字符串并返回更改后的字符串的函数。




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

果冻,17个字节

⁾^vK;`©⁹e€ky@€⁸¦®

在线尝试!

一个完整的程序,将索引作为第一个参数并将字符串作为第二个参数。翻转显示的开关打印输出。


1

视网膜0.8.266 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和^这么远(含)等于输入的号码之一。

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,15个字节

®c^(Z>V©øT° *#(

试试吧

®c^(Z>V©ø°T *#(    U = Input String, V = Array of Indices
®                  Map each Z in U
 c^                   XOR Z's charcode by
   (Z>V                 Z is 'v' or '^'
      ©                 Short-circuiting Logical and
       øT°              The current Z's index is in V
             *#(        Multiply the boolean with 40 (false = 0, true = 1)

1

Japt16 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,
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.