Przeplot ciągi


30

Inspiracja. * Nie mogę uwierzyć, że wcześniej nie mieliśmy tego wyzwania:

Zadanie

Biorąc pod uwagę jeden lub więcej ciągów ASCII do wydrukowania, przeplataj je, pobierając po jednym znaku z każdego ciągu, cyklicznie aż do braku znaków. Jeśli w ciągu znaków zabraknie znaków przed pozostałymi, po prostu pomiń ten znak.

Przykłady

SIMPLE daje SIMPLE

POLLSi EPEESdajePEOPLELESS

LYESi APRONSdajeLAYPERSONS

ABCDEi a ci 123 567dajeAa1B 2Cc3D E567

"\n$?*a (pusty ciąg) i ,(.)" (końcowe spacje) daje ",\(n.$)?"* (końcowe spacje)


* Istnieją krótsze rozwiązania APL.


Ponieważ jest to w zasadzie tylko operacja transpozycji, mieliśmy kilka wyzwań, które są bardzo podobne, ale możliwe, że nie są dokładnie takie same.
Martin Ender,

7
Miałem to pytanie na moim CS HW, czy to znaczy, że mogę to zamknąć jako zadanie domowe? ; P
Downgoat

@EriktheOutgolfer Cool! Nauczyłem się dziś czegoś.
Adám

Odpowiedzi:


23

Galaretka , 1 bajt

Z

Wypróbuj online!

Wbudowane „transponuj” zrobi to dokładnie z listą ciągów.


Jestem ciekawy, jak wyglądałby kod, gdybyś musiał uzupełniać krótkie ciągi spacjami?
Adám

2
To by było z⁶. zto „transponuj w lewo, dopełnienie w prawo”; jest przestrzenią.
Lynn

1
@ Adám Jelly działa bardzo dobrze na listach; gdzie kończą się wbudowane i zaczynają się konstrukcje / projektowanie języka?
steenbergh

1
@Lynn In Jelly? Wszystko na listach atomów i szybkich jest wbudowane.
Adám,

2
@ Adám ;"(konkatenacja elementarna) rozwiązałaby zadanie bez wbudowanego.
Dennis

8

Python 2, 101 89 86 69 bajtów

Mam nadzieję, że uda mi się jakoś przekształcić to w lambdę, skracając ją, czyniąc rekurencyjnym. Nie jest to idealne, ponieważ można mieć nadzieję, że transpozycja jest krótsza, niestety nie jest (z tego, co udało mi się wymyślić do tej pory).

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

Stare rozwiązania:

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

dzięki Mathmandan za to, że poczułam się głupia;) uratował mi mnóstwo bajtów! (na starym rozwiązaniu)


Nie mogłeś po prostu zrobić while any(w):? Puste łańcuchy są falsey w Pythonie.
Mathmandan

@mathmandan Masz absolutną rację, nie wiem o czym myślałem ...
Kade

Nie ma problemu :) Twoje nowe rozwiązanie wygląda świetnie, tyle że myślę, że musisz to zrobić f=.
matmandan

Możesz zdjąć []rekurencyjne wywołanie, pozostawiając f(x[1:] for x in s), co czyni z niego zrozumienie generatora, które w tym kontekście działa tak samo jak lista.
bioweasel



7

Pyth - 3 bajty

Bardzo proste, doda rozszerzenie później, na urządzeniach mobilnych.

s.T

Pakiet testowy

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

4
@Daniel Też jestem w szkole: P
Maltysen

Jakieś plany dodania wyjaśnienia?
John Dvorak

@ JanDvorak na pewno to teraz robi.
Maltysen 16.04.17

6

JavaScript (ES6), 52 46 bajtów

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

Pobiera dane wejściowe jako tablicę ciągów, a dane wyjściowe jako pojedynczy ciąg.

Testowy fragment kodu

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 To świetne podejście. Udało mi się samodzielnie
zagrać

6

Haskell, 33 bajty

import Data.List
concat.transpose

Wypróbuj na Ideone. Stosowanie:

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

Bez użycia wbudowanego: ( 38 34 bajtów)

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

Wypróbuj na Ideone. 4 bajty wyłączone dzięki Zgarb! Stosowanie:

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

1
Możesz usunąć wszystkie pareny w alternatywnej wersji. Nadal jednak nie pobije importu.
Zgarb,

Czy naprawdę potrzebujesz podstawowej skrzynki?
xnor

Nieważne, oczywiście potrzebna jest podstawowa obudowa.
xnor

@ xnor Nie można również przenieść skrzynki podstawowej na koniec i zastąpić ją f a=abajtem, aby zapisać bajt, ponieważ oba []mają inny typ ... tak blisko.
Laikoni

5

C, 114 84 bajtów

-20 bajtów za brak obliczania długości.

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

