Brute-lực tổng đài


32

Hôm nọ, nhóm chúng tôi đến một phòng thoát. Một trong những câu đố liên quan đến một bảng gồm sáu công tắc cơ, trong đó bạn phải tìm ra sự kết hợp chính xác giữa bật và tắt để mở khóa một hộp, giống như thế này:

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

Là nhà phát triển, chúng tôi quyết định sẽ hiệu quả hơn khi thử từng một trong 2 ^ 6 = 64 kết hợp so với thực sự giải câu đố. Vì vậy, chúng tôi đã chỉ định một số người nghèo làm một số đếm nhị phân:

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

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

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

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

vân vân

Thử thách
Viết chương trình, đưa ra tất cả các công tắc ở vị trí tắt dưới dạng một chuỗi được định dạng như trên, tạo ra tất cả các kết hợp bật và tắt theo bất kỳ thứ tự nào.

Bạn có thể viết một chương trình đầy đủ hoặc một chức năng. Do đó, chương trình của bạn có thể nhận đầu vào thông qua stdin, tệp hoặc dưới dạng đối số chuỗi đơn và trả về hoặc in đầu ra. Nếu được trả về, đầu ra có thể nằm trong danh sách / mảng / v.v. thay vì một chuỗi đơn. Nếu đầu ra là một chuỗi đơn, các bảng nên được phân tách bằng dòng mới (cho phép dòng mới được phép.)

Các chuỗi đầu vào sẽ khớp với biểu thức chính quy r'((-v)+-)(\n(-v)+-)*'và đại diện cho một bảng với tất cả các công tắc tắt. Điều này có nghĩa là không có trường hợp nào và các công tắc được căn trái. Mỗi hàng có thể không có cùng số lượng thiết bị chuyển mạch.

Mỗi bảng đầu ra phải có cùng định dạng với đầu vào, ngoại trừ việc v có thể được thay thế bằng ^ theo yêu cầu. Các bảng đầu ra có thể được phân tách bằng bất kỳ số lượng dòng mới.

Vì thời gian chạy tự nhiên là O (2 ^ n) trong số lượng công tắc, mã của bạn sẽ không được kiểm tra trên bất kỳ hơn 10 công tắc trong bất kỳ sắp xếp nào.

Đây là mã golf, vì vậy mã ngắn nhất về số byte thắng.

Đầu vào và đầu ra mẫu

Đầu vào:

-v-

Sản lượng có thể:

-v-
-^-

Đầu vào:

-v-
-v-

Sản lượng có thể:

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

-v-
-^-


-v-
-v-

