Pisahkan string menjadi n keping (atau keping panjang n)

11

Tantangan

Dalam tantangan ini, Anda harus melakukan dua tugas yang berbeda (tetapi terkait) tergantung pada urutan input.
Program Anda akan menerima string sdan integer nsebagai input dan akan

  • dipecah smenjadi potongan-potongan panjang njika yang slebih dulu. Elemen terakhir akan lebih pendek jika perlu.
  • dibagi smenjadi npotongan-potongan dengan panjang yang sama jika ndatang terlebih dahulu. Jika len(s)bukan merupakan kelipatan dari elemen npertama len(s) mod nakan menjadi lebih lama.

Anda hanya dapat mengambil 2 input tersebut. stidak akan pernah hanya berisi digit.

Catatan

  • Anda dapat menggunakan pemetaan terbalik. Catat ini dalam jawaban Anda jika Anda melakukannya.
  • shanya akan berisi karakter ASCII yang dapat dicetak (tidak ada baris baru).
  • Anda tidak dapat menggunakan bawaan apa pun yang menyelesaikan kedua tugas tersebut secara langsung. Semua bawaan lainnya diizinkan.
  • Anda harus mengambil kedua argumen dari sumber yang sama.
  • Anda dapat mengambil argumen dalam daftar yang diurutkan atau format lain yang dengan jelas menunjukkan pesanan mereka selama tidak jelas.
  • Anda dapat mengambil input sebagai satu string / aliran dan menggunakan karakter yang bukan input yang valid (seperti nullbyte) untuk memisahkannya.
  • nakan selalu sama atau kurang dari panjang sdan lebih besar dari nol.
  • Anda dapat menampilkan daftar yang dihasilkan dalam format resonable apa pun selama itu menunjukkan dengan jelas bagian-bagian tertentu dan urutannya.

Contoh

Input: programming, 3
Elemen terakhir hanya berisi 2 karakter, karena 11 tidak dapat dibagi oleh 3.
Output: ["pro", "gra", "mmi", "ng"]

Input: 3, programming
11 bukan kelipatan 3, jadi 2 elemen pertama akan lebih panjang:
Output: ["prog", "ramm", "ing"]

Aturan

  • Fungsi atau program lengkap diizinkan.
  • Aturan default untuk input / output.
  • Celah standar berlaku.
  • Ini adalah , sehingga byte-count terendah akan menang. Tiebreak adalah pengiriman sebelumnya.

Uji kasus

Kasing uji dibuat dengan program Pyth ini (menggunakan bawaan, jadi tidak ada jawaban yang valid). Terima kasih kepada @FryAmTheEggman untuk menyediakan versi dasar dari itu!

3, helloworld -> ['neraka', 'owo', 'rld']
helloworld, 3 -> ['hel', 'low', 'orl', 'd']
1, pemrograman -> ['pemrograman']
pemrograman, 1 -> ['p', 'r', 'o', 'g', 'r', 'a', 'm', 'm', 'i', 'n', 'g']
8, pemrograman -> ['pr', 'og', 'ra', 'm', 'm', 'i', 'n', 'g']
pemrograman, 8 -> ['programm', 'ing']
9, golf kode -> ['c', 'o', 'd', 'e', ​​'', 'g', 'o', 'l', 'f']
golf kode, 9 -> ['golf kode']
4, 133tpeak -> ['133', 'ts', 'pe', 'ak']
133tspeak, 4 -> ['133t', 'spea', 'k']

Selamat Coding!

Denker
sumber
Anda tidak boleh menggunakan bawaan apa pun yang menyelesaikan dua tugas itu. Apakah itu termasuk built-in lainnya, seperti mendapatkan setiap karakter ke-n dari string atau split saat kejadian ?
Dennis
@ Dennis Ini hanya dimaksudkan untuk mengesampingkan bawaan yang menyelesaikan ini secara langsung. Saya mengklarifikasi.
Denker
Jika bahasa kita tidak mendukung array, bagaimana seharusnya kita output? Apakah baris baru antara setiap hasil string dapat diterima?
Conor O'Brien
Juga, untuk bahasa di mana input adalah array angka ambigu, bagaimana prosedurnya?
Conor O'Brien
@ CᴏɴᴏʀO'Bʀɪᴇɴ Tidak bisa terjadi. s tidak akan pernah berisi digit saja . Anda juga dapat menampilkan daftar yang dihasilkan dalam format resonable apa pun asalkan itu dengan jelas menunjukkan bagian-bagian tertentu dan urutannya yang mencakup output multiline tentu saja.
Denker

Jawaban:

3

MATL, 46 26 21 27 29 42 byte

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

Cobalah secara Online! (Diperbarui sedikit agar berfungsi dengan versi bahasa terbaru)

