Fuerza bruta de la centralita

32

El otro día, nuestro equipo fue a una sala de escape. Uno de los acertijos involucraba una placa de seis interruptores mecánicos donde tenía que encontrar la combinación correcta de encendido y apagado para desbloquear una caja, algo así:

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

Como desarrolladores, decidimos que sería más eficiente probar cada una de las combinaciones 2 ^ 6 = 64 que resolver el rompecabezas. Entonces le asignamos a un pobre tipo que haga un recuento binario:

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

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

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

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

y así.

El desafío
Escriba un programa que, dado que todos los interruptores están en la posición de apagado como una cadena con el formato anterior, genera todas las combinaciones de encendido y apagado en cualquier orden.

Puede escribir un programa completo o una función. Por lo tanto, su programa puede recibir la entrada a través de stdin, un archivo o como un argumento de cadena única, y puede devolver o imprimir la salida. Si se devuelve, la salida puede estar en una lista / matriz / etc. en lugar de una sola cadena. Si la salida es una sola cadena, los tableros deben estar separados por nuevas líneas (se permiten nuevas líneas finales).

Las cadenas de entrada coincidirán con la expresión regular r'((-v)+-)(\n(-v)+-)*'y representarán una placa con todos los interruptores apagados. Esto significa que no hay mayúsculas y cero, y los interruptores están alineados a la izquierda. Es posible que cada fila no tenga el mismo número de interruptores.

Cada placa de salida debe tener exactamente el mismo formato que la entrada, excepto que las v se pueden reemplazar por ^ 's según sea necesario. Las placas de salida se pueden separar por cualquier número de nuevas líneas.

Dado que el tiempo de ejecución es naturalmente O (2 ^ n) en la cantidad de interruptores, su código no se probará en más de 10 interruptores en ninguna disposición.

Este es el código de golf, por lo que gana el código más corto en número de bytes.

Muestra de entradas y salidas

Entrada:

-v-

Salida posible:

-v-
-^-

Entrada:

-v-
-v-

Salida posible:

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

-v-
-^-


-v-
-v-

Dado que es extremadamente tedioso verificar su respuesta para un mayor número de interruptores, aquí hay un script de Python como una herramienta de verificación de cordura. (He incluido un fragmento actualmente comentado para generar la salida esperada de un archivo de entrada dado en caso de que desee más casos de prueba). Desafortunadamente, es un poco menos flexible en términos de entrada y salida que la especificación; coloque la cadena de entrada en un archivo llamado 'input' y la salida separada por la nueva línea (lo siento, sin formato de lista) en un archivo llamado 'output' en el mismo directorio y ejecútelo python3 sanitycheck.py.

Transformada de Fourier de Rin
fuente
8
bonito primer desafío!
Giuseppe
12
Con suerte, el "pobre hombre" sabía sobre el código Gray para cambiar solo un bit entre cada combinación.
Eric Duminil
1
El tiempo es nuestro activo más preciado, no lo desperdicies en vano.
Pedro Lobito
66
Dado el tema, estoy decepcionado de que no haya requerido un pedido que requiera la menor cantidad de conmutadores (por ejemplo, 00-> 01-> 11-> 10 tiene 3 conmutadores, mientras que 00-> 01-> 10-> 11 tiene 4 ) - Compañero escapista de la fuerza bruta
ikegami
2
@EricDuminil: si los interruptores mecánicos no fueran botones (y tal vez incluso si), lo más probable es que la diferencia del tiempo necesario entre cambiar uno, dos y tres interruptores consecutivos (que probablemente podría hacer casi simultáneamente) no sería lo suficientemente grande para compensar el trabajo mental extra para seguir el código Gray.
tomasz

Respuestas:

23

Haskell , 25 24 23 17 bytes

mapM$min"^v".pure

Pruébalo en línea!

-1 byte gracias a @ H.PWiz

-1 byte gracias a @nimi

Devuelve una lista de cadenas. El TIO tiene 2 bytes adicionales para la declaración de función: he visto a otras personas dejarlo cuando escriben la función sin puntos, así que estoy haciendo lo mismo a menos que se indique lo contrario.

Respuesta anterior (25 bytes)

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

Las explicaciones son todas para la respuesta anterior, que funciona más o menos de la misma manera, excepto que subrayé la definición de g. La manera gfunciona ahora es mediante el uso de comparación léxica de sustituir ^vpor vy mantener todo lo demás igual.

