Dizeyi n parçaya (veya n uzunluğuna) ayırın


11

Meydan okuma

Bu zorlukta, girdinin sırasına bağlı olarak iki farklı (ancak ilgili) görev yapmanız gerekir.
Programınız girdi olarak bir dize sve bir tam sayı alır nve

  • bölmek suzunlukta parçalar halinde nise sönce gelir. Gerekirse son eleman daha kısa olacaktır.
  • bölme siçine n, eğer eşit uzunlukta parçalara ngelmektedir. Eğer len(s)değilse n, ilk len(s) mod nöğelerin katları daha uzun olacaktır.

Yalnızca bu 2 girişi alabilirsiniz. sasla yalnızca rakam içermeyecektir.

notlar

  • Ters eşlemeyi kullanabilirsiniz. Bunu yaparsanız cevabınızda bunu not edin.
  • syalnızca yazdırılabilir ASCII karakterleri içerir (yeni satır içermez ).
  • Bu iki görevi doğrudan çözen yerleşikleri kullanamazsınız. Diğer tüm yerleşiklere izin verilir.
  • Her iki argümanı da aynı kaynaktan almalısınız.
  • Değişkenleri, sıralı bir listede veya açık olduğu sürece düzenlerini açıkça belirten başka bir biçimde alabilirsiniz.
  • Girdiyi tek bir dize / akış olarak alabilir ve ayırmak için geçerli bir girdi olmayan (nullbayt gibi) bir karakter kullanabilirsiniz.
  • nher zaman uzunluğa eşit veya ssıfırdan küçük ve sıfırdan büyük olacaktır.
  • Ortaya çıkan listeyi, belirli parçaları ve sıralarını açıkça belirttiği sürece herhangi bir resonable formatta çıkarabilirsiniz.

Misal

Giriş: programming, 3
Son öğe yalnızca 2 karakter içerir, çünkü 11 3 ile bölünemez.
Çıktı: ["pro", "gra", "mmi", "ng"]

Giriş: 3, programming
11, 3'ün katı değildir, bu nedenle ilk 2 öğe daha uzun olacaktır:
Çıktı: ["prog", "ramm", "ing"]

kurallar

Test senaryoları

Test örnekleri bu Pyth programı ile oluşturulmuştur (builtins kullanır, bu nedenle geçerli bir cevap yoktur). Bunun temel sürümünü sağladığı için @FryAmTheEggman'a teşekkürler!

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

Mutlu Kodlama!


Bu iki görevi çözen yerleşikleri kullanamazsınız. Buna diğer yerleşikler de dahil mi, her n-th karakterini bir dizeden veya olaylarda bölünmeden alır mı?
— Dennis

@Dennis Bu sadece bunu doğrudan çözen yapıları ortadan kaldırmak içindi. Açıkladım.
— Denker

Dilimiz dizileri desteklemiyorsa, nasıl çıktı almalıyız? Dizenin her sonucu arasındaki bir yeni satır kabul edilebilir mi?
— Conor O'Brien

Ayrıca, girdinin belirsiz bir dizi sayı olduğu diller için, prosedür ne olmalıdır?
— Conor O'Brien

@ CᴏɴᴏʀO'Bʀɪᴇɴ olamaz. Asla yalnızca rakam içermeyecektir . Ayrıca , belirli parçaları ve elbette çok satırlı çıktıyı içeren sırasını açıkça belirttiği sürece, sonuç listesini herhangi bir resonable formatta çıkarabilirsiniz .
— Denker

Yanıtlar:


3

MATL, 46 26 21 27 29 42 bayt

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

Çevrimiçi deneyin! (Dilin en son sürümüyle çalışmak için biraz güncellendi)

açıklama

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

Bazı liste öğelerinin sonunda görünen yazdırılamazlar nelerdir? Bunlar girdinin bir parçası değildir ve bu nedenle de çıktının bir parçası olmamalıdır.
— Denker

eYasak bir yapı değil mi?
— FliiFe

Belki yerine XUZN?...göre U?...ve iki takas ifdalları. Ayrıca, ihtiyacınız yok3$
— Luis Mendo

@DenkerAffe Üzgünüm. Şimdi düzeltilmelidir.
— Suever

@FliiFe İlk yazıdaki yorumlara dayanarak e, sorunu doğrudan çözmez, bu yüzden yasak olduğunu düşünmüyorum, hayır.
— Suever