Vì việc kiểm tra câu trả lời của bạn để biết số lượng thiết bị chuyển mạch lớn hơn, đây là tập lệnh Python như một công cụ kiểm tra độ tỉnh táo. (Tôi đã bao gồm một đoạn mã được nhận xét hiện tại để tạo đầu ra dự kiến ​​từ một tệp đầu vào nhất định trong trường hợp bạn muốn có nhiều trường hợp kiểm tra hơn. Thật không may, nó hơi linh hoạt về mặt đầu vào và đầu ra so với thông số kỹ thuật; đặt chuỗi đầu vào trong một tệp có tên 'đầu vào' và đầu ra được phân tách bằng dòng mới (xin lỗi, không có định dạng danh sách) trong một tệp có tên 'đầu ra' trong cùng thư mục và chạy python3 sanitycheck.py.


8
thử thách đầu tiên tốt đẹp!
Giuseppe

12
Hy vọng rằng, "anh chàng tội nghiệp" đã biết về mã Gray để chỉ lật một bit giữa mỗi kết hợp.
Eric Duminil

1
Thời gian là tài sản quý giá nhất của chúng ta, đừng lãng phí nó vô ích.
Pedro lobito

6
Với chủ đề này, tôi thất vọng vì bạn không yêu cầu một đơn đặt hàng yêu cầu số lượng toggles ít nhất (ví dụ 00-> 01-> 11-> 10 có 3 toggles trong khi 00-> 01-> 10-> 11 có 4 ) - Người đào tẩu lực lượng vũ phu
ngày

2
@EricDuminil: nếu các công tắc cơ không phải là nút (và thậm chí là nếu), thì rất có thể, sự khác biệt thời gian cần thiết giữa việc chuyển đổi một, hai và ba công tắc liên tiếp (mà bạn có thể làm gần như đồng thời) sẽ không đủ lớn để bù đắp công việc trí óc thêm để tuân theo mã Gray.
tomasz

Câu trả lời:


23

Haskell , 25 24 23 17 byte

mapM$min"^v".pure

Hãy thử trực tuyến!

-1 byte nhờ @ H.PWiz

-1 byte nhờ @nimi

Trả về một danh sách các chuỗi. TIO có thêm 2 byte cho khai báo hàm - Tôi đã thấy những người khác bỏ qua nó khi họ viết hàm miễn phí nên tôi cũng làm như vậy trừ khi được nói khác đi.

Câu trả lời trước (25 byte)

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

Tất cả các giải thích cho câu trả lời trước, hoạt động khá giống nhau, ngoại trừ tôi đã nêu ra định nghĩa của g. Cách glàm việc tại là bằng cách sử dụng từ vựng so sánh để thay thế ^vcho vvà giữ mọi thứ khác như vậy.

Thật thú vị, điều này hoạt động cho các tổng đài tùy ý:

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

Giải thích (Ngắn)

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

Giải thích (Dài)

mapMlà một chức năng khá đáng sợ cho những người không quen thuộc với Haskell. Nhưng nó không khó hiểu trong bối cảnh này. Bằng cách làm cho nó hoạt động trên Strings (mà trong Haskell là danh sách các ký tự), tôi đã chuyên môn hóa nó theo định nghĩa của nó cho các danh sách. Vì vậy, trong bối cảnh này, chữ ký loại của nó là

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

Nó thực sự thậm chí còn chuyên sâu hơn trong việc sử dụng nó của tôi - abcả hai Char- vì vậy chúng ta có thể thấy chữ ký loại là

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

Hãy nhanh chóng xem xét những gì glàm trước khi giải thích cách làm mapMviệc.

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

gsử dụng khớp mẫu để chuyển đổi Char 'v'thành chuỗi "v^"; mọi thứ khác được chuyển đổi thành một chuỗi singleton (hãy nhớ rằng, các chuỗi chỉ là danh sách của Chars, vì vậy chúng ta có thể đưa xvào danh sách singleton). Thử nghiệm trên REPL, chúng tôi thấy đây là trường hợp

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

Lưu ý rằng gcó loại đúng để trở thành một đối số mapM(không ngạc nhiên!).

Chúng ta sẽ khám phá cách mapMhoạt động bằng cách đưa ra gvà lập luận

"-v-\n-v-"

làm đầu vào.

mapMbản đồ đầu tiên gtrên Stringvà vì gchuyển đổi Charthành Strings, điều này cho chúng ta một danh sáchStrings

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

Trong khi đây là loại đầu ra chính xác, mapMlàm nhiều hơn một chút. Bạn có thể nghĩ về nó như hình thành tất cả các Strings mà bạn có thể tạo từ danh sách này nếu bạn phải chọn một ký tự từ mỗi ký tự Stringtrong đó (theo thứ tự).

Vì vậy, đối với phần tử đầu tiên, bạn không có lựa chọn nào khác ngoài việc chọn Char '-'. Đối với phần tử thứ hai, bạn có thể chọn giữa 'v''^', v.v.

Nó gần tương đương với mã python này:

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

Ngoại trừ việc Haskell tách biệt giữa Chars và Strings, khi nó đặt Chars vào danh sách, nó không cần đến joinchúng.

Vì vậy, đầu ra cuối cùng là

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

như mong muốn.


Ôi, tôi đã chờ đợi một câu trả lời hoàn toàn có chức năng, điều này thực sự đã thổi tôi đi về mức độ ngắn gọn của nó.
Biến đổi Fourier của Rin

2
@ Rin'sFouriertransform tôi đã hài lòng với cách độc đáo mapMlàm việc cho thách thức này, tại lần đầu tiên tôi đã có nó được xây dựng như sequence . map gnhưng điều đó có thể được thể hiện gọn như mapM id . map gvà sau đó tôi thấy tôi có thể chỉmapM g
cole

1
Tôi nghĩ bạn có thể đổi =='v'chỗ cho>'-'
H.PWiz

9

Perl 6 , 32 byte

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

Hãy thử trực tuyến!

  • .comb chia chuỗi thành các ký tự.
  • ».&{...} ánh xạ các ký tự theo chức năng giữa các dấu ngoặc nhọn.
  • $_, ('^' if /v/)tạo ra một danh sách thay thế cho mỗi nhân vật. Chỉ vcó một thay thế : ^.
  • [X~]giảm danh sách đó với toán tử sản phẩm chéo chuỗi X~.

9

Thạch , 7 byte

«Ƭ€”^Œp

Hãy thử trực tuyến!

Đầu ra là một danh sách các chuỗi Jelly.

Giải trình:

«Ƭ€”^Œ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

Tôi thực sự đã lục lọi các trang mã Jelly để cố gắng tìm ra câu trả lời đầu tiên liên tục vượt qua mọi câu trả lời khác, hầu như luôn luôn là một lề khá tốt ... bạn có quan tâm giải thích cách thức hoạt động này không?
Biến đổi Fourier của Rin

@ Rin'sFouriertransform Tôi đã thêm một lời giải thích.
Erik the Outgolfer

6

Perl 5 , 29 byte

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

Hãy thử trực tuyến!

Trình đầu tiên của tôi!


Thông thường, người chơi golf Perl 5 gửi chương trình thay vì các chức năng để tiết kiệm từ việc phải bao gồm sub{}ở mức tối thiểu. Nhưng họ phải bổ sung say, say␠, say forhoặc say for␠để đổi lấy.

Bằng cách tiếp cận phụ, tôi có thể rút ngắn

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

đến

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

Lời giải thích khá đơn giản. Perl 5 có một globtoán tử dựng sẵn chấp nhận một mẫu hình cầu giống như vỏ có thể được sử dụng để tạo danh sách các tên tệp (ví dụ foo*.txt) hoặc danh sách các chuỗi (ví dụ {a,b,c}). Điều hấp dẫn là dòng mới cần phải được thoát, mà tôi đã thực hiện bằng cách sử dụng quotemeta(như \Q).



4

APL (Dyalog Classic) , 21 17 15 byte

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

Hãy thử trực tuyến!

tương tự như giải pháp k của tôi

trả về một chuỗi n chiều (n = số lượng thiết bị chuyển mạch)

ở dạng dễ giải thích hơn: ⊃(∘.,⌿ ⊢ ∪¨ 'v'⎕r'^')

'v'⎕r'^'thay vs bằng ^s

⊢ ∪¨... Liên hiệp với mỗi nhân vật gốc. đó là một vectơ của các chuỗi có độ dài 1 hoặc 2

∘.,⌿ giảm sản phẩm cartesian

tiết lộ

để đến phiên bản được đánh gôn hoàn toàn, chúng tôi theo mô hình f⌿ A g¨ B-> A f.g B:

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

như một tác dụng phụ, dấu ngoặc đơn không còn cần thiết


Bất cứ điều gì với một sản phẩm bên trong sản phẩm bên ngoài đều xứng đáng +1.
Adám

3

J , 42 byte

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

Hãy thử trực tuyến!

giải trình

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

Hãy lấy

-v-
-v-

như ví dụ đầu vào của chúng tôi.

  • ('v^' {~ 2 #:@i.@^ 1 #. e.&'v')tạo ra tất cả các combo có thể chỉ của các công tắc, bỏ qua định dạng đầu vào. ví dụ của chúng tôi nó tạo ra:

    vv
    v^
    ^v
    ^^
    
    • 1 #. e.&'v'đếm số vs trong đầu vào.
    • 2 #:@i.@^tăng 2 lên sức mạnh đó, tạo ra các số nguyên từ 0 đến số đói. và chuyển đổi chúng thành nhị phân#:
    • 'v^' {~thay đổi chữ số nhị phân thành v^
  • ]`('v' I.@e.~ [)`[}"1sửa đổi đầu vào ban đầu, tạo ra một bản sao của nó cho mỗi hàng của kết quả được mô tả trong bước trước đó (nghĩa là tất cả có thể v/ ^combo). Trong mỗi bản sao, vđầu vào ban đầu được thay thế bằng một chuỗi v/ ^.

3

Java, 202 197 189 191 byte

Vâng, đó là một ngôn ngữ tương đối dài dòng, nhưng đó là những gì tôi coi là chơi golf cổ điển:

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-"));
    }
}

Tôi nghĩ rằng một cách "đơn giản" để xử lý các ngắt dòng cần thiết để đạt được bố cục phù hợp là thực sự sử dụng lại mảng ký tự đầu vào ban đầu và chỉ điền nó với 'v's và '^'s tại các vị trí thích hợp.

Cập nhật:

Hóa ra việc không lưu trữ các vị trí cho phép bỏ các intkhai báo biến và mảng (với chi phí kiểm tra từng vị trí của mảng cho dù nó có chứa một vhoặc ^đang di chuyển), tiết kiệm 5 byte.

8 byte khác được lưu bằng cách tính giới hạn trên (1<<numberOfSwitches)gọn hơn.

Theo quy tắc được đề cập trong bình luận, nên tính khai báo hàm, vì vậy bây giờ nó là lambda ...


2
I'm pretty sure you have to include the function definition (String generate(String s) {...}) in your byte count. Here's a fixed/lambda version for 191 bytes. I did some minor golfing to shave off 3 bytes
Benjamin Urquhart

@BenjaminUrquhart OK, these are details of the "rules" that I'm not familiar with (I'm not golfing here sooo regularly). I thought that the actual { function body } should be relevant, because it does not matter whether you put it into a function that is static or not, and of course, if the declaration counts towards the score, one can convert it into a lambda expression. But that's what is done now, thanks for pointing this out.
Marco13

