배전반에서 일부 스위치 반전


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 나는 그것을 입력으로 취하는 것에 대해 아니오라고 말할 것입니다. 입력처럼 보이는 한 후행 공백이 좋습니다.
Veskah

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 (Verbose 모드)

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

파이썬 (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:]

온라인으로 사용해보십시오!


두 번째로 골프는 전혀하지 말아라. 이것은 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='')



또는 파이썬 3이 허용되는 경우 104
DJMcMayhem

@DJMcMayhem Ooh, 그 대체 캐치 xd에 감사합니다. Python 3을 별도의 답변으로 게시 하시겠습니까, 아니면 편집으로 추가하기에 충분히 비슷하다고 생각하십니까?
린 푸리에 변환

1
자유롭게 추가하십시오 :) 파이썬 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

펄 6 , 31 바이트

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

온라인으로 사용해보십시오!

(Jo King 덕분에 2 바이트)

Perl 6의 대체 연산자 S는 대체 nth할 단일 인덱스뿐만 아니라 여기에 필요한대로 정확하게 목록을 허용 하는 부사를 편리하게 취합니다 .

교체는 $/ ~^ '(', 여기서 $/매칭 된 텍스트 (하나 인 v또는 ^) ~^stringwise의 배타적 논리합 연산자이고, (그 비트 켜는 문자 v^반대로 그 반대.





2

젤리 , 14 바이트

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

온라인으로 사용해보십시오!

전체 프로그램.

너무 오래 느낀다 ...


나는 젤리를 모른다. 그래서 직접 시도하는 방법을 알 수는 없지만 대신 ”-첫 번째 인수 ( ³?) 의 이름으로 바꿀 수 -있습니까?
얽히고 설킨

@Shaggy Nope는 >벡터화 하기 때문 입니다. 당신은 그것이 작동하지 않는 것을 볼 수 있습니다 .
Outgolfer Erik

아, 그게 내가 시도한 것입니다 :) 그것이 젤리 지식이 부족한 이유인지는 모르겠습니다. 첫 번째 인수의 첫 번째 문자를 얻기 위해 단일 문자가 내장되어 있다고 가정하지 마십시오.
얽히고 설킨

@Shaggy 음 ... 명령 줄 인수에 대한 유일한 내장 된 기능은 ³, , , 그리고 각각 다섯 번째 제공자 라이선스 계약에 대한 첫 번째합니다. Atoms 페이지를 읽고 특정 내장 함수가 존재하는지 확인할 수 있습니다.
Outgolfer Erik

아, 잘할 가치가있었습니다. 어느 날, 나는 것이다 제대로 젤리에 뛰어.
얽히고 설킨

2

Stax , 13 바이트

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

실행 및 디버깅

0 기반 인덱스를 사용합니다.

  1. 정규식의 모든 지수를 찾으십시오 [v^].
  2. 입력을 사용하여 인덱스 배열 로 인덱스 하십시오.
  3. 각 결과에서 x 또는 입력의 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

자바 스크립트 (Node.js) , 101 98 93 91 77 67 bytes

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

온라인으로 사용해보십시오!

10 바이트, 제안으로 thx Shaggy의 .

파이썬 답변 포트 . 자바 스크립트 골프에는 익숙하지 않습니다!



또는 Arnauld가 저축 한 돈을 지불하여 67 바이트 .
얽히고 설킨

@Shaggy : 팁 감사합니다! 지금 읽기 ...
Chas Brown


1

자바 스크립트, 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^수있는 속성이 모든 문자 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 , 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

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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.