Cuerdas intercaladas

30

Inspiración. * No puedo creer que no hayamos tenido este desafío antes:

Tarea

Dadas una o más cadenas ASCII imprimibles, intercalarlas tomando un carácter de cada cadena, cíclicamente hasta que se agoten los caracteres. Si una cadena se queda sin caracteres antes que los demás, simplemente omita esa de ahora en adelante.

Ejemplos

SIMPLE da SIMPLE

POLLSy EPEESdaPEOPLELESS

LYESy APRONSdaLAYPERSONS

ABCDEy a cy 123 567daAa1B 2Cc3D E567

"\n$?*y (cadena vacía) y ,(.)" (espacio final) da ",\(n.$)?"* (espacio final)


* Hay soluciones APL más cortas.

Adán
fuente
Dado que esto es básicamente una operación de transposición, hemos tenido algunos desafíos que son muy similares, pero posiblemente ninguno sea exactamente el mismo.
Martin Ender
77
Tenía esta pregunta en mi CS HW, ¿eso significa que puedo cerrar esto como una pregunta de tarea? ; P
Downgoat
@EriktheOutgolfer ¡Genial! Aprendí algo hoy.
Adám

Respuestas:

23

Gelatina , 1 byte

Z

Pruébalo en línea!

El "incorporado" incorporado hará exactamente esto a una lista de cadenas.

Lynn
fuente
Tengo curiosidad, ¿cómo se vería el código si tuviera que rellenar cadenas cortas con espacios?
Adám
2
Eso seria z⁶. zes "transponer a la izquierda, relleno con la derecha"; Es un espacio.
Lynn
1
@ Adám Jelly funciona muy bien en las listas; ¿Dónde terminan las incorporaciones y comienzan las construcciones / diseños del lenguaje?
steenbergh
1
@ Lynn en gelatina? Cualquier cosa en las listas de átomos y Quicks son complementos.
Adám
2
@ Adám ;"(concatenación de elementos) resolvería la tarea sin una función incorporada.
Dennis
8

Python 2, 101 89 86 69 bytes

Espero poder incluir esto en una lambda de alguna manera, acortándolo al hacerlo recursivo. No es ideal porque esperarías que la transposición sea más corta, desafortunadamente no lo es (por lo que he logrado hasta ahora).

f=lambda s:' '*any(s)and''.join(x[:1]for x in s)+f([x[1:]for x in s])

Viejas soluciones:

w=input();o=''
while any(w):
 for i in range(len(w)):o+=w[i][:1];w[i]=w[i][1:]
print o

lambda s:''.join(''.join([c,''][c<' ']for c in x)for x in map(None,*[list(y)for y in s]))

w=input();o=''
while any(x>=' 'for x in w):
 for i in range(len(w)):o+=w[i][:1];w[i]=w[i][1:]
print o

gracias a mathmandan por hacerme sentir tonto;) me ahorró un montón de bytes! (en una solución antigua)

Kade
fuente
¿No podrías simplemente hacerlo while any(w):? Las cadenas vacías son falsey en Python.
Mathmandan
@mathmandan Tienes toda la razón, no sé lo que estaba pensando ...
Kade
No hay problema :) Su nueva solución se ve genial, excepto que creo que necesita anteponer f=.
Mathmandan
Puede quitar la []llamada recursiva y abandonarla f(x[1:] for x in s), lo que la convierte en una comprensión generadora, que en este contexto actúa igual que una lista.
bioweasel
8

Perl 6 , 34 32 bytes

{[~] flat roundrobin |$_».comb}

{roundrobin(|$_».comb).flat.join}

Una lambda que toma una matriz de cadenas como argumento y devuelve una cadena.

( Pruébelo en línea )

smls
fuente
Hubiera usado en @_lugar de$_
Brad Gilbert b2gills
7

CJam , 4 bytes

qN/z

Pruébalo en línea!

También podemos escribir una función sin nombre para 4 bytes, que espera una lista de cadenas en la parte superior de la pila:

{zs}

Pruébalo en línea!

Martin Ender
fuente
2
¡Eso es un byte por minuto!
Adám
7

Pyth - 3 bytes

Muy simple, agregará expansión más tarde, en dispositivos móviles.

s.T

Banco de pruebas

s                         Join all the strings together
 .T                       Transpose, without chopping off overhang
  (Q implicit)
Maltysen
fuente
44
@Daniel También estoy en la escuela: P
Maltysen
¿Algún plan para agregar la explicación?
John Dvorak
@ JanDvorak seguro que lo está haciendo ahora.
Maltysen
6

JavaScript (ES6), 52 46 bytes