Akceptuje tablicę wskaźników char i wymaga, aby ostatni element był wskaźnikiem zerowym (patrz użycie).

Niegolfowane i użytkowanie:

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

Czy użycie printf / sprintf jest niedozwolone? : D wygrałbyś sporo bajtów.
Walfrat,

@Walfrat Bez bezpośredniego drukowania musiałbym przydzielić ciąg, więc jak to wszystko zapisać.
Karl Napf,

to było przed twoją edycją, gdzie dodałeś ++ b i usunąłeś obliczanie długości, więc tak nie może już działać.
Walfrat,

@Walfrat Tak, ale miałem malloci returnwcześniej, a to było dłuższe niż tylko drukowanie
Karl Napf

5

PHP, 68 67 bajtów

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

Pętle nad argumentami wiersza poleceń. Uruchom z -r.

Po wewnętrznej pętli $fjest 1gdy wszystkie ciągi zakończeniu 0innego (bitowe &odlewane ""==$cdo int).
Następna iteracja zewnętrznej pętli: skopiuj $fdo $k(zapisuje jeden bajt $k=0) i przełącz $f:
Gdy wszystkie łańcuchy zostaną wykonane, $fjest teraz falsei pętla zostaje zerwana.


Nie działa z pustymi ciągami wejściowymi. Spójrz na ostatnią
próbę

@aross: naprawiono. dzięki.
Tytus,

4

Siatkówka , 13 bajtów

Liczba bajtów zakłada kodowanie ISO 8859-1.

O$#`.
$.%`
¶

Wypróbuj online!

Wyjaśnienie

O$#`.
$.%`

Jest to oparte na standardowej technice transpozycji w siatkówce. Sortujemy ( O) wszystkie znaki nieciągłe ( .), według ( $#) liczby znaków przed nimi w tej samej linii ( $.%`), tj. Ich pozycji poziomej.

Drugi etap po prostu usuwa sygnały wejściowe z wejścia.


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

Nie golfowany:

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

Wydajność:

PROSTY

BEZ LUDZI

WARSTWY

Aa1B 2Cc3D E567

„, (n. $)?” *

Pierwsza modyfikacja: połączona deklaracja ciągu w celu zaoszczędzenia niektórych bajtów. Usunięty import, był używany przez main()metodę (nie pokazano tutaj), która również potrzebowała LinkedList. QueueBezpośredniej referencji jest mniej bajtów .


zainicjowanie ciągu s ciągiem r może zaoszczędzić kilka więcej
Syamesh K.

Wiem, że minął prawie rok temu, ale możesz zagrać w golfa kilka bajtów: 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;}
minął zagrać w

3

PHP, 77 bajtów

Grał w golfa

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

Anonimowa funkcja, która pobiera tablicę ciągów.

Jestem pewien, że można by bardziej zagrać w golfa, ale jest wcześnie. Podczas każdej iteracji pobieramy i-tą literę z każdego podanego ciągu i dołączamy go do końcowego ciągu, pojedynczo. PHP po prostu wyświetla ostrzeżenia, jeśli uzyskujemy dostęp do fragmentów ciągów, które nie istnieją, więc nie ma sprawy. Zatrzymujemy się tylko wtedy, gdy nie dokonano żadnych zmian po jednokrotnym zapętleniu wszystkich łańcuchów.

Mam ochotę na użycie $d golfa jest większe, ale jest wcześnie. : P


Jak dokładnie umieścisz tablicę ciągów w jednym argumencie?
Titus

@Titus. Wiesz, nigdy tak naprawdę o tym nie myślałem. Po prostu założyłem, że możesz.
Xanderhall

3

Tak właściwie , 7 6 bajtów

Zapraszamy do gry w golfa! Wypróbuj online!

Edycja: -1 bajt dzięki pelikanowi 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.

Czy nie możesz usunąć #, aby uzyskać 6 bajtów?
Teal pelikan

@Tealpelican Welp, teraz będę musiał przekopać się przez wszystkie moje stare Właściwie odpowiedzi i sprawdzić, czy nie mogę się zmienić Z♂#Σna Z♂Σwszystkie z nich. Dzięki za wskazówkę: D
Sherlock9

Po raz pierwszy patrząc na język, wygląda tak zabawnie! Cieszę się, że mogłem pomóc :))
Pelikan

3

JavaScript (ES6), 46 bajtów

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 bajtów

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

Wypróbuj online!

Na podstawie inspiracji do tego pytania.

Innym sposobem jest 27 bajtów, ale operacja polega na transpozycji. Większość bajtów służy do obsługi automatycznie dodawanych zer od wypełnienia.

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

Wyjaśnienie

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

J zakazuje mieszanych tablic naprawdę cię tutaj boli. Wypróbuj w APL.
Adám

2

Narzędzia Bash + GNU, 55

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

I / O poprzez STDIN (rozdzielone liniami) i STDOUT.

