배전반을 무차별 대입


32

다른 날, 우리 팀은 탈출 실로 갔다. 퍼즐 중 하나는 6 개의 기계식 스위치 보드로 구성되어 있으며 상자를 잠금 해제하기 위해 켜기 및 끄기의 올바른 조합을 찾아야합니다.

-v-v-v-
-v-v-v-

개발자이기 때문에 실제로 퍼즐을 푸는 것보다 2 ^ 6 = 64 조합 중 하나를 시도하는 것이 더 효율적이라고 결정했습니다. 그래서 우리는 이진 계산을 수행하기 위해 가난한 사람을 할당했습니다.

-v-v-v-
-v-v-v-

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

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

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

등등.

과제
위와 같이 형식이 지정된 문자열로 스위치가 모두 꺼져있는 경우 순서에 상관없이 모든 켜기 및 끄기 조합을 생성하는 프로그램을 작성하십시오.

전체 프로그램이나 함수를 작성할 수 있습니다. 따라서 프로그램은 stdin, 파일 또는 단일 문자열 인수를 통해 입력을 받아 출력을 리턴하거나 인쇄 할 수 있습니다. 리턴되면 출력이 목록 / 배열 등일 수 있습니다. 단일 문자열이 아닌. 출력이 단일 문자열 인 경우 보드는 개행으로 분리해야합니다 (트레일 개행이 허용됨).

입력 문자열은 정규식 r'((-v)+-)(\n(-v)+-)*'과 일치하며 모든 스위치가 꺼진 보드 하나를 나타냅니다. 이는 0이 아니며 스위치가 왼쪽 정렬됨을 의미합니다. 각 행에는 같은 수의 스위치가 없을 수 있습니다.

각 출력 보드는 v가 필요에 따라 ^로 대체 될 수 있다는 점을 제외하고 입력과 정확히 동일한 형식이어야합니다. 출력 보드는 여러 줄 바꿈으로 분리 할 수 ​​있습니다.

스위치 수는 런타임이 당연히 O (2 ^ n)이므로 코드는 어떤 배열로도 10 개 이상의 스위치에서 테스트되지 않습니다.

이것은 코드 골프이므로 바이트 수에서 가장 짧은 코드가 승리합니다.

샘플 입력 및 출력

입력:

-v-

가능한 출력 :

-v-
-^-

입력:

-v-
-v-

가능한 출력 :

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

-v-
-^-


-v-
-v-

더 많은 수의 스위치에 대한 답변을 확인하는 것이 매우 지루하기 때문에 여기 에 위생 검사 도구 인 Python 스크립트가 있습니다. (더 많은 테스트 사례를 원할 경우 주어진 입력 파일에서 예상되는 출력을 생성하기 위해 현재 주석 처리 된 스 니펫을 포함 시켰습니다.) 불행히도 스펙보다 입력 및 출력 측면에서 약간 덜 유연합니다. 입력 문자열을 'input'이라는 파일에 넣고 줄 바꾸기로 구분 된 출력 (죄송합니다. 목록 형식 없음)을 동일한 디렉토리의 'output'파일에 넣고 실행하십시오 python3 sanitycheck.py.


8
좋은 첫 도전!
주세페

12
다행히도 "가난한 사람"은 각 조합 사이에서 1 비트 만 뒤집기 위해 회색 코드 에 대해 알고있었습니다 .
에릭 Duminil

1
시간은 우리의 가장 귀중한 자산이며 낭비하지 마십시오.
페드로 Lobito

6
테마를 감안할 때 가장 적은 토글을 요구하는 주문이 필요하지 않은 것에 실망했습니다 (예 : 00-> 01-> 11-> 10에는 3 개의 토글이 있고 00-> 01-> 10-> 11에는 4가 있습니다) )-동료 무차별 대
피구

