Stringhe interleave


30

Ispirazione. * Non posso credere che non abbiamo mai avuto questa sfida prima:

Compito

Dato uno o più stringhe ASCII stampabili, interlacciali prendendo un carattere da ogni stringa, ciclicamente fino a quando non sono più caratteri. Se una stringa esaurisce i caratteri prima degli altri, salta quella da quel momento in poi.

Esempi

SIMPLESIMPLE

POLLSe EPEESPEOPLELESS

LYESe APRONSLAYPERSONS

ABCDEe a ce 123 567Aa1B 2Cc3D E567

"\n$?*e (stringa vuota) e ,(.)" (spazio finale) dà ",\(n.$)?"* (spazio finale)


* Esistono soluzioni APL più brevi.


Dato che questa è fondamentalmente solo un'operazione di trasposizione, abbiamo avuto alcune sfide molto simili, ma probabilmente nessuna esattamente uguale.
Martin Ender,

7
Ho avuto questa domanda sul mio CS HW, significa che posso chiuderla come una domanda di compiti a casa? ; P
Downgoat,

@EriktheOutgolfer Cool! Ho imparato qualcosa oggi.
Adám,

Risposte:


23

Gelatina , 1 byte

Z

Provalo online!

Il "trasposizione" incorporato farà esattamente questo in un elenco di stringhe.


Sono curioso, come sarebbe il codice se dovessi riempire brevi stringhe con spazi?
Adám,

2
Quello sarebbe z⁶. zè "trasponi sinistra, imbottitura con destra"; è uno spazio.
Lynn,

1
@ Adám Jelly funziona molto bene nelle liste; dove finiscono i built-in e iniziano i costrutti / il design del linguaggio?
Steenbergh,

1
@Lynn In Jelly? Tutto ciò che è presente negli elenchi Atomi e Quicks è integrato.
Adám,

2
@ Adám ;"(concatenazione in termini di elementi) risolverebbe l'attività senza un built-in.
Dennis,

8

Python 2, 101 89 86 69 byte

Spero di riuscire a metterlo in una lambda in qualche modo, accorciandolo rendendolo ricorsivo. Non è l'ideale perché speri che il recepimento sia più breve, sfortunatamente non lo è (da quello che sono riuscito a inventare finora).

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

Vecchie soluzioni:

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

grazie a Mathmandan per avermi fatto sentire stupido;) mi ha salvato un sacco di byte! (su una vecchia soluzione)


Non potresti farlo while any(w):? Le stringhe vuote sono false in Python.
Mathmandan,

@mathmandan Hai perfettamente ragione, non so cosa stavo pensando ..
Kade,

Nessun problema :) La tua nuova soluzione sembra eccezionale, tranne che penso che tu debba anteporre f=.
Mathmandan,

Puoi togliere la []chiamata ricorsiva, lasciando f(x[1:] for x in s), che la rende una comprensione del generatore, che agisce come una lista in questo contesto.
bioweasel



7

Pyth - 3 byte

Molto semplice, aggiungerà l'espansione in seguito, su dispositivo mobile.

s.T

Test Suite

s                         Join all the strings together
 .T                       Transpose, without chopping off overhang
  (Q implicit)

4
@Daniel Anche io sono a scuola: P
Maltysen l'

Hai piani per aggiungere la spiegazione?
John Dvorak,

@JanDvorak sicuramente lo sta facendo ora.
Maltysen,

6

JavaScript (ES6), 52 46 byte

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

Accetta input come una matrice di stringhe e output come una singola stringa.

Snippet di prova

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


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

@Neil Questo è un ottimo approccio. Sono riuscito a golf 6 byte fuori dal mio :-)
ETHproductions

6

Haskell, 33 byte

import Data.List
concat.transpose

Provalo su Ideone. Uso:

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

Senza utilizzare un build-in: ( 38 34 byte)

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

Provalo su Ideone. 4 byte di sconto grazie a Zgarb! Uso:

Prelude> f["ABCDE","a c","123 567"]
"Aa1B 2Cc3D E567"

1
Puoi rimuovere tutte le parentesi nella versione alternativa. Comunque non battere l'importazione però.
Zgarb,

Hai davvero bisogno del case base?
xnor

Non importa, ovviamente è necessario il case base.
xnor

@xnor Inoltre non è possibile spostare il case base alla fine e sostituirlo con f a=aper salvare un byte perché entrambi []hanno un tipo diverso ... così vicino.
Laikoni,