1
A few suggestions: 1. use ascii-codes, not chars (d=94). 2. Initialise i when you declare it. 3. Use i++<m instead of separate increment (need to modify the contents of the loop in one place, but this adds no cost). 4. Can you get away with (i&1<<j++)>0? 5. I don't think you need the {} for the inner for loop. 6. You can replace a[k]==d||a[k]==u with a[k]>45, I think. 7. Go with j=k=0. All that should remove 19bytes.
VisualMelon

@VisualMelon Some of these are the "classical golfing" approaches, and I already applied some of them. Whether or not they are applicable depends - I think that some {} are necessary, but I can have another look. The a[k]>45 may be a neat trick, however. Admittedly, I only wrote this to waste some time waiting for a meeting to start (hence the class name - this was intentional ;-)) but maybe I'll have another look - thanks in any case!
Marco13

@Marco13 indeed, they are classic tricks, but all applicable here specifically. I won't spoil the fun by giving you my 172 byte solution based on them (BTW, it think yours is 192, not 191, but I don't know how the lambda counting works: I'm opposed to it in any case).
VisualMelon

3

J, 41 40 24 bytes

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

Try it online!


very impressive. love the use of {. although i think [:>@,@{<@(,'^'$~'v'=])"0 would be slightly more fair since "Each output board should be of the exact same format as the input" and the input isn't boxed.
Jonah

@Jonah thanks. corrected.
ngn





2

K4, 44 bytes

Solution:

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

Examples:

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-
-^-^-
-^-^-^-
-^-

Explanation:

In-place replacement of "^". Determine number of combinations of switches (e.g. 2^n), count up in binary, replace switches...

-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 bytes

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

Try it online!

Function returning a vector of newline separated boards


ah, I was so focused on taking input in a much harder way that I neglected the ease of this one. Nice use of "[<-"!
Giuseppe

@Giuseppe: I'm not very satisfied by this solution... but I tried to generate the combinations in other ways (e.g. using binary conversion) but this ended up being the shortest.
digEmAll


1

Retina 0.8.2, 29 bytes

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

Try it online! Explanation:

T`¶v`;#

Change the newlines into ;s and the vs into # markers.

+%1`#

Replace the #s one at a time from left to right.

v$'¶$`^

Change each line into two lines, one with the # replaced with a v, one with it replaced with a ^.

%`;|$
¶

Change the ;s back into newlines and space the results apart.




1

Python 3 - construct, 203 bytes

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','-^')

Try it online!

First try, not very small but works. There is no elegant string replacement in Python...

The First loop builts a mapping of lines to bit indices, i.e. for each line, the index of the first bit in a bit counter is stored. This is used for indexing the bit counter in the next loop.

The Second loop runs a binary counter, extracts the bits for each line and iteration and joins them. After joining everything together, it is translated back to the switch map format, using string replacement.

I guess, there is a more elegant way by reusing the input string instead of rebuilding it over and over again.

Edit: inspired by the Python 3.8 answer, here is a much shorter replacing version

Python 3 - replace, 123 bytes

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))

Try it online!


0

Ruby, 64 bytes

Returns an array. Gets numbers from 1 to 2v (where v is the number of "v" in the input) and flips switches based on the v least significant bits. This allows us to save a byte over iterating from 0 to 2v1, because the v least significant bits in 2v are all zero.

In Ruby, i[j] returns the jth bit of i starting from the least significant bit, aka it is equivalent to (i>>j)&1.

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

Try it online!


0

Charcoal, 28 bytes

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

Try it online! Link is to verbose version of code. Explanation:

   ²                            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 bytes

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);

Try it online!

Standalone program, input via command line.

Loop the number of possible permutations of the input string based on the number of v's. While counting up in binary, replace each binary 1 with a ^ and each binary 0 with a v in the input string.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.