Podziel ciąg na n kawałków (lub kawałków o długości n)

11

Wyzwanie

W tym wyzwaniu musisz wykonać dwa różne (ale powiązane) zadania w zależności od kolejności wprowadzania danych.
Twój program otrzyma ciąg si liczbę całkowitą njako dane wejściowe i będzie

  • podzielony sna kawałki długości, njeśli będzie spierwszy. Ostatni element będzie krótszy, jeśli to konieczne.
  • podzielony sna nkawałki o równej długości, jeśli będzie npierwszy. Jeśli len(s)nie, wielokrotność npierwszych len(s) mod nelementów będzie o jeden dłuższa.

Możesz wziąć tylko te 2 dane wejściowe. snigdy nie będzie zawierać tylko cyfr.

Notatki

  • Możesz użyć odwrotnego mapowania. Zwróć uwagę na to w swojej odpowiedzi, jeśli to zrobisz.
  • sbędzie zawierać tylko drukowalne znaki ASCII (bez nowych linii).
  • Nie możesz używać żadnych wbudowanych rozwiązań, które bezpośrednio rozwiązują oba te zadania. Wszystkie inne wbudowane funkcje są dozwolone.
  • Musisz wziąć oba argumenty z tego samego źródła.
  • Możesz wziąć argumenty w uporządkowanej liście lub w innym formacie, który wyraźnie wskazuje ich kolejność, o ile jest to jednoznaczne.
  • Możesz wziąć dane wejściowe jako jeden ciąg / strumień i użyć znaku, który nie jest prawidłowym wejściem (jak nullbyte), aby je rozdzielić.
  • nbędzie zawsze równa lub mniejsza niż długość si większa niż zero.
  • Możesz wyprowadzić wynikową listę w dowolnym formacie rezonansowym, o ile wyraźnie wskazuje ona poszczególne elementy i ich kolejność.

Przykład

Dane wejściowe: programming, 3
ostatni element zawiera tylko 2 znaki, ponieważ 11 nie jest podzielne przez 3. Dane
wyjściowe: ["pro", "gra", "mmi", "ng"]

Dane wejściowe: 3, programming
11 nie jest wielokrotnością liczby 3, więc pierwsze 2 elementy będą o jeden dłuższe: Dane
wyjściowe: ["prog", "ramm", "ing"]

Zasady

Przypadki testowe

Przypadki testowe zostały wygenerowane za pomocą tego programu Pyth (używa wbudowanych, więc nie ma poprawnej odpowiedzi). Dzięki @FryAmTheEggman za udostępnienie podstawowej wersji tego!

3, helloworld -> ['hell', 'owo', 'rld']
helloworld, 3 -> ['hel', 'low', 'orl', 'd']
1, programowanie -> [„programowanie”]
programowanie, 1 -> ['p', 'r', 'o', 'g', 'r', 'a', 'm', 'm', 'i', 'n', 'g']
8, programowanie -> ['pr', 'og', 'ra', 'm', 'm', 'i', 'n', 'g']
programowanie, 8 -> ['programm', 'ing']
9, kod golfa -> [„c”, „o”, „d”, „e”, „”, „g”, „o”, „l”, „f”]
code golf, 9 -> [„golf golf”]
4, 133tspeak -> [„133”, „ts”, „pe”, „ak”]
133tspeak, 4 -> [„133t”, „spea”, „k”]

Happy Coding!

Denker
źródło
Nie możesz używać żadnych wbudowanych rozwiązań, które rozwiązują te dwa zadania. Czy obejmuje to inne wbudowane funkcje, takie jak pobieranie co n-ty znak z ciągu lub podział na wystąpienie ?
Dennis
@Dennis To miało właśnie wykluczyć wbudowane rozwiązania, które rozwiązują to bezpośrednio. Wyjaśniłem.
Denker,
Jeśli nasz język nie obsługuje tablic, jak powinniśmy generować? Czy nowa linia między każdym wynikiem ciągu będzie akceptowalna?
Conor O'Brien
W przypadku języków, w których dane wejściowe stanowią tablicę niejednoznacznych liczb, jaka powinna być procedura?
Conor O'Brien
@ CᴏɴᴏʀO'Bʀɪᴇɴ Nie może się zdarzyć. s nigdy nie będzie zawierać tylko cyfr . Możesz także wypisać wynikową listę w dowolnym formacie rezonansowym, o ile wyraźnie wskazuje ona poszczególne elementy i ich kolejność, co oczywiście obejmuje również zapis wielowierszowy.
Denker,

Odpowiedzi:

3

MATL, 46 26 21 27 29 42 bajtów