f=([[c,...s],...a])=>s+a?c+f(s+s?[...a,s]:a):c

Toma la entrada como una matriz de cadenas y las salidas como una sola cadena.

Fragmento de prueba

f=([[c,...s],...a])=>s+a?c+f(s+s?[...a,s]:a):c

g=a=>console.log("Input:",JSON.stringify(a),"Output:",JSON.stringify(f(a)))

g(["SIMPLE"])
g(["POLLS","EPEES"])
g(["LYES","APRONS"])
g(["ABCDE","a c","123 567"])
g(["\"\\n$?*",",(.)\" "]) // Backslash and quote are escaped, but in/output are correct

ETHproducciones
fuente
f=([[c,...s],...a])=>c?c+f([...a,s]):a+a&&f(a)
Neil
@Neil Ese es un gran enfoque. Me las arreglé para jugar golf 6 bytes por mi cuenta :-)
ETHproductions
6

Haskell, 33 bytes

import Data.List
concat.transpose

Pruébalo en Ideone. Uso:

Prelude Data.List> concat.transpose$["ABCDE","a c","123 567"]
"Aa1B 2Cc3D E567"

Sin usar un incorporado: ( 38 34 bytes)

f[]=[]
f x=[h|h:_<-x]++f[t|_:t<-x]

Pruébalo en Ideone. ¡4 bytes de descuento gracias a Zgarb! Uso:

Prelude> f["ABCDE","a c","123 567"]
"Aa1B 2Cc3D E567"
Laikoni
fuente
1
Puede eliminar todos los parens en la versión alternativa. Sin embargo, aún no superará la importación.
Zgarb
¿Realmente necesitas el caso base?
xnor
No importa, por supuesto, se necesita el caso base.
xnor
@xnor Tampoco puede mover el caso base hasta el final y reemplazarlo f a=apara guardar un byte porque ambos []tienen un tipo diferente ... muy cerca.
Laikoni
5

C, 114 84 bytes

-20 bytes para no calcular la longitud.

i,b;f(char**s){b=1;while(b){i=-1;b=0;while(s[++i]>0)if(*s[i])putchar(*s[i]++),++b;}}

Acepta una matriz de punteros de caracteres y requiere que el último elemento sea un puntero nulo (ver uso).

Sin golf y uso:

i,b;f(char**s){
 b=1;
 while(b){
  i=-1;
  b=0;
  while(s[++i]>0)
   if(*s[i])
    putchar(*s[i]++),++b;
 }
}


int main(){
 char*a[]={ 
//  "POLLS","EPEES"
//  "LYES","APRONS"
 "ABCDE","a c","123 567"
 ,0};
 f(a);
 puts("");
}
Karl Napf
fuente
¿El uso de printf / sprintf no está permitido? : D ganarías bastantes bytes.
Walfrat
@Walfrat Sin imprimir directamente, necesitaría asignar una cadena, entonces, ¿cómo podría esto salvar algo?
Karl Napf
fue antes de su edición donde agregó ++ b y eliminó el cálculo de longitud, por lo que sí ya no puede funcionar.
Walfrat
@ Walfrat Sí, pero tuve un malloc y returnantes y esto fue más largo que solo imprimir
Karl Napf
5

PHP, 68 67 bytes

for(;$f=!$k=$f;$i++)for(;y|$v=$argv[++$k];$f&=""==$c)echo$c=$v[$i];

Recorre los argumentos de la línea de comandos. Corre con -r.

Después del bucle interno, $fes 1cuando todas las cadenas están terminadas, de lo 0contrario (bits se &convierte ""==$cen int).
Próxima iteración del bucle externo: copiar $fen $k(guarda un byte de $k=0) y alternar $f:
cuando todas las cadenas están listas, $fahora está falsey el bucle se rompe.

Tito
fuente
No funciona con cadenas de entrada vacías. Eche un vistazo al último caso de prueba
aross el
@aross: arreglado. Gracias.
Titus
4

Retina , 13 bytes

El recuento de bytes asume la codificación ISO 8859-1.

O$#`.
$.%`
¶

Pruébalo en línea!

Explicación

O$#`.
$.%`

Esto se basa en la técnica de transposición estándar en retina. Ordenamos ( O) todos los caracteres sin salto de línea ( .), por ($# ) el número de caracteres que se encuentran delante de ellos en la misma línea ( $.%`), es decir, su posición horizontal.

La segunda etapa simplemente elimina los avances de línea de la entrada.

Martin Ender
fuente
4

Java, 19 + 155 = 174 160