Curiosamente, esto funciona para cuadros de distribución arbitrarios:

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

Explicación (corta)

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

Explicación (larga)

mapMes una función bastante aterradora para aquellos que no están familiarizados con Haskell. Pero no es difícil de entender en este contexto. Al hacerlo actuar en Strings (que en Haskell son listas de caracteres), lo he especializado en su definición de listas. Entonces, en este contexto, su firma de tipo es

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

En realidad, es aún más especializado en mi uso, ay bson ambos Char, por lo que podemos ver la firma de tipo como

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

Veamos rápidamente qué ghace antes de explicar cómo mapMfunciona.

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

gutiliza la coincidencia de patrones para convertir el Char 'v'en la cadena "v^"; todo lo demás se convierte en una cadena singleton (recuerde, las cadenas son solo listas de Chars, por lo que podemos ponerlas xen una lista singleton). Al probar REPL, encontramos que este es el caso

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

Tenga en cuenta que gtiene el tipo correcto para ser un argumento de mapM(¡como era de esperar!).

Exploraremos cómo mapMfunciona dándole gy el argumento

"-v-\n-v-"

como entrada

mapMprimeros mapas gsobre String, y porque gconvierte Chars en Strings, esto nos da una lista deStrings

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

Si bien este es el tipo de salida correcto, mapMhace un poco más. Puede pensar que forma todos los correos Stringelectrónicos que podría crear a partir de esta lista si tuviera que elegir un solo carácter de cada uno Stringen ella (en orden).

Entonces, para el primer elemento, no tiene otra opción que elegir el Char '-'. Para el segundo elemento, puede elegir entre 'v'y '^', y así sucesivamente.

Es más o menos equivalente a este código de Python:

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

Excepto que, dado que Haskell se separa entre Charsy Strings, cuando coloca las Chars en una lista, no las necesita join.

Entonces el resultado final es

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

como se desee.

col
fuente
Ooh, he estado esperando una respuesta puramente funcional, esto realmente me sorprendió de lo conciso que era.
La transformación de Fourier de Rin el
2
@ Rin'sFouriertransform Estaba satisfecho con lo bien que mapMfuncionó para este desafío, al principio lo formulé como sequence . map gpero eso se puede expresar de manera compacta mapM id . map gy luego vi que podía simplementemapM g
cole
1
Creo que puedes cambiar =='v'por>'-'
H.PWiz
9

Perl 6 , 32 bytes

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

Pruébalo en línea!

  • .comb divide la cadena en caracteres.
  • ».&{...} asigna los caracteres de acuerdo con la función entre llaves.
  • $_, ('^' if /v/)produce una lista de alternativas para cada personaje. Sólo vtiene una alternativa: ^.
  • [X~]reduce esa lista con el operador de productos cruzados de concatenación de cadenas X~.
Sean
fuente
9

Jalea , 7 bytes

«Ƭ€”^Œp

Pruébalo en línea!

La salida es una lista de cadenas Jelly.

Explicación:

«Ƭ€”^Œ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
Erik el Outgolfer
fuente
De hecho, he estado revolviendo las páginas de códigos de Jelly para tratar de descubrir cómo la primera respuesta ha superado continuamente a cualquier otra respuesta, casi siempre por un margen bastante bueno ... ¿le importaría explicar cómo funciona esto?
La transformación de Fourier de Rin el
@ Rin'sFouriertransform He agregado una explicación.
Erik the Outgolfer
6

Perl 5 , 29 bytes

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

Pruébalo en línea!

Mi primera sumisión!


Normalmente, los golfistas de Perl 5 envían programas en lugar de funciones para evitar tener que incluir sub{}como mínimo. Pero tienen que añadir say, say␠, say foro say for␠a cambio.

Al ir al enfoque secundario, podría acortar

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

a

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

La explicación es bastante simple. Perl 5 tiene un globoperador incorporado que acepta un patrón de globo tipo shell que puede usarse para generar listas de nombres de archivo (por ejemplo foo*.txt) o una lista de cadenas (por ejemplo {a,b,c}). El problema es que la nueva línea necesita escapar, lo que he hecho usando quotemeta(como \Q).

ikegami
fuente
4

K (ngn / k) , 27 25 bytes