Penjelasan

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
sumber
Apa itu unsintables yang muncul di akhir beberapa elemen daftar? Itu bukan bagian dari input dan karenanya tidak harus menjadi bagian dari output juga.
Denker
Bukankah ebuiltin dilarang?
FliiFe
Mungkin diganti XUZN?...dengan U?...dan menukar kedua ifcabang. Juga, Anda tidak perlu3$
Luis Mendo
@ DenkerAffe Maaf tentang itu. Harus diperbaiki sekarang.
Suever
@FliiFe Berdasarkan komentar pada posting awal, etidak secara langsung menyelesaikan masalah, jadi saya tidak menganggapnya dilarang, tidak.
Suever
4

JavaScript (ES6), 132 byte

(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)

Ini mungkin terlalu banyak direkayasa.

Neil
sumber
Nah, solusi saya (sekarang sudah mati) sangat tidak direkayasa. +1 untuk Anda
edc65
4

JavaScript (Firefox), 88 87 byte

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

Sebut saja seperti (...)("programming")(3)menggunakan Firefox 30+.

pengguna81655
sumber
2

Ruby, 119 byte

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

Dan saya mengambil tempat pertama dengan 2 byte ...

MegaTom
sumber
Objek Regex di Ruby dapat memiliki nilai yang disuntikkan ke dalamnya dengan cara yang sama seperti string, jadi x.scan(/.{,#{y}})berfungsi juga untuk memisahkan string dalam kasus pertama. Atau apakah itu dianggap sebagai builtin?
Value Ink
2

AWK, 121 130 128 122 Bytes

$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

Satu-satunya masalah adalah jika entri pertama adalah string yang dimulai dengan nilai numerik. Ini akan menyebabkan AWKmelihat string sebagai angka itu dan entri kedua sebagai string.

OKE ... memperbaiki masalah numerik, tetapi menambahkan 9 byte :(.

Ulang sedikit untuk menyimpan beberapa byte.

Hampir kembali ke panjang aslinya. :)

Robert Benson
sumber
OK, @DenkerAffe, perbaiki agar berfungsi secara umum dan hanya (akhirnya) ditambahkan 1 byte.
Robert Benson
1

Haskell, 131 byte

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

Contoh penggunaan:

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

Cara kerjanya: pekerjaan utama dilakukan oleh fungsi helper qyang mengambil sepasang angka (d,m)dan string s. Pertama membangun daftar mwaktu d+1diikuti oleh banyak tak terbatas d(mis (1,3)- - [2,2,2,1,1,1,1,1,...]). Ini kemudian digunakan splitPlacesuntuk membagi smenjadi potongan-potongan panjang yang diberikan oleh daftar. splitPlacesberhenti jika skehabisan elemen, sehingga daftar yang tak terbatas baik-baik saja.

Fungsi utama #pemeriksaan yang parameter adalah jumlah n/ string strdan panggilan qdengan baik (div (length str) n, mod (length str) n)atau (n, 0)ditambah str.

nimi
sumber
0

C # (LINQPAD) - 335 byte

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

Bagian pembacaan input memakan sedikit ruang. Pemenang jawaban terlama.

Penggunaan # 1:

$ 3, helloworld

>> hell, owo, rld

Penggunaan # 2:

$ helloworld, 3

>>hel, low, orl, d
mnsr
sumber
owo apa ini?
Benjamin Urquhart
0

Pyth, 181 byte

Mari kita berpura-pura kode terpanjang dalam byte menang \ 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

Coba di sini! (Juru bahasa online tampaknya memiliki bug, itu menampilkan input sementara seharusnya tidak)

Inilah output dari terminal:

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

Serius, saya terbuka untuk pendekatan baru. Saya baru mengenal python, jadi saya mungkin melewatkan beberapa singkatan.

Maksud saya, saya pikir jawaban saya kurang jelas dari titik itu lebih panjang dari jawaban javascript ...

FliiFe
sumber
Bisakah Anda memberikan sampel input dan output?
Leaky Nun
Perhatikan solusi resmi di bawah tajuk testcases. Testcases dihasilkan oleh Pyth. Solusinya adalah .xcsJKcJsK, di mana Jdan Kmerupakan dua argumen.
Leaky Nun
@ KennyLau Saya menambahkan tautan ke penerjemah pyth online. Anehnya, itu input output juga sementara saya yakin tidak kemarin ... Akan mencoba memperbaikinya.
FliiFe
gunakan spasi untuk menekan pencetakan
Leaky Nun
@KennyLau spasi di mana?
FliiFe
0

PHP, 114 byte

[$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),"
";
  • String tidak boleh dimulai dengan angka.
    (Ganti +@$pdengan is_numeric($p)untuk memperbaiki.)
  • Output tidak boleh berisi potongan "0".
    (Sisipkan ~untuk ASCII yang dapat dicetak, a&untuk ASCII apa pun sebelum $t;diperbaiki.)
  • Jalankan dengan -nratau coba online .
Titus
sumber
0

PowerShell , 122 118 byte

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

Cobalah online!

Kurang golf:

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
sumber