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!


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

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.


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+.


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


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


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.


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

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<l@YN.EclJK=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 ...


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 .

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