String f(java.util.Queue<String> q){String s,r="";while(!q.isEmpty()){s=q.poll();r+=s.isEmpty()?"":s.charAt(0);if(s.length()>1)q.add(s.substring(1));}return r;}

Sin golf:

  String f(java.util.Queue<String> q) {
    String s, r = "";
    while (!q.isEmpty()) {
      s = q.poll();
      r += s.isEmpty() ? "" : s.charAt(0);
      if (s.length() > 1) {
        q.add(s.substring(1));
      }
    }
    return r;
  }

Salida:

SIMPLE

SIN PERSONAS

CAPAS

Aa1B 2Cc3D E567

", (n. $)?" *

Primera modificación: declaración de cadena combinada para guardar algunos bytes. Eliminado import, fue utilizado por el main()método (no mostrado aquí) que también necesitaba LinkedList. Hay menos bytes para hacer referencia Queuedirectamente.


fuente
inicializar la cadena s con la cadena r puede ahorrar algunos más
Syamesh K
Sé que fue hace casi un año, pero puedes jugar al golf unos pocos bytes:String f(java.util.Queue<String>q){String s,r="";for(;!q.isEmpty();r+=s.isEmpty()?"":s.charAt(0))if((s=q.poll()).length()>1)q.add(s.substring(1));return r;}
Kevin Cruijssen
3

PHP, 77 bytes

Golfed

function($a){for($d=1;$d!=$s;$i++){$d=$s;foreach($a as$v)$s.=$v[$i];}echo$s;}

Función anónima que toma una serie de cadenas.

Estoy seguro de que esto se podría jugar más, pero es temprano. En cada iteración, tomamos la letra i-ésima de cada cadena dada y la agregamos a nuestra cadena final, una a la vez. PHP solo lanza advertencias si accedemos a fragmentos de cadenas que no existen, así que está bien. Solo nos detenemos cuando no se han realizado cambios después de recorrer todas las cadenas una vez.

Siento que el uso de $dse puede jugar más al golf, pero es temprano. :PAGS

Xanderhall
fuente
¿Cómo exactamente pones una matriz de cadenas en un solo argumento?
Titus
@Titus. Ya sabes, nunca lo pensé realmente. Solo supuse que podías.
Xanderhall
3

En realidad , 7 6 bytes

Sugerencias de golf bienvenidas! Pruébalo en línea!

Editar: -1 byte gracias a Teal pelican.

a Z♂ΣΣ

Ungolfing

          Implicit input each string.
a         Invert the stack so that the strings are in the correct order.
<space>   Get the number of items on the stack, len(stack).
Z         Zip all len(stack) strings into one, transposing them.
♂Σ        sum() every transposed list of chars into strings.
Σ         sum() again to join the strings together.
Sherlock9
fuente
¿No puedes eliminar el # para hacerlo 6 bytes?
Teal pelican
@Tealpelican Welp, ahora voy a tener que excavar a través de todos mis viejos En realidad, respuestas y ver si no puedo cambiar Z♂#Σa Z♂Σen todos ellos. Gracias por el consejo: D
Sherlock9
La primera vez que buscas en el idioma, ¡se ve muy divertido! Me alegro de poder ayudar :))
Teal pelican
3

JavaScript (ES6), 46 bytes

f=([[c,...s],...a])=>c?c+f([...a,s]):a+a&&f(a)
<textarea oninput=o.textContent=f(this.value.split`\n`)></textarea><div id=o>

Neil
fuente
3

Python 2 , 58 bytes

lambda*m:''.join(map(lambda*r:''.join(filter(None,r)),*m))

Pruébalo en línea!

Keerthana Prabhakaran
fuente
¿No puedes quitar el espacio lambda *m?
Erik the Outgolfer
Acabo de hacer eso! ¡Gracias!
Keerthana Prabhakaran
2

J , 13 bytes