2
@EricDuminil : 기계식 스위치가 버튼이 아니더라도 (아마도), 1, 2 및 3 개의 연속 스위치를 전환하는 데 필요한 시간 차이는 (거의 동시에 할 수 있음) 충분히 크지 않을 것입니다 그레이 코드를 따르기 위해 추가 정신적 작업을 상쇄합니다.
tomasz

답변:


23

하스켈 , 25 24 23 17 바이트

mapM$min"^v".pure

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

@ H.PWiz 덕분에 -1 바이트

@nimi 덕분에 -1 바이트

문자열 목록을 반환합니다. TIO는 함수 선언을 위해 2 바이트를 더 가지고 있습니다. 다른 사람들이 pointfree 함수를 쓸 때 그것을 남겨 두는 것을 보았으므로 달리 언급하지 않는 한 똑같이하고 있습니다.

이전 답변 (25 바이트)

g 'v'="v^"
g x=[x]
mapM g

설명은 이전 답변에 대한 것이며,의 정의를 인라인 한 것을 제외하고는 거의 같은 방식으로 작동합니다 g. 방법은 g지금 작동 대체 할 어휘 비교를 사용하는 것입니다 ^v위해 v다른 모든 것들 동일하게 유지.

흥미롭게도 이것은 임의의 배전반에서 작동합니다.

>>> mapM g "-----^-----"
  ["-----v-----", "-----^-----"]

설명 (짧음)

g 'v'="v^" -- for 'v', choose between 'v' or '^'
g x=[x]    -- for any other character, choose just that character
mapM g     -- find all ways to choose characters using g on the given input

설명 (긴)

mapMHaskell에 익숙하지 않은 사람들에게는 꽤 무서운 기능입니다. 그러나이 맥락에서 이해하기는 어렵지 않습니다. 이 행동함으로써 String(하스켈에서 문자의 목록입니다)의, 나는 목록에 대한 정의를 전문했습니다. 이런 맥락에서 타입 시그니처는

mapM :: (a -> [b]) -> [a] -> [[b]]
--      ^^^^^^^^^^                  arg 1: a function from any a to a list of b
--                    ^^^           arg 2: a list of a
--                           ^^^^^ return: a list of list of b

실제로 훨씬 더 그것의 내 사용 전문 - a그리고 b모두 Char- 우리가 유형 서명을 볼 수 있도록

mapM :: (Char -> String) -> String -> [String]

작동 방식을 g설명하기 전에 수행 할 mapM작업을 신속하게 살펴 보겠습니다 .

g :: Char -> String
g 'v' = "v^"
g  x  = [x]

g패턴 일치를 사용 Char 'v'하여를 문자열 로 변환 합니다 "v^". 다른 모든 것은 단일 문자열로 변환됩니다 (문자열은 단지 Chars 목록 이므로 x단일 목록에 넣을 수 있음 ). REPL에서 테스트 한 결과입니다.

>>> g 'a'
  "a"
>>> g 'b'
  "b"
>>> g 'v'
  "v^"

(의심 g할 여지없이 mapM!) 의 인수가 될 수있는 올바른 유형을 가지고 있음에 유의하십시오 .

우리는 mapM그것 g과 논쟁 을 통해 어떻게 작동 하는지 탐구 할 것입니다.

"-v-\n-v-"

입력으로.

mapM먼저을 (를) 매핑 g하고 s를 (으 ) 로 변환 String하므로gCharStringsStrings

["-", "v^", "-", "\n", "-", "v^", "-"]

이것이 올바른 출력 유형이지만 mapM약간 더 많이 수행합니다. String각 문자에서 하나의 문자를 String순서대로 선택해야하는 경우이 목록에서 작성할 수있는 모든 문자를 구성 하는 것으로 생각할 수 있습니다.

따라서 첫 번째 요소의 경우을 선택하는 것 외에 다른 선택은 없습니다 Char '-'. 두 번째 요소의 경우 'v''^'등 중에서 선택할 수 있습니다 .

이 파이썬 코드와 거의 같습니다.