5

C, 114 84 byte

-20 byte per non calcolare la lunghezza.

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

Accetta la matrice di puntatori char e richiede che l'ultimo elemento sia un puntatore null (vedi utilizzo).

Ungolfed e utilizzo:

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

L'uso di printf / sprintf non è consentito? : D vinceresti un bel po 'di byte.
Walfrat,

@Walfrat Senza stampare direttamente avrei bisogno di allocare una stringa, quindi come è possibile salvare qualcosa.
Karl Napf,

era prima della modifica in cui hai aggiunto ++ b e rimosso il calcolo della lunghezza, quindi sì non può più funzionare.
Walfrat,

@Walfrat Sì, ma avevo un malloce returnprima e questo era più lungo della semplice stampa
Karl Napf,

5

PHP, 68 67 byte

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

Passa attraverso gli argomenti della riga di comando. Corri con -r.

Dopo il ciclo interno, $fè 1quando tutte le stringhe sono finiti, 0altro (bit per bit &calchi ""==$ca int).
Prossima iterazione del ciclo esterno: copia $fin $k(salva un byte da $k=0) e attiva $f/ disattiva :
quando tutte le stringhe sono terminate, $fè ora falsee il ciclo si interrompe.


Non funziona con stringhe di input vuote. Dai un'occhiata all'ultima testcase
circa il

@aross: risolto. Grazie.
Tito

4

Retina , 13 byte

Il conteggio dei byte presuppone la codifica ISO 8859-1.

O$#`.
$.%`
¶

Provalo online!

Spiegazione

O$#`.
$.%`

Questo si basa sulla tecnica di trasposizione standard in Retina. Ordiniamo ( O) tutti i caratteri non di avanzamento riga ( .), per ( $#) il numero di caratteri davanti a loro sulla stessa riga ( $.%`), ovvero la loro posizione orizzontale.

Il secondo stadio quindi rimuove semplicemente gli avanzamenti di linea dall'input.


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

Ungolfed:

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

Produzione:

SEMPLICE

PEOPLELESS

laici

Aa1B 2Cc3D E567

", (n. $)?" *

Prima modifica: dichiarazione di stringa unita per salvare alcuni byte. Rimosso import, è stato utilizzato dal main()metodo (non mostrato qui) che era necessario LinkedList. Sono necessari meno byte per fare riferimento Queuedirettamente.


l'inizializzazione della stringa s con la stringa r può
farne

So che è stato quasi un anno fa, ma puoi giocare a golf pochi byte: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 byte

golfed

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

Funzione anonima che accetta una matrice di stringhe.

Sono sicuro che questo potrebbe essere giocato di più, ma è presto. Ad ogni iterazione, prendiamo l'i-esima lettera da ciascuna stringa data e la aggiungiamo alla nostra stringa finale, una alla volta. PHP emette solo avvisi se accediamo a bit di stringhe che non esistono, quindi va bene. Ci fermiamo solo quando non sono state apportate modifiche dopo aver ripetuto ciclicamente tutte le stringhe una volta.

Sento che l'uso di $dpuò essere golfato di più, ma è presto. : P


Come si inserisce esattamente una matrice di stringhe in un singolo argomento?
Tito

@Titus. Sai, non ci ho mai pensato. Ho solo pensato che tu potessi.
Xanderhall,

3

In realtà , 7 6 byte

Suggerimenti di golf benvenuti! Provalo online!

Modifica: -1 byte grazie al pellicano Teal.

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.

Non riesci a rimuovere il # per renderlo 6 byte?
Pellicano alzavola

@Tealpelican Welp, ora sto andando a scavare attraverso tutti i miei vecchi In realtà risposte e vedere se non posso cambiare Z♂#Σa Z♂Σin tutti loro. Grazie per la punta: D
Sherlock9

Guardando per la prima volta la lingua, sembra così divertente! Sono contento di aver potuto aiutare :))
Pellicano

3

JavaScript (ES6), 46 byte

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>



2

J , 13 byte

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

Provalo online!

Basato sull'ispirazione per questa domanda.

Un altro modo per farlo richiede 27 byte ma funziona usando transpose. La maggior parte dei byte deve gestire gli zero aggiunti automaticamente dal riempimento.

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

Spiegazione