4

JavaScript (ES6), 132 bayt

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

Bu muhtemelen umutsuzca aşırı mühendisliğe sahiptir.


Evet, (şimdi merhum) çözümüm büyük ölçüde yetersiz tasarlanmıştı. Sizin için +1
— edc65

4

JavaScript (Firefox), 88 87 bayt

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

(...)("programming")(3)Firefox 30+ kullanmak gibi adlandırın .


2

Ruby, 119 bayt

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

Ve ben 2 byte birinci olurum ...


Ruby'deki Regex nesneleri, dizelere aynı şekilde enjekte edilen değerlere sahip olabilir, bu nedenle x.scan(/.{,#{y}})ilk durumda dizeleri bölmek için de çalışır. Yoksa bu bir yerleşik midir?
— Değer Mürekkebi

2

AWK, 121 130 128 122 bayt

$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

Tek sorun, ilk girişin sayısal bir değerle başlayan bir dize olmasıdır. Bu AWK, dizeyi bu sayı ve ikinci girdiyi dize olarak görmeye neden olur .

Tamam ... sayısal sorunu düzeltti, ancak 9 bayt ekledi :(.

Birkaç bayt tasarruf etmek için biraz elden geçirildi.

Neredeyse orijinal uzunluğa geri döner. :)


Tamam, @DenkerAffe, genel olarak çalışması için sabitledi ve sadece (sonunda) 1 bayt ekledi.
— Robert Benson

1

Haskell, 131 bayt

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

Kullanım örneği:

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

Nasıl çalışır: ana çalışma, qbir çift sayı (d,m)ve bir dize alan yardımcı işlev tarafından yapılır s. İlk listesini oluşturur mkez d+1sonsuz birçok kişi tarafından takip edilen d(örn (1,3)-> [2,2,2,1,1,1,1,1,...]). Daha sonra liste tarafından verilen uzunluk parçalarına splitPlacesbölünür s. elemanlar biterse splitPlacesdurur s, bu yüzden sonsuz bir liste iyidir.

Ana işlev, #hangi parametrenin sayı n/ dize olduğunu kontrol eder strve qya (div (length str) n, mod (length str) n)veya (n, 0)artı ile çağırır str.


0

C # (LINQPAD) - 335 bayt

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

Giriş okuma kısmı biraz yer kapladı. En uzun cevabı kazanan.

Kullanım # 1:

$ 3, helloworld

>> hell, owo, rld

Kullanım # 2:

$ helloworld, 3

>>hel, low, orl, d

oo bu nedir?
— Benjamin Urquhart

0

Pyth, 181 bayt

Bayt kazanımlarındaki en uzun kodu görelim \ 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

Burada deneyin! (Çevrimiçi yorumlayıcıda bir hata var gibi görünüyor, girilmemesi gerekiyorsa girişi görüntüler)

Terminalden çıktı:

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

Cidden, yeni yaklaşıma açığım. Python'da yeniyim, bu yüzden muhtemelen birkaç stenoyu kaçırdım.

Yani, cevabımın javascript cevabından daha uzun olduğu noktadan umutsuz olduğunu düşünüyorum ...


Bir örnek giriş ve çıkış sağlayabilir misiniz?
— Sızan Rahibe

Başlık altındaki resmi çözüme dikkat edin testcases. Testcasları Pyth tarafından üretilir. Çözüm, iki argüman .xcsJKcJsKnerede Jve nerede K.
— Leaky Nun

@KennyLau Çevrimiçi pyth yorumlayıcısına bir bağlantı ekledim. Garip bir şekilde, dün emin olmadığım halde girişi de çıktı ... Bunu düzeltmeye çalışacağım.
— FliiFe

baskıyı bastırmak için boşluk kullanın
— Leaky Nun

@KennyLau uzayları nerede?
— FliiFe

0

PHP, 114 bayt

[$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),"
";
  • Dize rakamlarla başlamamalıdır.
    ( Düzeltmek için +@$pile değiştirin is_numeric($p).)
  • Çıktıda yığın "0" bulunmamalıdır.
    ( Düzeltilmeden önce ~yazdırılabilir ASCII a&için, herhangi bir ASCII için yerleştirin $t;.)
  • Birlikte çalışın-nr veya çevrimiçi deneyin .

0

PowerShell , 122 118 bayt

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

Çevrimiçi deneyin!

Daha az 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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.