result = []
for x1 in "-":
  for x2 in "v^":
    for x3 in "-":
      ...
        result.append(''.join([x1, x2, x3, x4, x5, x6, x7]))

Haskell이 Chars와 Strings를 구분 하므로 Chars를 목록에 넣을 때 반드시 할 필요는 없습니다.join .

최종 출력은

["-v-\n-v-", "-v-\n-^", "-^-\n-v-", "-^-\n-^-"]

바라는대로.


오, 나는 순전히 기능적인 답변을 기다리고 있었다.
린 푸리에 변환

2
Rin'sFouriertransform 내가 얼마나 잘 만족했다 @ mapM이 문제에 대한 일, 첫번째 나는 그것을 같이 공식화했다 sequence . map g그러나 그것은으로 컴팩트하게 표현 될 수 mapM id . map g후 난 그냥 수 보았다mapM g

1
나는 당신이 바꿀 수 있다고 생각 =='v'을 위해>'-'
H.PWiz

9

펄 6 , 32 바이트

{[X~] .comb».&{$_,('^'if /v/)}}

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

  • .comb 문자열을 문자로 분할합니다.
  • ».&{...} 중괄호 사이의 함수에 따라 문자를 매핑합니다.
  • $_, ('^' if /v/)각 캐릭터에 대한 대체 목록을 생성합니다. v대체 만 있습니다 : ^.
  • [X~]string-concatenation cross-product operator로 해당 목록을 줄입니다 X~.

9

젤리 , 7 바이트

«Ƭ€”^Œp

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

출력은 젤리 문자열의 목록입니다.

설명:

«Ƭ€”^Œp  Arguments: 1
«Ƭ€”^    Dyad-nilad pair
  €       Map over left argument
 Ƭ         Apply repeatedly until a result that has previously been seen is seen
           again, return original and intermediate results
«           Dyad: Minimum of arguments
   ”^     Nilad: Literal: '^'
         Note: 'v' is the only character that is greater than '^' and can
         appear in the input, so, while for every character c other than 'v'
         this operation returns [c], for 'v' it returns ['v', '^']. In this way,
         duplicates are never going to appear in the output.
     Œp  Monad: Cartesian product of elements

실제로 Jelly 코드 페이지를 통해 첫 번째 답변이 다른 모든 답변을 계속 능가하는 방법을 알아 내려고 노력해 왔으며 거의 ​​항상 아주 좋은 마진으로 어떻게 작동합니까?
린 푸리에 변환

@ Rin'sFouriertransform 설명을 추가했습니다.
아웃 골퍼 에릭

6

펄 5 , 29 바이트

sub{glob"\Q@_"=~s/v/{v,^}/gr}

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

내 첫 제출!


일반적으로 Perl 5 골퍼 sub{}는 최소한 포함하지 않아도되는 기능 대신 프로그램을 제출합니다 . 그러나 그들은 추가 할 필요가 say, say␠, say for또는 say for␠교환.

하위 접근 방식을 사용하면 단축 할 수 있습니다

say for glob"\Q$_"=~s/v/{v,^}/gr        # Perl 5, -0n, 32 bytes

sub{glob"\Q@_"=~s/v/{v,^}/gr}           # Perl 5, 29 bytes

설명은 매우 간단합니다. Perl 5에는 glob파일 이름 foo*.txt목록 (예 :) 또는 문자열 목록 (예 :)을 생성하는 데 사용할 수있는 쉘 모양의 글로브 패턴을 허용 하는 내장 연산자가 있습니다 {a,b,c}. 캐치는 줄 바꿈이 내가 사용했던하는, 이스케이프 할 필요가 있다는 것이다 quotemeta(같은 \Q).



4

APL (Dyalog Classic) , 21 17 15 바이트

⊃⊢∘.,.∪'v'r'^'

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

비슷하다 내 k 솔루션

문자열의 n 차원 배열을 반환합니다 (n = 스위치 수).

설명하기 쉬운 형태로 : ⊃(∘.,⌿ ⊢ ∪¨ 'v'⎕r'^')