{?(,/,/:\:)/x,'"^"/"v"\x}

Pruébalo en línea!

"^"/"v"\reemplazar "v"con"^"

x,' zip con los caracteres originales

(,/,/:\:)/ producto cartesiano sobre

? uniq

ngn
fuente
.. y aquí estoy yo pensando que lo hice bien en 44 bytes!
Calles el
4

APL (Dyalog Classic) , 21 17 15 bytes

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

Pruébalo en línea!

similar a mi solución k

devuelve una matriz n-dimensional de cadenas (n = número de conmutadores)

en forma más fácil de explicar: ⊃(∘.,⌿ ⊢ ∪¨ 'v'⎕r'^')

'v'⎕r'^'reemplazar vs con ^s

⊢ ∪¨... uniones con cada uno de los personajes originales. es un vector de cadenas de longitud 1 o 2

∘.,⌿ reducción de productos cartesianos

revelar

para llegar a la versión totalmente golfizada seguimos el patrón f⌿ A g¨ B-> A f.g B:

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

como efecto secundario los paréntesis ya no son necesarios

ngn
fuente
Cualquier cosa con un producto externo producto interno merece +1.
Adám
3

J , 42 bytes

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

Pruébalo en línea!

explicación

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

Dejar tomar

-v-
-v-

como nuestro ejemplo de entrada.

  • ('v^' {~ 2 #:@i.@^ 1 #. e.&'v')crea todos los combos posibles de solo los interruptores, ignorando el formato de entrada. para nuestro ejemplo produce:

    vv
    v^
    ^v
    ^^
    
    • 1 #. e.&'v'cuenta los números de vs en la entrada.
    • 2 #:@i.@^eleva 2 a esa potencia, produce los enteros de 0 a ese número i.y los convierte en binarios#:
    • 'v^' {~Los cambios en los dígitos binarios vy^
  • ]`('v' I.@e.~ [)`[}"1modifica la entrada original, produciendo una copia para cada fila del resultado descrito en el paso anterior (es decir, todos los posibles v/ ^combos). En cada copia, la ventrada original se reemplaza con una posible secuencia de v/ ^.
Jonás
fuente
3

Java, 202 197 189 191 bytes

Sí, es un lenguaje comparativamente detallado, pero eso es lo que considero como golf clásico:

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

Pensé que una manera "simple" de hacer frente a los saltos de línea que son necesarias para lograr que el diseño apropiado era que en realidad re-utilizar la matriz de caracteres de entrada original, y sólo llenarlo con 'v's y '^'S a las posiciones adecuadas.

Actualizaciones:

Resultó que no almacenar las posiciones permite deshacerse de las intdeclaraciones de variables de la matriz (a costa de verificar cada posición de la matriz si contiene una vo ^sobre la marcha), ahorrando 5 bytes.

Otros 8 bytes guardados al calcular el límite (1<<numberOfSwitches)superior de manera más compacta.

De acuerdo con la regla mencionada en el comentario, la declaración de función debe contarse, por lo que ahora es una lambda ...

Marco13
fuente
2
Estoy bastante seguro de que debe incluir la definición de función ( String generate(String s) {...}) en su recuento de bytes. Aquí hay una versión fija / lambda para 191 bytes . Practiqué un poco de golf para reducir 3 bytes
Benjamin Urquhart
@BenjaminUrquhart OK, estos son detalles de las "reglas" con las que no estoy familiarizado (no estoy jugando al golf aquí tan regularmente). Pensé que lo real { function body }debería ser relevante, porque no importa si lo pones en una función que es statico no, y por supuesto, si la declaración cuenta para el puntaje, uno puede convertirlo en una expresión lambda. Pero eso es lo que se hace ahora, gracias por señalar esto.
Marco13
1
Algunas sugerencias: 1. use códigos ascii, no caracteres ( d=94). 2. Inicialice icuando lo declare. 3. Use en i++<mlugar de un incremento separado (necesita modificar el contenido del bucle en un solo lugar, pero esto no tiene costo). 4. ¿Puedes salirte con la tuya (i&1<<j++)>0? 5. No creo que necesites el {}para el forbucle interno . 6. Puede reemplazar a[k]==d||a[k]==ucon a[k]>45, creo. 7. Ve con j=k=0. Todo lo que debería eliminar 19bytes.
VisualMelon
@VisualMelon Algunos de estos son los enfoques de "golf clásico", y ya apliqué algunos de ellos. Si son aplicables o no depende: creo que algunas {}son necesarias, pero puedo echarle otro vistazo. El a[k]>45puede ser un buen truco, sin embargo. Es cierto que solo escribí esto para perder el tiempo esperando que comience una reunión (de ahí el nombre de la clase, esto fue intencional ;-)), pero tal vez voy a echar otro vistazo, ¡en cualquier caso, gracias!
Marco13
@ Marco13 de hecho, son trucos clásicos, pero todos aplicables aquí específicamente. No estropearé la diversión dándote mi solución de 172 bytes basada en ellos (BTW, creo que la tuya es 192, no 191, pero no sé cómo funciona el conteo lambda: en cualquier caso, me opongo a eso) )
VisualMelon
3

J , 41 40 24 bytes

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

Pruébalo en línea!

ngn
fuente
muy impresionante. Me encanta el uso de {. aunque creo que [:>@,@{<@(,'^'$~'v'=])"0sería un poco más justo ya que "Cada placa de salida debe tener exactamente el mismo formato que la entrada" y la entrada no está encuadrada.
Jonás
@ Jonás gracias. corregido
NGN
3

Python 2 , 87 bytes

def f(s):i=s.find('v');return(i>=0and f(s[:i].replace('^','v')+'^'+s[i+1:])+'\n'or'')+s

Pruébalo en línea!

Un enfoque no regex.

Chas Brown
fuente
Un enfoque mucho más conciso que el mío, ¡buen trabajo!
movatica
2

K4 , 44 bytes

Solución:

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

Ejemplos:

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

Explicación:

Reemplazo en el lugar de "^". Determine el número de combinaciones de interruptores (por ejemplo, 2 ^ n), cuente en binario, reemplace los interruptores ...

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

Pruébalo en línea!

Función que devuelve un vector de tableros separados de nueva línea

digEmAll
fuente
Ah, estaba tan concentrado en recibir aportes de una manera mucho más difícil que descuidé la facilidad de este. Buen uso de "[<-"!
Giuseppe
@Giuseppe: No estoy muy satisfecho con esta solución ... pero intenté generar las combinaciones de otras maneras (p. Ej., Utilizando la conversión binaria), pero esto terminó siendo el más corto.
digEmAll
1

JavaScript, 88 bytes

s=>(g=n=>n--?g(n)+`
`+s.replace(/v/g,_=>'v^'[i=n&1,n>>=1,i]):'')(2**~-s.split`v`.length)

Pruébalo en línea!

Darrylyeo
fuente
1
n>>=1->n/=2
NGN
1

Retina 0.8.2 , 29 bytes

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

Pruébalo en línea! Explicación:

T`¶v`;#

Cambie las nuevas líneas en ;sy las vs en #marcadores.

+%1`#

Reemplace el #s uno a la vez de izquierda a derecha.

v$'¶$`^

Cambie cada línea en dos líneas, una con el #reemplazado por a v, otra con el reemplazado por a ^.

%`;|$
¶

;Vuelva a cambiar la s a nuevas líneas y separe los resultados.

Neil
fuente
1

Python 3 - construcción, 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','-^')

Pruébalo en línea!

Primer intento, no muy pequeño pero funciona. No hay reemplazo de cuerda elegante en Python ...

El primer bucle crea una asignación de líneas a índices de bits, es decir, para cada línea, se almacena el índice del primer bit en un contador de bits. Esto se usa para indexar el contador de bits en el siguiente ciclo.

El segundo bucle ejecuta un contador binario, extrae los bits para cada línea e iteración y los une. Después de unir todo, se traduce nuevamente al formato de mapa de conmutación, utilizando el reemplazo de cadena.

Supongo que hay una manera más elegante reutilizando la cadena de entrada en lugar de reconstruirla una y otra vez.

Editar: inspirado en la respuesta de Python 3.8 , aquí hay una versión de reemplazo mucho más corta

Python 3 - reemplazar, 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))

Pruébalo en línea!

movatica
fuente
0

Ruby , 64 bytes

12vvv0 02v-1v2v

En Ruby, i[j]devuelve el jbit de iinicio desde el bit menos significativo, es decir, es equivalente a (i>>j)&1.

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

Pruébalo en línea!

Tinta de valor
fuente
0

Carbón , 28 bytes

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

Pruébalo en línea! El enlace es a la versión detallada del código. Explicación:

   ²                            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
Neil
fuente
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);

Pruébalo en línea!

Programa independiente, entrada por línea de comando.

Repita el número de posibles permutaciones de la cadena de entrada en función del número de v's. Mientras cuenta en binario, reemplace cada binario 1con a ^y cada binario 0con a ven la cadena de entrada.

640 KB
fuente