jtU?jtbUe!tn2Gn>?0t(]tgbw(}ie]!2t$X{Oc''Zt

Wypróbuj online! (Zaktualizowano nieznacznie, aby działał z najnowszą wersją języka)

Wyjaśnienie

j           % Explicitly grab the first input as a string
t           % Duplicate
U           % Attempt to convert it to a number
?           % If the conversion to a number was successful
    j       % Explicitly grab the second input as a string
    t       % Duplicate the value
    b       % Bubble-up the first element in the stack
    U       % Convert to a number from a string
    e       % Reshape the string into a nGroup x nPerGroup matrix
    !       % Take the transpose
    t       % Duplicate the result
    n       % Number of characters in the repmat result
    2Gn     % Number of characters in the string
    >?      % If chars in repmat > chars in string
        O   % Zero
        t   % Duplicate 
        (   % Assign the last element to a null character (bug in MATL)
    ]       % End if statement
    t       % Duplicate this matrix
    g       % Convert to a logical matrix
    b       % Bubble-up the original string
    w       % Flip the top two elements
    (       % Assign the non-empty characters to the chars from the input string
}           % Else the string comes first
    i       % Explicitly grab the second input (the number)
    e       % Reshape the characters into an nPerGroup x nGroup 2D array
]           % End of if statement
!           % Take the transpose so it reads left-to-right
2           % Number literal
t           % Duplicate
$X{         % Call num2cell to convert to a cell array
Oc          % Null character
''          % Empty string
Zt          % Replace null chars with empty strings
            % Implicit display of stack contents
Suever
źródło
Jakie są te niedrukowalne elementy, które pojawiają się na końcu niektórych elementów listy? Nie są one częścią danych wejściowych i dlatego nie powinny być częścią danych wyjściowych.
Denker,
Czy nie ejest wbudowane zabronione?
FliiFe
Może zastąpić XUZN?...przez U?...i zamienić dwa ifoddziały. Ponadto nie potrzebujesz3$
Luis Mendo
@DenkerAffe Przepraszam za to. Powinien zostać teraz naprawiony.
Suever,
@FliiFe Na podstawie komentarzy do pierwszego postu, enie rozwiązuje bezpośrednio problemu, więc nie uważam, że jest to zabronione, nie.
Suever,
4

JavaScript (ES6), 132 bajty

(s,t)=>+t?[...Array(-~(~-s.length/+t))].map((_,i)=>s.substr(i*t,t)):[...Array(s=+s)].map(_=>t.slice(p,p-=~((t.length-p-1)/s--)),p=0)

Jest to prawdopodobnie beznadziejnie przeprojektowane.

Neil
źródło
Cóż, moje (już nieżywe) rozwiązanie było rażąco słabo zaprojektowane. +1 dla ciebie
edc65
4

JavaScript (Firefox), 88 87 bajtów

a=>b=>(s=+b?a:b,i=x=0,l=s.length,[for(c of s)if(r=s.slice(x,x+=+b||l/a+(i++<l%a)|0))r])

Nazwij to jak (...)("programming")(3)za pomocą przeglądarki Firefox 30+.

użytkownik 81655
źródło
2

Ruby, 119 bajtów

->x,y{r=[t=0];x.to_s==x ?(r.push x[t...t+=y]while x[t]):x.times{r.push y[t...t+=y.size/x+(r[y.size%x]? 0:1)]};r[1..-1]}

I zajmę pierwsze miejsce po 2 bajtach ...

MegaTom
źródło
Obiekty Regex w Rubim mogą mieć wstrzykiwane do nich wartości w taki sam sposób jak łańcuchy, więc x.scan(/.{,#{y}})równie dobrze działa w przypadku podziału łańcuchów w pierwszym przypadku. Czy to się liczy jako wbudowane?
Wartość tuszu
2

AWK, 121 130 128 122 bajtów

$1~/^[0-9]+$/{s=1}{a=$(s+1)
b=s?$1:$2
$0=""
for(j=-b;j<=c=length(a);)$0=$0 substr(a,j+=b+s,b+(s=s&&j<c%b*(b+1)?1:0))" "}1

Jedynym problemem jest to, czy pierwszy wpis jest łańcuchem rozpoczynającym się od wartości liczbowej. Spowodowałoby to, AWKże ciąg byłby widoczny jako ten numer, a drugi wpis jako ciąg.

OK ... naprawiono problem numeryczny, ale dodano 9 bajtów :(.

Przerobiono nieco, aby zaoszczędzić kilka bajtów.

Niemal z powrotem do pierwotnej długości. :)

Robert Benson
źródło
OK, @DenkerAffe, naprawiłem to ogólnie i tylko (ostatecznie) dodał 1 bajt.
Robert Benson,
1

Haskell, 131 bajtów

import Data.Lists
q(d,m)=splitPlaces$(d+1<$[1..m])++[d,d..]
a#b|all(`elem`['0'..'9'])a=q(divMod(length b)$read a)b|1<2=q(read b,0)a

Przykład użycia:

*Main> "8" # "programming"
["pr","og","ra","m","m","i","n","g"]
*Main> "programming" # "8"
["programm","ing"]

Jak to działa: główna praca jest wykonywana przez funkcję pomocnika, qktóra pobiera parę liczb (d,m)i ciąg znaków s. Najpierw buduje listę mrazy, d+1a następnie nieskończoną liczbę d(np. (1,3)-> [2,2,2,1,1,1,1,1,...]). Następnie używa splitPlacesdo podzielenia sna kawałki długości podane przez listę. splitPlaceszatrzymuje się, jeśli szabraknie elementów, więc nieskończona lista jest w porządku.

Główną funkcją #kontroli, który parametr jest liczbą n/ string stri połączenia qz albo (div (length str) n, mod (length str) n)lub (n, 0)Plus str.

nimi
źródło
0

C # (LINQPAD) - 335 bajtów

var y=Util.ReadLine().Split(',');int x,j=0;var t=int.TryParse(y[0].Trim(),out x);x=x==0?int.Parse(y[1].Trim()):x;var i=t?y[1].Trim():y[0];var z="";if(!t){while(i.Substring(j).Length>x){z+=i.Substring(j).Length>x?i.Substring(j,x)+", ":"";j+=x;}z+=i.Substring(j);}else z=string.Join(", ",i.Split(x).Select(s=>string.Concat(s)));z.Dump();

Część odczytu wejścia zajęła trochę miejsca. Zwycięzca najdłuższej odpowiedzi.

Zastosowanie nr 1:

$ 3, helloworld

>> hell, owo, rld

Zastosowanie nr 2:

$ helloworld, 3

>>hel, low, orl, d
mnsr
źródło
co to jest?
Benjamin Urquhart
0

Pyth, 181 bajtów

Udawajmy, że najdłuższy kod w bajtach wygrywa \ o /

DyGK@G0J:@G1"."1=YJV%lJKW<[email protected]=YXYN+@YN@YhN=Y.DYhN)FNr%lJK/-lJ%lJK/-lJ%lJKKW<l@YNsclJK=YXYN+@YN@YhN=Y.DYhN))RY)DPG=K@G1=J:@G0"."1=YJV/lJKW<l@YNK=YXYN+@YN@YhN=Y.DYhN))RY).xyQPQ

