Alt Sınıflandırma


27

Giriş

Bu örnek için dize Hello, World!ve diziyi alalım [3, 2, 3]. Alt zinciri bulmak için aşağıdaki işlemleri uygularız:

Dizinin ilk sayıdır 3biz alt dize almak, böylece [0 - 3]olduğunu Hel. Ondan sonra, ilk 3karakterleri bizi bırakan ilk dizgiden kaldırırız lo, World!.

Dizinin ikinci sayısı 2, dolayısıyla alt [0 - 2]dizgiyi bize veren yeni dizgiden alıyoruz lo. Artık dize olur , World!.

Son sayı 3bize veren bir rakam , W. Alt zincir , bize verilen alt dizgelerin tümüdür:

['Hel', 'lo', ', W']

Daha görsel bir örnek için:

[3, 2, 3], 'Hello, World!'
3 -> Hel
2 ->    lo
3 ->      , W

Görev

Boş olmayan bir dize ve yalnızca pozitif tamsayılardan ( ) oluşan boş olmayan bir dizi göz önüne alındığında , alt zincir zincirini çıkar . Dizideki tüm tam sayıların toplamının dizenin uzunluğunu aşmadığını varsayabilirsiniz.> 0

Ayrıca, dizelerin hiçbir zaman yeni satır içermeyeceğini de varsayabilirsiniz.

Test durumları

Input: abcdefghijk, [2, 1, 3]
Output: ['ab', 'c', 'def']

Input: Code Golf, [4, 1]
Output: ['Code', ' ']

Input: Ayyy, [3]
Output: ['Ayy']

Input: lexicographically, [2, 2, 2, 7, 4]
Output: ['le', 'xi', 'co', 'graphic', 'ally']

Bu , bu yüzden en küçük bayt sayısına sahip olan gönderim kazanıyor!

Yanıtlar:



12

Python 2,42 bayt

s,a=input()
for n in a:print s[:n];s=s[n:]

Bazen sadece sıkıcı şekilde yaparsın.


Şimdiye kadar çok fazla sayıda python cevaplarından en kısa olanı
Cyoce

İyi anlaşılan ben haha ... bunu overthinking oldu
DJMcMayhem

8

Brachylog , 20 13 bayt