'v'⎕r'^'교체 v로들^

⊢ ∪¨... 각각의 원래 문자와 결합합니다. 길이가 1 또는 2 인 문자열로 구성된 벡터입니다.

∘.,⌿ 직교 곱 감소

드러내다

완전 골프 버전에 도달하기 위해 우리는 패턴을 따릅니다 f⌿ A g¨ B->A f.g B .

∘.,⌿ ⊢ ∪¨ 'v'⎕r'^' -> ⊢ ∘.,.∪ 'v'⎕r'^'

부작용으로 괄호는 더 이상 필요하지 않습니다


외부 제품 내부 제품의 모든 항목에는 +1이 필요합니다.
Adám

3

J , 42 바이트

]`('v'I.@e.~[)`[}"1'v^'{~2#:@i.@^1#.e.&'v'

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

설명

]`('v' I.@e.~ [)`[}"1 ('v^' {~ 2 #:@i.@^ 1 #. e.&'v')

보자

-v-
-v-

예제 입력으로.

  • ('v^' {~ 2 #:@i.@^ 1 #. e.&'v')입력 형식을 무시하고 스위치의 가능한 모든 콤보를 만듭니다. 이 예제에서는 다음을 생성합니다.

    vv
    v^
    ^v
    ^^
    
    • 1 #. e.&'v'v입력에서 s 의 수를 계산합니다 .
    • 2 #:@i.@^2를 그 거듭 제곱으로 올리고 0에서 해당 숫자 까지의 정수를 생성 한 다음 i.이진수로 변환합니다.#:
    • 'v^' {~ 이진수로 변경 v 하고^
  • ]`('v' I.@e.~ [)`[}"1이전 단계에서 설명 된 결과의 각 행 (즉, 모든 가능한 v/ ^콤보) 에 대해 하나의 사본을 생성하여 원래 입력을 수정합니다 . 각 사본에서 v원래 입력의 v/는 가능한 하나의 순서로 바뀝니다 ^.

3

자바, 202 197 189 191 바이트

예, 비교적 장황한 언어이지만 이것이 고전적인 골프라고 생각합니다.

import java.util.function.Function;

public class SwitchBored
{
    public static void main(String[] args)
    {
        Function<String, String> f = s->{byte i,j,k,m=1,u='^',d='v',a[]=(s+"\n\n").getBytes();for(i=0,s="";i<m;i++,s+=new String(a))for(j=0,k=0;k<a.length;k++){if(a[k]==d||a[k]==u){a[k]=(i&1<<j++)!=0?u:d;m<<=i>0?0:1;}}return s;};

        //System.out.println(f.apply("-v-"));
        System.out.println(f.apply("-v-v-v-\n-v-v-v-"));
        //System.out.println(f.apply("-v-v-v-\n-v-v-"));
        //System.out.println(f.apply("-v-v-v-v-v-\n-v-"));
        //System.out.println(f.apply("-v-v-v-v-v-\n-v-v-v-v-v-"));
    }
}

적절한 레이아웃을 얻는 데 필요한 줄 바꿈을 처리하는 "간단한"방법은 실제로 원래 입력 문자 배열을 재사용하고 채워야한다는 생각이었습니다. 'v' s 및'^' 하고 적절한 위치에서 s .

업데이트 :

위치를 저장 하지 않으면int 및 배열 변수 선언을 버릴 수 있음이 밝혀졌습니다 (배열의 각 위치를 검사하는 비용으로v 또는^ 5 바이트를 절약 즉시 참조).

상한을 계산하여 절약 된 다른 8 바이트 (1<<numberOfSwitches) 더 간결하게 .

주석에 언급 된 규칙에 따르면 함수 선언을 계산해야하므로 이제 람다입니다.


2
String generate(String s) {...}바이트 수에 함수 정의 ( ) 를 포함시켜야한다고 확신합니다 . 다음은 191 바이트의 고정 / 람다 버전입니다 . 나는 약간의 골프를해서 3 바이트를
깎았 다

@BenjaminUrquhart 좋아, 이것들은 내가 잘 모르는 "규칙"의 세부 사항입니다 (나는 정기적으로 골프를하지 않습니다). 나는 실제는 생각 { function body }은 문제가되지 당신이 함수에 넣어 여부 않기 때문에, 관련이 있어야 static여부, 그리고 물론, 경우 점수를 향해 선언 수, 하나는 람다 식으로 변환 할 수 있습니다. 그러나 이것을 지적 해 주셔서 감사합니다.
Marco13

1
몇 가지 제안 : 1. 문자 ( d=94)가 아닌 ASCII 코드를 사용하십시오 . 2. i선언 할 때 초기화 하십시오. 3. i++<m별도의 증분 대신 사용하십시오 (루프 내용을 한곳에서 수정해야하지만 비용이 들지 않습니다). 4. 당신은 멀리 갈 수 있습니까 (i&1<<j++)>0? 5. 나는 당신 {}이 내부 를 필요로 생각하지 않습니다for 루프 . 6. 교체 할 수 a[k]==d||a[k]==u와 함께 a[k]>45, 나는 생각한다. 로 이동하십시오 j=k=0. 19 바이트를 제거해야합니다.
VisualMelon

@VisualMelon이 중 일부는 "클래식 골프"접근 방식이며 이미 일부를 적용했습니다. 적용 가능 여부에 따라 다릅니다.{} 는 필요 하지만 다른 모양을 가질 수 있습니다. 는 a[k]>45하지만, 깔끔한 속임수 일 수도있다. 틀림없이, 나는 회의가 시작되기를 기다리는 데 시간을 낭비하기 위해 이것을 썼다.
Marco13

@ Marco13은 실제로 고전적인 트릭이지만 여기에 모두 적용됩니다. 나는 그들에게 172 바이트 솔루션을 제공함으로써 재미를 망치지 않을 것이다. ).
VisualMelon

3

J , 41 40 24 바이트

[:>@,@{<@(,'^'$~'v'=])"0

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


매우 인상적. 의 사용을 사랑하십시오 {. [:>@,@{<@(,'^'$~'v'=])"0"각 출력 보드는 입력과 정확히 같은 형식이어야하고"입력이 박스 화되어 있지 않기 때문에 약간 더 공정하다고 생각 합니다.
요나

@Jonah 감사합니다. 수정되었습니다.
ngn





2

K4 , 44 바이트

해결책:

-1{@[x;&w;:;]@'"v^"@a\:'!*/a:(+/w:"v"=x)#2};

예 :

q)k)-1{@[x;&w;:;]@'"v^"@a\:'!*/a:(+/w:"v"=x)#2}"-v-";
-v-
-^-

q)k)-1{@[x;&w;:;]@'"v^"@a\:'!*/a:(+/w:"v"=x)#2}"-v-\n-v-";
-v-
-v-
-v-
-^-
-^-
-v-
-^-
-^-

q)k)-1{@[x;&w;:;]@/:"v^"@a\:'!*/a:(+/w:"v"=x)#2}"-v-v-\n-v-v-v-\n-v-";
-v-v-
-v-v-v-
-v-
-v-v-
-v-v-v-
-^-
-v-v-
-v-v-^-
-v-
-v-v-
-v-v-^-
-^-
-v-v-
-v-^-v-
-v-
-v-v-
-v-^-v-
-^-
-v-v-
-v-^-^-
-v-
-v-v-
-v-^-^-
-^-
-v-v-
-^-v-v-
-v-
-v-v-
-^-v-v-
-^-
-v-v-
-^-v-^-
-v-
-v-v-
-^-v-^-
-^-
-v-v-
-^-^-v-
-v-
-v-v-
-^-^-v-
-^-
-v-v-
-^-^-^-
-v-
-v-v-
-^-^-^-
-^-
-v-^-
-v-v-v-
-v-
-v-^-
-v-v-v-
-^-
-v-^-
-v-v-^-
-v-
-v-^-
-v-v-^-
-^-
-v-^-
-v-^-v-
-v-
-v-^-
-v-^-v-
-^-
-v-^-
-v-^-^-
-v-
-v-^-
-v-^-^-
-^-
-v-^-
-^-v-v-
-v-
-v-^-
-^-v-v-
-^-
-v-^-
-^-v-^-
-v-
-v-^-
-^-v-^-
-^-
-v-^-
-^-^-v-
-v-
-v-^-
-^-^-v-
-^-
-v-^-
-^-^-^-
-v-
-v-^-
-^-^-^-
-^-
-^-v-
-v-v-v-
-v-
-^-v-
-v-v-v-
-^-
-^-v-
-v-v-^-
-v-
-^-v-
-v-v-^-
-^-
-^-v-
-v-^-v-
-v-
-^-v-
-v-^-v-
-^-
-^-v-
-v-^-^-
-v-
-^-v-
-v-^-^-
-^-
-^-v-
-^-v-v-
-v-
-^-v-
-^-v-v-
-^-
-^-v-
-^-v-^-
-v-
-^-v-
-^-v-^-
-^-
-^-v-
-^-^-v-
-v-
-^-v-
-^-^-v-
-^-
-^-v-
-^-^-^-
-v-
-^-v-
-^-^-^-
-^-
-^-^-
-v-v-v-
-v-
-^-^-
-v-v-v-
-^-
-^-^-
-v-v-^-
-v-
-^-^-
-v-v-^-
-^-
-^-^-
-v-^-v-
-v-
-^-^-
-v-^-v-
-^-
-^-^-
-v-^-^-
-v-
-^-^-
-v-^-^-
-^-
-^-^-
-^-v-v-
-v-
-^-^-
-^-v-v-
-^-
-^-^-
-^-v-^-
-v-
-^-^-
-^-v-^-
-^-
-^-^-
-^-^-v-
-v-
-^-^-
-^-^-v-
-^-
-^-^-
-^-^-^-
-v-
-^-^-
-^-^-^-
-^-

설명:

의 현재 위치에서 교체 "^". 스위치 조합 수 (예 : 2 ^ n)를 결정하고, 이진수로 카운트 업하고, 스위치를 교체하십시오 ...

-1{@[x;&w;:;]@'"v^"@a\:'!*/a:(+/w:"v"=x)#2}; / the solution
-1                                         ; / print to STDOUT, swallow -1
  {                                       }  / lambda taking implicit x
                                        #2   / take 2
                             (         )     / do this together
                                  "v"=x      / does input = "v" ?
                                w:           / save as w
                              +/             / sum up
                           a:                / save as a
                         */                  / product
                        !                    / range 0..n
                    a\:'                     / convert each to base-2
               "v^"@                         / index into "v^"
             @'                              / apply each
   @[x;&w;:;]                                / apply assignment to x at indexes where w is true

2

R , 116 바이트

function(x,u=utf8ToInt(x))apply(expand.grid(rep(list(c(118,94)),sum(u>45))),1,function(i)intToUtf8(`[<-`(u,u>45,i)))

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

개행으로 분리 된 보드의 벡터를 반환하는 함수


아, 나는 훨씬 더 어려운 방법으로 입력을받는 데 집중하여이 방법의 용이성을 무시했습니다. 의 좋은 사용 "[<-"!
주세페

@ 주세페 : 나는이 솔루션에별로 만족하지 않지만 ... 다른 방법으로 조합을 생성하려고 시도했지만 (예 : 이진 변환 사용) 이것이 가장 짧았습니다.
digEmAll


1

레티 나 0.8.2 , 29 바이트

T`¶v`;#
+%1`#
v$'¶$`^
%`;|$
¶

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

T`¶v`;#

개행을 ;s 로 변경하고 vs를 #표시 로 변경하십시오 .

+%1`#

#s를 왼쪽에서 오른쪽으로 한 번에 하나씩 교체하십시오 .

v$'¶$`^

각 줄을 두 줄로 바꾸십시오. 하나는 #로 교체하고 v다른 하나는로 교체하십시오 ^.

%`;|$
¶

;s를 개행 문자로 다시 변경하고 결과 간격을 두십시오.




1

파이썬 3- 구문, 203 바이트

def f(a):
 b=[0]
 for l in a.split():b+=[b[-1]+l.count('v')]
 return'\n'.join(''.join(f"{k:b}".zfill(b[-1])[x:y]+'-\n'for x,y in zip(b,b[1:]))for k in range(2**b[-1])).replace('0','-v').replace('1','-^')

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

먼저 시도해보십시오. 아주 작지는 않지만 작동합니다. 파이썬에는 우아한 문자열 대체가 없습니다 ...

첫 번째 루프는 비트 인덱스에 대한 라인 매핑, 즉 각 라인에 대해 비트 카운터의 첫 번째 비트 인덱스가 저장됩니다. 다음 루프에서 비트 카운터를 인덱싱하는 데 사용됩니다.

두 번째 루프는 이진 카운터를 실행하고 각 줄과 반복에 대한 비트를 추출하여 조인합니다. 모든 것을 결합한 후에는 문자열 대체를 사용하여 스위치 맵 형식으로 다시 변환됩니다.

입력 문자열을 반복해서 다시 작성하는 대신 재사용하여보다 우아한 방법이 있다고 생각합니다.

편집 : Python 3.8 답변 에서 영감을 얻었으며 여기에는 훨씬 짧은 교체 버전이 있습니다.

Python 3-123 바이트 교체

def f(a):r=range;n=a.count('v');return'\n'.join(a.replace('v','{}').format(*('v^'[k&2**i>0]for i in r(n)))for k in r(2**n))

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


0

루비 , 64 바이트

배열을 반환합니다. 에서 숫자를 가져옵니다12V (어디에 V 입력에서 "v"의 개수입니다.) V최하위 비트. 이를 통해 반복에서 바이트를 저장할 수 있습니다.02V1왜냐하면 V 최하위 비트 2V 모두 0입니다.

Ruby 에서는 최하위 비트부터 시작 i[j]하여 jth 비트를 반환합니다 .i(i>>j)&1

->s{(1..2**s.count(?v)).map{|i|j=-1;s.gsub(/v/){'v^'[i[j+=1]]}}}

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


0

, 28 바이트

⪫EX²№θv⭆θ⎇⁼λv§v^÷ιX²№…θμv붶

온라인으로 사용해보십시오! 링크는 자세한 버전의 코드입니다. 설명:

   ²                            Literal 2
  X                             Raised to power
    №                           Count of
      v                         Literal `v`
     θ                          In input string
 E                              Map over implicit range
        θ                       Input string
       ⭆                        Map over characters and join
           λ                    Current character
          ⁼                     Equal to
            v                   Literal `v`
         ⎇                      Then
              v^                Literal `v^`
             §                  Circularly indexed by
                 ι              Outer index
                ÷               Integer divided by
                   ²            Literal 2
                  X             Raised to power
                    №           Count of
                        v       Literal `v`
                      θ         In input string
                     …          Truncated to length
                       μ        Inner index
                         λ      Else current character
⪫                         ¶¶    Join with newlines
                                Implicitly print

0

PHP , 93 바이트

for(;$j<1<<$x;$j+=print$s)for($x=0,$s=$argv[1];$i=strpos($s,v,$i+1);$s[$i]=$j&1<<$x++?'^':v);

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

독립형 프로그램, 명령 줄을 통해 입력

의 개수에 따라 입력 문자열의 가능한 순열 개수를 반복합니다 v. 이진수로 계산하는 동안 각 이진수 1^ 입력 문자열에서 각 이진수 0를 a v로 바꿉니다.

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