({~/:)&;#\&.>

Pruébalo en línea!

Basado en la inspiración para esta pregunta.

Otra forma de hacerlo toma 27 bytes pero funciona usando transposición. La mayoría de los bytes son para manejar los ceros agregados automáticamente del relleno.

[:u:0<:@-.~[:,@|:(1+3&u:)&>

Explicación

({~/:)&;#\&.>  Input: list of boxed strings S
          &.>  For each boxed string x in S
        #\       Get the length of each prefix from shortest to longest
                 This forms the range [1, 2, ..., len(x)]
                 Rebox it
(    )         Operate on S and the prefix lengths
      &;         Raze both
   /:            Grade up the raze of the prefix lengths
 {~              Index into the raze of S using the grades
               Return
millas
fuente
J prohibir matrices mixtas realmente te duele aquí. Pruébalo en APL.
Adám
2

Bash + utilidades GNU, 55

 eval paste `sed "s/.*/<(fold -1<<<'&')/g"`|tr -d \\n\\t

E / S a través de STDIN (línea separada) y STDOUT.

Los sedformatos de cada línea a una sustitución de proceso bash . Estos se evaleditan pastepara hacer el entrelazado real. trluego elimina las nuevas líneas y pestañas innecesarias.

Ideona

Trauma
fuente
2

PHP, 63 bytes

Nota: utiliza la codificación IBM-850

for(;$s^=1;$i++)for(;n|$w=$argv[++$$i];$s&=$x<~■)echo$x=$w[$i];

Corre así:

php -r 'for(;$s^=1;$i++)for(;n|$w=$argv[++$$i];$s&=$x<~■)echo$x=$w[$i];' "\"\n\$?*" "" ",(.)\" " 2>/dev/null;echo
> ",\(n.$)?"* 

Explicación

for(                       # Iterate over string index.
  ;
  $s ^= 1;                 # Continue until $s (stop iterating) is 1.
                           # Flip $s so each iteration starts with $s
                           # being 1.
  $i++                     # Increment string index.
)
  for(
    ;
    "n" | $w=$argv[++$$i]; # Iterate over all input strings. OR with "n"
                           # to allow for empty strings.
    $s &= $x<~■            # If last character printed was greater than
                           # \x0 (all printable chars), set $s to 0,
                           # causing the loop to continue.
  )
    echo $x = $w[$i];      # Print char $i of current string.
aross
fuente
IBM-850 ?! ¿Es esa una codificación natural para PHP?
Adám
@ Adám, ¿qué quieres decir con "natural"? PHP trata los bytes en el rango 128-255 como texto, que por lo tanto se interpreta como una constante. Si la constante no está definida, se interpretará como una cadena. Es para que yo pueda hacer~■ (binario negado 254) en lugar de "\x1"(binario 1).
aross
1
Veo. No es que realmente necesites esa página de códigos, solo necesitas un byte de 254.
Adám
@ Adám sí, la página de códigos solo lo convierte en un personaje imprimible que es un poco menos molesto.
aross
Gran uso de $$!
Tito
2

Python 3, 75 bytes

Sé que el otro Python es más corto, pero esta es la primera vez que lo uso mapen mi vida, así que estoy muy orgulloso de ello.

lambda n:''.join(i[k]for k in range(max(map(len,n)))for i in n if len(i)>k)
bioweasel
fuente
1

C, 75 71 bytes

La única limitación es la longitud de salida. Actualmente es 99, pero se puede extender fácilmente a 999 (+1 byte).

i;main(a,b)char**b;{a--;for(;i<99;i++)*b[i%a+1]&&putchar(*b[i%a+1]++);}

Sin golf:

i;
main( a, b )
char **b;
{
    a--;
    for( ; i < 99; i++ )
        *b[i % a + 1] && putchar( *b[i % a + 1]++ );
}
Jacajack
fuente
1

Oracle SQL, 195 bytes

    select listagg(b,'') within group(order by l,o) from(select substr(a,level,1) b,level l,o from i start with length(a)>0 connect by prior a=a and level<=length(a) and prior sys_guid() is not null)

Toma su entrada de una tabla nombrada icon columnasa (que contiene la cadena) y o(orden de la cadena):

    create table i (a varchar2(4000), a integer)

Explicación:
Estamos explotando CONNECT BYpara dividir las cuerdas en cada uno de los personajes que las componen. PRIOR SYS_GUID()siendoNOT NULL asegura que no terminemos atrapados en un bucle.
Luego concatenamos los caracteres individuales con LISTAGGpero los barajamos con unORDER BY cláusula, ordenándolos primero por su posición en la cadena original y solo luego por la cadena de la que provienen.

No es tan breve como las otras respuestas, pero SQL no se entiende realmente como un lenguaje de manipulación de cadenas :)

Demonblack
fuente
1

Python 2, 128 96

Esperaba no tener que usar itertools

a=lambda a:"".join([i for i in reduce(lambda: b,c:b+c, map(None,*map(lambda m:list(m),a)) if i])

Sin golf

 a=lambda a:                              #Start a lambda taking in a
    "".join(                              #Join the result together with empty string
        [i for i in reduce(               #For every item, apply the function and 'keep'
           lambda: b,c:b+c,               #Add lists from...
                map(None,*map(            #None = Identity function, over a map of...
                    lambda m:list(m), a)  #list made for mthe strings m
                   ) if i                 #truthy values only (otherwise the outer map will padd with None.
       ])
Pureferret
fuente
Agradecería comentarios / consejos para mejorar esto.
Pureferret
1

R , 73 bytes

for(i in 1:max(nchar(s<-scan(,""))))for(j in seq(s))cat(substr(s[j],i,i))

Pruébalo en línea!

Explicación: muy simple (pero detallada), simplemente repita la impresión del icarácter de la jcadena. Afortunadamente, substrdevuelve una cadena vacía si se le da una entrada fuera de rango.

usuario2390246
fuente
0

Python, 112 bytes

i=len(x)if len(x)>len(y) else len(y) h=0 a="" while h<i: if h<len(x) a+=x[h] if h<len(y): a += y[h] h+=1 print a
jacksonecac
fuente
66
Su formato a que realmente está en mal estado .. donde se puede incluso obtener xy yde?
Kade
0

Perl 5 , 53 bytes

$i=0,map{push@{$a[$i++]},$_}/./g for<>;print@$_ for@a

Pruébalo en línea!

Método

Crea una matriz bidimensional donde el número de filas es igual a la longitud de la cadena más larga y el número máximo de columnas es igual al número de cadenas. Luego, envíe cada fila de la matriz sin espaciado.

Xcali
fuente
0

TXR Lisp , 20 bytes

(opip weave cat-str)

Correr:

1> (opip weave cat-str)
#<intrinsic fun: 0 param + variadic>
2> [*1 "LYES" "APRONS"]
"LAYPERSONS"
3> [*1 "ABCDE" "a c" "" "123 567"]
"Aa1B 2Cc3D E567"
4> [*1 "\"\\n$?*" "" ",(.) "]
"\",\\(n.$)? *"

La weavefunción es perezosa, por lo que devuelve una lista, por lo que debemos forzar el resultado a una cadena. Al ser perezoso, puede tejer secuencias infinitas. Por ejemplo, podemos tejer los números naturales pares e impares, que son en sí mismos listas perezosas infinitas:

5> (take 20 (weave (range 2 : 2) (range 1 : 2)))
(2 1 4 3 6 5 8 7 10 9 12 11 14 13 16 15 18 17 20 19)
Kaz
fuente
0

K (oK) , 35 29 bytes

Solución:

{`c$r@&~^r:,/+(`i$x)[;!#,/x]}

Pruébalo en línea!

Ejemplo:

> {`c$r@&~^r:,/+(`i$x)[;!#,/x]}("ABCDE";"a c";"123 567")
"Aa1B 2Cc3D E567"
> {`c$r@&~^r:,/+(`i$x)[;!#,/x]}("\n$?*";"";",(.)\" ")
"\n,$(?.*)\" "
> {`c$r@&~^r:,/+(`i$x)[;!#,/x]}("POLLS";"EPEES")
"PEOPLELESS"

Explicación:

Use la indexación de segundo nivel para extraer índices de 0 a máximo (longitud de la lista aplanada) en todas las listas de entrada. Cualquier indexación más allá del límite de la sublista devolverá un valor nulo. Voltear (gira 90), aplanar y luego extraer los resultados no nulos.

Notas:

  • Lanzo a entero ( i$) para que obtengamos nulos útiles, como espacio ( ) se considera nulo para una lista de caracteres, lo que significa que no puede distinguir nulos de espacios válidos.
  • Además, no pude hacer que el TIO funcionara con la entrada (funcionó bien en la respuesta oK), por lo que el enlace TIO incluye el ejemplo "ABCDE" ...
callejero
fuente
0

Jq 1.5 , 49 bytes

map(explode)|transpose|map(map(values)[])|implode

Explicación

                      # example input:          ["LYES","APRONS"]
  map(explode)        # make list of ordinals   [[76,89,69,83],[65,80,82,79,78,83]]
| transpose           # zip lists               [[76,65],[89,80],[69,82],[83,79],[null,78],[null,83]]
| map(map(values)[])  # rm nulls and flatten    [76,65,89,80,69,82,83,79,78,83]
| implode             # convert back to string  "LAYPERSONS"

Ejecución de muestra

$ paste input <(jq -Mrc 'map(explode)|transpose|map(map(values)[])|implode' input)
["SIMPLE"]                  SIMPLE
["POLLS","EPEES"]           PEOPLELESS
["LYES","APRONS"]           LAYPERSONS
["ABCDE", "a c", "123 567"] Aa1B 2Cc3D E567
["\"\\n$?*", "", ",(.)\" "] ",\(n.$)?"* 

$ echo -n 'map(explode)|transpose|map(map(values)[])|implode' | wc -c
  49    

Pruébalo en línea

jq170727
fuente