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.