({~/:)&;#\&.>  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

Il divieto di array misti ti fa davvero male qui. Provalo in APL.
Adám,

2

Utilità Bash + GNU, 55

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

I / O via STDIN (separato da linea) e STDOUT.

La sedformatta ogni riga per una sostituzione di processo bash . Questi vengono quindi evalinseriti pasteper eseguire l'interleaving reale. trquindi rimuove le righe e le righe non necessarie.

Ideone.


2

PHP, 63 byte

Nota: utilizza la codifica IBM-850

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

Esegui in questo modo:

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

Spiegazione

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.

IBM-850 ?! È una codifica naturale per PHP?
Adám,

@Adám cosa intendi con "naturale"? PHP tratta i byte nell'intervallo 128-255 come testo, che viene quindi interpretato come costante. Se la costante non è definita, verrà interpretata come una stringa. È così che posso fare ~■(binario negato 254) invece di "\x1"(binario 1).
circa il

1
Vedo. Non è che in realtà hai bisogno di quella tabella codici, hai solo bisogno di un 254 byte.
Adám,

@ Adám sì, la tabella codici lo rende un carattere stampabile che è un po 'meno fastidioso.
circa il

Ottimo uso di $$!
Tito

2

Python 3, 75 byte

So che l'altro Python è più corto, ma questa è la prima volta che lo uso mapnella mia vita, quindi ne sono abbastanza orgoglioso

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

1

C, 75 71 byte

L'unica limitazione è la lunghezza dell'uscita. Attualmente è 99, ma può essere facilmente allungato a 999 (+1 byte).

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

Ungolfed:

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

1

Oracle SQL, 195 byte

    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)

Prende l'input da una tabella denominata icon colonne a(contenente la stringa) e o(ordine della stringa):

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

Spiegazione:
Stiamo sfruttando CONNECT BYper spezzare le stringhe in ciascuno dei personaggi che le compongono. PRIOR SYS_GUID()essere NOT NULLassicura che non finiamo bloccati in un ciclo.
Quindi concateniamo i singoli caratteri con LISTAGGma li mescoliamo con una ORDER BYclausola, ordinandoli prima in base alla loro posizione nella stringa originale e solo successivamente dalla stringa da cui provengono.

Non così breve come le altre risposte, ma SQL non è realmente inteso come un linguaggio di manipolazione delle stringhe :)


1

Python 2, 128 96

Speravo di non dover usare 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])

Ungolfed

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

Gradirei feedback / consigli su come migliorare questo.
Pureferret,


1

R , 73 byte

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

Provalo online!

Spiegazione: molto semplice (ma dettagliato), basta passare in irassegna la stampa del carattere della jth stringa. Fortunatamente, substrrestituisce una stringa vuota se viene fornito un input fuori range.


0

Python, 112 byte

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

6
La tua formattazione è davvero incasinata .. da dove prendi xe yda dove?
Kade,

0

Perl 5 , 53 byte

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

Provalo online!

Metodo

Crea una matrice bidimensionale in cui il numero di righe è uguale alla lunghezza della stringa più lunga e il numero massimo di colonne è uguale al numero di stringhe. Quindi emettere ogni riga dell'array senza spaziatura.


0

TXR Lisp , 20 byte

(opip weave cat-str)

Correre:

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 weavefunzione è pigra, quindi restituisce un elenco, motivo per cui dobbiamo forzare il risultato in una stringa. Essendo pigro, può tessere infinite sequenze. Ad esempio, possiamo tessere i numeri naturali pari e dispari, che sono essi stessi infiniti elenchi pigri:

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)

0

K (oK) , 35 29 byte

Soluzione:

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

Provalo online!

Esempio:

> {`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"

Spiegazione:

Utilizzare l'indicizzazione di 2 ° livello per estrarre gli indici da 0 a max (lunghezza dell'elenco appiattito) in tutti gli elenchi di input. Qualsiasi indicizzazione oltre il limite dell'elenco secondario restituirà un valore nullo. Capovolgi (ruota di 90), appiattisci e quindi estrai i risultati non nulli.

Gli appunti:

  • Lancio a integer ( i$) in modo da ottenere null utili, poiché space ( ) è considerato null per un elenco di caratteri, il che significa che non è possibile distinguere nulli da spazi validi.
  • Inoltre non sono riuscito a far funzionare il TIO con l'input (funzionava bene nella sostituzione oK), quindi il collegamento TIO include l'esempio "ABCDE" ...

0

Jq 1,5 , 49 byte

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

Spiegazione

                      # 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"

Esecuzione del campione

$ 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    

Provalo online

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.