Wypróbuj tutaj! (Tłumacz online wydaje się mieć błąd, wyświetla dane wejściowe, podczas gdy nie powinien)

Oto dane wyjściowe z terminala:

» pyth split.pyth <<<'["helloworld", 3]' 
['hel', 'low', 'orl', 'd']
» pyth split.pyth <<<'[3, "Helloworld"]'
['Hell', 'owo', 'rld']

Poważnie, jestem otwarty na nowe podejście. Jestem nowy w Pythonie, więc prawdopodobnie przegapiłem kilka skrótów.

To znaczy, myślę, że moja odpowiedź jest rozpaczliwa, ponieważ jest dłuższa niż odpowiedź w javascript ...

FliiFe
źródło
Czy możesz podać przykładowe dane wejściowe i wyjściowe?
Leaky Nun
Zwróć uwagę na oficjalne rozwiązanie pod nagłówkiem testcases. Przypadki testowe są generowane przez Pyth. Rozwiązaniem jest .xcsJKcJsK, gdzie Ji Ksą dwa argumenty.
Leaky Nun
@KennyLau Dodałem link do internetowego interpretera pyth. O dziwo, również wysyła dane wejściowe, podczas gdy jestem pewien, że nie wczoraj ... Spróbuje to naprawić.
FliiFe
użyj spacji, aby stłumić drukowanie
Leaky Nun
@ Miejsca KennyLau gdzie?
FliiFe
0

PHP, 114 bajtów

[$t,$n,$p]=$argv;for(@+$p?$s=$n:$f=$n*($p=strlen($s=$p)/$n)%$n;$t;)echo$t=substr($s,$a+=$e,$e=$p+($i++<$f)|0),"
";
  • Ciąg nie powinien zaczynać się od cyfr.
    (Wymienić +@$pzis_numeric($p) do poprawki).
  • Dane wyjściowe nie powinny zawierać fragmentu „0”.
    (Wstaw ~do wydruku ASCII, a&dla dowolnego ASCII przed $t;naprawą.)
  • Uruchom -nrlub wypróbuj online .
Tytus
źródło
0

PowerShell , 122 118 bajtów

param($a,$b)if($a-is[int]){$a,$b=$b,((($l=$b|% Le*)-($c=$l%$a))/$a)}$a-split("(..{$b})"*$c+"(.{0,$b})"*$a.Length)-ne''

Wypróbuj online!

Mniej golfa:

param($a,$b)
if($a-is[int]){
    $length=$b|% Length
    $c=$length%$a
    $a,$b=$b,(($length-$c)/$a)  # recalc length and swap
}
$pattern="(..{$b})"*$c+"(.{0,$b})"*$a.Length
$parts=$a -split $pattern       # pattern like '(..{3})(..{3})(.{0,3})(.{0,3})(.{0,3})'
$parts -ne ''                   # output not empty parts
mazzy
źródło