sedFormatuje każdej linii do zastąpienia procesu atakujących . Są one następnie evalwprowadzane pastedo rzeczywistego przeplatania. trnastępnie usuwa niepotrzebne znaki nowej linii i karty.

Ideone.


2

PHP, 63 bajty

Uwaga: używa kodowania IBM-850

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

Uruchom tak:

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

Wyjaśnienie

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 ?! Czy to naturalne kodowanie dla PHP?
Adám,

@ Adám, co rozumiesz przez „naturalny”? PHP traktuje bajty z zakresu 128-255 jako tekst, który jest interpretowany jako stała. Jeśli stała jest niezdefiniowana, zostanie zinterpretowana jako ciąg. To dlatego, że mogę to zrobić ~■(zanegowane binarne 254) zamiast "\x1"(binarne 1).
aross

1
Widzę. To nie jest tak, że tak naprawdę potrzebujesz tej strony kodowej, potrzebujesz 254 bajtów.
Adám

@ Adám tak, strona kodowa sprawia, że ​​jest to znak do wydruku, co jest nieco mniej denerwujące.
aross

Świetne wykorzystanie $$!
Tytus,

2

Python 3, 75 bajtów

Wiem, że drugi Python jest krótszy, ale po raz pierwszy użyłem go mapw życiu, więc jestem z tego dumny

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

1

C 75 75 bajtów

Jedynym ograniczeniem jest długość wyjściowa. Obecnie wynosi 99, ale można go łatwo rozciągnąć do 999 (+1 bajt).

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

Nie golfowany:

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

1

Oracle SQL, 195 bajtów

    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)

Pobiera dane wejściowe z tabeli o nazwie izawierającej kolumny a(zawierające ciąg) i o(kolejność ciągu):

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

Objaśnienie:
Wykorzystujemy to, CONNECT BYaby rozbić ciągi znaków na każdą z tworzących je postaci. PRIOR SYS_GUID()będąc NOT NULLpewnym, że nie utkniemy w pętli.
Następnie LISTAGGłączymy pojedyncze znaki, ale przetasowujemy je ORDER BYklauzulą, uporządkując je najpierw według ich pozycji w oryginalnym łańcuchu, a dopiero potem według łańcucha, z którego pochodzą.

Nie tak krótkie jak inne odpowiedzi, ale SQL nie jest tak naprawdę rozumiany jako język manipulacji ciągami :)


1

Python 2, 128 96

Miałem nadzieję, że nie będę musiał używać narzędzi 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])

Bez golfa

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

Byłbym wdzięczny za opinie / porady dotyczące poprawy tego.
Pureferret,


1

R , 73 bajty

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

Wypróbuj online!

Objaśnienie: bardzo proste (ale pełne), wystarczy wykonać pętlę poprzez wydrukowanie iznaku jth ciągu. Na szczęście substrzwraca pusty ciąg, jeśli podano dane spoza zakresu.


0

Python, 112 bajtów

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
Twoje formatowanie jest naprawdę popieprzone ... skąd w ogóle możesz xi yskąd?
Kade

0

Perl 5 , 53 bajtów

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

Wypróbuj online!

metoda

Tworzy dwuwymiarową tablicę, w której liczba wierszy jest równa długości najdłuższego łańcucha, a maksymalna liczba kolumn jest równa liczbie łańcuchów. Następnie wypisz każdy wiersz tablicy bez odstępów.


0

TXR Lisp , 20 bajtów

(opip weave cat-str)

Biegać:

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.$)? *"

weaveFunkcja jest leniwy, więc zwraca listę, dlatego musimy wymusić wynik ciąg. Będąc leniwym, może tkać nieskończone sekwencje. Na przykład możemy splotać parzyste i nieparzyste liczby naturalne, które same są nieskończonymi leniwymi listami:

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 bajtów

Rozwiązanie:

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

Wypróbuj online!

Przykład:

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

Wyjaśnienie:

Użyj indeksowania drugiego poziomu, aby wyciągnąć indeksy od 0 do maksimum (długość spłaszczonej listy) na wszystkich listach wejściowych. Wszelkie indeksowanie poza granicami listy podrzędnej zwróci wartość null. Odwróć (obraca o 90), spłaszcz, a następnie wyciągnij niepuste wyniki.

Uwagi:

  • Rzucam na integer ( i$), aby uzyskać przydatne wartości null, ponieważ spacja ( ) jest uważana za null dla listy znaków, co oznacza, że ​​nie można odróżnić null od prawidłowych spacji.
  • Również nie mogłem zmusić TIO do pracy z wejściem (działało dobrze w replice okK), więc łącze TIO zawiera przykład „ABCDE” ...

0

Jq 1,5 , 49 bajtów

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

Wyjaśnienie

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

Przykładowy przebieg

$ 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    

Wypróbuj online

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.