h@[~c.:la~t?,

Çevrimiçi deneyin!

Bu son derece verimsiz ve son test durumu için TIO'da zaman aşımına uğradı.

açıklama

Input = [String, List of integers]

h@[            Take a prefix of the string
   ~c.         Take a possible list of strings which when concatenated results in that prefix
      :la      Take the lengths of each element of that list
         ~t?,  This list of lengths is equal to the list of integers of the Input

Biraz daha verimli bir sürüm, 15 bayt

t:.? {~ il} a, h @ [° C


8

Python 3, 45 bayt

f=lambda s,a:f(s[a[0]:print(s[:a.pop(0)])],a)

Bu, satır başına bir alt dize basar ve a bitince hata ile sonlanır .

Repl.it üzerinde test edin .


2
Bir baskıya gizlice girmek için ne harika bir yol!
xnor

7

Python, 52 , 46 bayt

f=lambda a,s:a and[s[:a[0]]]+f(a[1:],s[a[0]:])

Bir özyinelemeli lambda işlevi.

Dennis'e 6 byte'ı tıraş ettiğin için teşekkürler!


7

Jöle , 6 bayt

Jx$ĠịY

Çevrimiçi deneyin!

        The implicit working value is the first argument.
Jx$     Given a list L, repeat (x) an element of [1..len(n)] (J)
        as many times as the corresponding value in L.
   Ġ    Group indices by values. This turns [1, 1, 1, 2, 2, 3, 3]
        into [[1, 2, 3], [4, 5], [6, 7]].
    ị   Index into the second argument.
     Y  Join by newlines.

5

Haskell, 34 bayt

s#(a:b)=take a s:drop a s#b
_#_=[]

Kullanım örneği: "lexicographically" # [2,2,2,7,4]->["le","xi","co","graphic","ally"]

Basit özyineleme.

Ya da yerleşik 29 bitlik sıkıcı çözüm:

import Data.Lists
splitPlaces

5

Ruby, 26 bayt

->w,a{a.map{|n|w.shift n}}

Dizeler karakter dizisi olarak temsil edilir.


4

PowerShell v2 +, 46 bayt

param($a,$b)$b|%{-join$a[$i..($i+=$_-1)];$i++}

Giriş dizesini $ave dizisini alır $b, tekrarlar $b. Her yineleme, geçerli sayıya (varsayılan olarak veya ) $adayalı bir dizi dilimi yapar . Yapılması gerekenler ve çünkü PowerShell'deki dizeler sıfır dizinlidir.$i$null0-1$i++

Örnekler

(Buradaki çıktı boşlukla ayrılmıştır, çünkü diziler için varsayılan dizge yöntemi budur)

PS C:\Tools\Scripts\golfing> @('abcdefghijk',@(2,1,3)),@('Code Golf',@(4,1)),@('Ayyy',@(3)),@('lexicographically',@(2,2,2,7,4))|%{""+$_[0]+" -> "+(.\substring-chainification.ps1 $_[0] $_[1])}
abcdefghijk -> ab c def
Code Golf -> Code  
Ayyy -> Ayy
lexicographically -> le xi co graphic ally

4

Perl, 28 bayt

İçin +1 içerir -n

STDIN'de giriş dizesiyle ve ardından her numara ayrı bir satırda olsun:

(echo "Hello, World!"; echo 3; echo 2; echo 3) | perl -nE 'say for/(??{"."x<>||"^"})/g'

Sadece kod:

say for/(??{"."x<>||"^"})/g

23 baytlık sürümde ||"^"ayrıca bir tür eser yoktur, ancak sahte takip eden yeni satırlar yazdırır

"^"$_dizge regex meta karakterleri içermiyorsa , bunun yerine değiştirilebilir


3

MATL , 8 bayt

ys:)1bY{

Çevrimiçi deneyin!

açıklama

y    % Implicitly take the two inputs: numerical array, string. Duplicate the array
s    % Sum of the array, say n
:    % Range from 1 to n
)    % Take first n characters of the string
1    % Push 1
b    % Bubble up the original copy of the string to the top
Y{   % Split into pieces of lengths given by the numerical array. The pieces are 
     % stored in a cell array, which is implicitly displayed, one cell per line

3

JavaScript (ES6), 39 38 35 bayt

ETHproductions sayesinde 3 bayt kurtardı:

s=>a=>a.map(v=>s.slice(t,t+=v),t=0)

Örnek:

//Definition
f=
s=>a=>a.map(v=>s.slice(t,t+=v),t=0)

//Call
f('lexicographically')([2, 2, 2, 7, 4]);

//Output
Array [ "le", "xi", "co", "graphic", "ally" ]


Önceki çözüm:
Huntro sayesinde 38 byte:

s=>a=>a.map(v=>s.substr(t,v,t+=v),t=0)

39 bayt:

(s,a)=>a.map(v=>s.substr(t,v,t+=v),t=0)

1
Sen-işlemden tek bayt kaydedebilirsiniz
Huntro

2
.sliceBirkaç bayt kaydeder:s=>a=>a.map(v=>s.slice(t,t+=v),t=0)
ETHproductions

3

Toplu iş, 74 bayt

@set/ps=
@for %%i in (%*)do @call echo %%s:~0,%%i%%&call set s=%%s:~%%i%%

C atıyor muyum? Bu doğru olamaz! STDIN'deki dizeyi ve diziyi komut satırı argümanları olarak alır.


3

Java, 119 Bayt

String[] substringChainification(String s, int[] i) {
    String[] r = new String[i.length];
    int j = 0, f = 0;
    for (int t : i)
        r[j++] = s.substring(f, f += t);
    return r;
}

golfed:

String[]s(String s,int[]i){String[]r=new String[i.length];int j=0,f=0;for(int t:i)r[j++]=s.substring(f,f+=t);return r;}

Roman Gräf'in cevabını değiştirdim ( /codegolf//a/93992/59935 ), ancak yorum yapacak kadar bilgim yok.

Döngü uygulamasını değiştirdim ve her yinelemede kaynak dizgiyi başka bir alt dizgiye ayarlamak yerine, sadece alt dizgeyi elde ettiğim dizinleri değiştirdim.


2
PPCG'ye Hoşgeldiniz! Harika ilk mesaj! Bu tam bir golf önerisi ile yapmanız gerekenler, ancak yeterli temsilcisi değil.
Rɪᴋᴇʀ

1
PPCG'ye Hoşgeldiniz! Ve ben ilk E-posta adresi olan _EasterlyIrk_ ile aynı fikirdeyim . Daha çok golf oynamak için bir şeyler bulmaya çalıştım, ama bulamadım. Belki de zaten gördünüz, fakat Java'da golf oynamak için İpuçları'ı ilginç bulabilirsiniz . Bir kez daha hoş geldiniz ve konaklamanızın tadını çıkarın.
Kevin Cruijssen


2

sed (-rn için 82 + 2) 84

s,^,\n,;:l;N;s,\n\n,\n,;:
s,^([^\n]*)\n(.)([^\n]*\n)1,\1\2\n\3,
t;P;s,^[^\n]*,,;tl

Girişin ilk satırı dizedir. Ondan sonraki her satır, tek bir alt dizenin büyüklüğüdür .

Örnek:

$ cat test.txt:
lexicographically
11
11
11
1111111
1111

$ cat hold | sed -rnf sed.txt
le
xi
co
graphic
ally

2

CJam , 11 bayt

lq~{/(ns}/;

Çevrimiçi deneyin!

açıklama

l    e# Read input string.
q~   e# Read array of lengths and eval.
{    e# For each length...
  /  e#   Split the string into chunks of the given size.
  (  e#   Pull off the first chunk.
  n  e#   Print with linefeed.
  s  e#   Flatten the remaining chunks into a single string again.
}/
;    e# Discard any remainder of the input string.

2

C, 81 bayt

i,j;f(s,l,k)char*s;int*l;{for(i=j=0;i<k;){write(1,s+j,l[i]);puts("");j+=l[i++];}}

Çünkü write()çıkış tamponlu değildir herhangi bir çevrimiçi derleyici zor anlar bu çıkışı olacaktır.

test.c :

i,j;f(s,l,k)char*s;int*l;{for(i=j=0;i<k;){write(1,s+j,l[i]);puts("");j+=l[i++];}}
main(){
    int l[]={3,2,3};
    f("Hello, World!",l,3);
    int ll[]={2,1,3};
    f("abcdefghijk",ll,3);
    int lll[]={4,1};
    f("Code Golf",lll,2);
    int llll[]={3};
    f("Ayyy",llll,1);
    int lllll[]={2,2,2,7,4};
    f("lexicographically",lllll,5);
}

Borusuz çıkış:

Hel
lo
, W
ab
c
def
Code

Ayy
le
xi
co
graphic
ally

Yukarıdaki c programının ideone derleyici l'çıktısında [ilk işlevi ekranında daha yüksekliği baş etme] ... "n \" olmadan "Merhaba, WabcdefCode Ayylexicographically" dır
RosLuP

2

PHP, 98 Bayt

<?php
$b=$argv[1];foreach(explode(',',$argv[2])as$a){echo(substr($b,0,$a).' ');$b=substr($b,$a);}

Kullanımı:

php chainification.php lexicographically 2,2,2,7,4


Çıktı:

le xi co graphic ally


PHP ile muhtemelen daha iyi bir çözüm var.


2

PHP, 82 Bayt

<?php for($s=$argv[++$i],$j=-1;$n=$argv[++$i];){for(;$n--;)echo$s[++$j];echo"
";}

Girdiyi string olarak alır ve sonra sayıların bir listesini çıkarır, çıktı yeni satırlarla ayrılır. Örneğin

php chainify.php lexicographically 2 2 2 7 4

$ Argv komutunu -r ile kullanabilen kişilerden biriyseniz, açılış etiketi için kullanılan 6 baytı kaydedebilirsiniz.


Kullanımı hakkında kafam karıştı $argv[++$i]. Neden $argv[1]ve $argv[2]?
MonkeyZeus

Ayrıca az PHP 7.0.2 kullanarak sandbox.onlinephpfunctions.com ben 3 saniyelik zaman sınırı vurmak
MonkeyZeus

bunun $argv[2]nedeni, değiştirilen argümanları yinelememiz gerektiği ve a'ya $argv[++$i]duyulan ihtiyacı engellemenin ,$i=1ve böylece 2 bayttan tasarruf etmemizin ilk zamanı .
user59178

2

PHP, 63 Bayt

<?foreach($_GET[a]as$p){echo" ".substr($_GET[s],$s,$p);$s+=$p;}

Dizi 85 Bayt olarak çıktı

<?foreach($_GET["a"]as$p){$o[]=substr($_GET["s"],$s,$p);$s+=$p;}echo json_encode($o);

1

Pyth, 7 bayt

PcwsM._

Girdiyi yeni satır ile ayırarak alır, dize çıkmaz ve diziden sonra gelir. Çevrimiçi Deneyin!

Açıklama:

     ._  Get all prefixes of Q
   sM    Map sum across each of these prefixes (to get the total indices)
 cw      Split the string at these locations
P        Remove the last "remainder" of the string

1

Octave / MATLAB, 31 bayt

@(s,a)mat2cell(s(1:sum(a)),1,a)

Bu girişleri olan anonim bir işlevdir s: string; a: sayısal dizi.

Ideone'da dene .

açıklama

Bu MATL cevabımın bir limanı.

s(1:sum(a))        % Take first n characters of string s, where n is the sum of array a
mat2cell(...,1,a)  % Split into pieces of lengths given by a and store in a cell array

1

Java 142 bayt

public static String[]substringChain(String s,int[]i){
  String[]r=new String[i.length];
  for(int j=-1;++j<i.length;){
    r[j]=s.substring(0,i[j]);
    s=s.substring(i[j]);
  }
  return b;
}

golfed:

String[]s(String s,int[]i){String[]r=new String[i.length];for(int j=-1;++j<i.length;){r[j]=s.substring(0,i[j]);s=s.substring(i[j]);}return b;}

1

Awk, 36 karakter

{FIELDWIDTHS=$0;OFS=RS;getline}$1=$1

Örnek çalışma:

bash-4.3$ awk '{FIELDWIDTHS=$0;OFS=RS;getline}$1=$1' <<< $'3 2 3\nHello, World!'
Hel
lo
, W

Gerçek hayatta bunu böyle kullanırdım, puanını nasıl hesaplayacağımı bilemedim:

bash-4.3$ awk -vFIELDWIDTHS='3 2 3' -vOFS='\n' '$1=$1' <<< 'Hello, World!'
Hel
lo
, W


1

GNU sed, 55 + 2 (rn bayrakları) = 57 bayt

1H;1d;G;:;s=.(\n.*)\n(.)=\1\2\n=;t;s=.==;P;s=[^\n]*==;h

Çevrimiçi deneyin! (sed eklemek için @Dennis sayesinde)

Açıklama: Giriş dizgisi ilk satırda ve sayılar, aynı sıradaki satırlardan sonra ayrı satırlarda olmalıdır. Yeni bir satır, bir döngü başlangıcında, betiği her seferinde çalıştırarak örtük olarak okunur.

1H;1d                       # once: append string to hold space and start new cycle
                            #Initially, the hold space contains an useful '\n'.
G                           # append hold space to pattern space. The pattern space
                            #format will be: 'UNARY\n\nSTRING'.
:;s=.(\n.*)\n(.)=\1\2\n=;t  # iteratively remove a char from the string, as many
                            #times as unary chars, and store it on 2nd pattern line
s=.==;P                     # remove '\n', then print the new top line
s=[^\n]*==;h                # delete up to '\n' and update hold space

Test çalıştırması: son işaretleyici olarak EOF ile birlikte bir belge kullanma

sed -rnf program.sed << EOF
> abcdefghijk
> 00
> 0
> 000
> EOF

Çıktı:

ab
c
def

1

Vimscript, 79 78 bayt

çok hoş değil, geliştirilebileceğinden eminim ...

Bir vim tamponu alır, ardından echom string(A([2,3]))çıkışı görmek için çağrı yapar

fu A(l)
let r=[]
for i in a:l
exe "norm d".i."l"
let r+=[@"]
endfo
retu r
endf

Aslında ipi aldatmayı ve çıkarmayı düşündüm ["abc", "def"]... Ama direndim: P

Açıklama: Sil (her bir dizginin önüne yazılır) her bir dizi, büyük miktarda karakter içerir ve diziye ekler r... Gerçekten de sıkıcı bir cevap.


1

Ortak Lisp, 78 76 bayt

Anonim fonksiyona izin verildiğini varsayarsak:

(lambda(s l)(loop for x in l as y = x then(+ y x)collect(subseq s(- y x)y)))

kullanım

(funcall #'(lambda(s l)(loop for x in l as y = x then(+ y x)collect(subseq s(- y x)y)))"AbCdefGhijK"'(3 2 3))

Çıktı

("AbC" "de" "fGh")

İçindeki iki değişken arasındaki parantezlere uyacak şekilde y tanımı asyerine kullanarak andve değiştirerek -2 bayt(subseq ...)


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.