配電盤上の一部のスイッチを反転する


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配列を出力できますか?また、その形式で入力を行うことはできますか?
ルイスメンドー

@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(詳細モード)

22バイトの削減につながったアイデアを提供してくれたGrimyに感謝します:)


2
@Veskah ughhhhhh vimは、「0回何かをする」エッジケースについて非常に細心の注意を払っています。編集
DJMcMayhem

できませんでした:s/\%V./\='v^'[submatch(0)=='v']ことがcl<C-R>='v^'['<C-R>"'=='v']-13バイトのために?(各<CR>は1バイトのみです)。
グリムミー

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
グリムミー

1
私はそれについて考えましたが、反転する文字が行の最後にある場合は失敗します...しかし、入力仕様はそれが続くことを保証する-ので、実際に動作します!ああ。
グリムミー


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

ノート:

  • >93トリックのおかげで-4バイト

3

Pythonの3140の 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:]

オンラインでお試しください!


おっと、何でもゴルフに挑戦してください。これ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='')



または、Python 3が受け入れられる場合は104
DJMcMayhem

@DJMcMayhem Ooh、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}=$/~^'('}

オンラインでお試しください!

(Jo Kingのおかげで2バイト)

Perl 6の置換演算子Sは、nthここで必要に応じて、置換を行う単一のインデックスだけでなく、それらのリストを受け入れる副詞を便利に使用します。

置換はで$/ ~^ '('、ここ$/では一致したテキスト(vまたは^)で~^あり、文字列ごとの排他的OR演算子であり(、ビットが変換vされる文字、または^その逆の文字です。





2

ゼリー、14バイト

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

オンラインでお試しください!

完全なプログラム。

これは長すぎます ...


Jellyがわからないので、自分で試してみることはできません”-が、最初の引数の名前(³?)に置き換えることができます-か?
シャギー

@Shaggy Nope、>ベクトル化するから。動作しないことがわかります。
アウトゴルファーのエリック

ああ、それはまさに私が試したものです:)しかし、ゼリーの知識の不足が原因であるかどうかは知りませんでした。最初の引数の最初の文字を取得する単一の文字が組み込まれているとは思わないか?
シャギー

@ShaggyのErm ...コマンドライン引数のための唯一の組み込み関数があり³、それぞれ第五CLAへの同意に最初ため。Atomsページを読んで、特定の組み込み関数が存在するかどうかを確認できます。
エリック・ザ・アウトゴルファー

ああ、まあ、一撃の価値がありました。ある日、私ゼリーに適切に飛び込みます。
シャギー

2

スタックス、13 バイト

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

実行してデバッグする

これは、0ベースのインデックスを使用します。

  1. 正規表現のすべてのインデックスを見つけます[v^]
  2. 入力を使用して、インデックス配列にインデックスを付けます。
  3. 各結果で、入力のasciiコードをxorします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バイト、Shaggyによる提案へのthx 。

私の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=>...

index + 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.266の 62バイト

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

オンラインでお試しください!リンクにはテストケースが含まれます。1インデックス。説明:

\d+
$*

入力数値を単項に変換します。

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

sおよびsの数(これを含む)が入力数の1つに等しいというプロパティを使用して、すべての文字間vで音訳します。^v^

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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.