Cadeificação de Substring

27

Introdução

Neste exemplo, vamos pegar a string Hello, World!e a matriz [3, 2, 3]. Para encontrar a cadeia de substring, seguimos o seguinte processo:

O primeiro número da matriz é 3, então obtemos a substring [0 - 3], que é Hel. Depois disso, removemos os primeiros 3caracteres da string inicial, o que nos deixa com lo, World!.

O segundo número da matriz é 2, portanto, obtemos a substring [0 - 2]de nossa nova string, que nos fornece lo. A string restante se torna , World!.

O último número é a 3, o que nos dá , W. A cadeia de substring é composta por todos os substrings, o que nos fornece:

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

Para um exemplo mais visual:

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

A tarefa

Dada uma sequência não vazia e uma matriz não vazia consistindo apenas de números inteiros positivos ( > 0), produza a cadeia de substring . Você pode supor que a soma de todos os números inteiros na matriz não exceda o comprimento da string.

Você também pode assumir que as seqüências nunca conterão novas linhas.

Casos de teste

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

Isso é , então a submissão com o menor número de bytes vence!

Adnan
fonte

Respostas:

33

05AB1E , 1 byte

£

Este é o comando substring (0, N).
Aplicado em uma lista, isso funciona repetidamente no restante da string.

Experimente online!

Emigna
fonte
9
Não pode superar isso.
Steven H.
12

Python 2, 42 bytes

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

Às vezes você faz da maneira chata.

xnor
fonte
Até agora, o mais curto dos muito-muito-muitas respostas python
Cyoce
Bem, aparentemente, eu estava cismar isso, haha ...
DJMcMayhem
8

Braquilog , 20 13 bytes

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

Experimente online!

Isso é extremamente ineficiente e atinge o tempo limite do TIO para o último caso de teste.

Explicação

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

Uma versão um pouco mais eficiente, 15 bytes

t: {~ l} a.,? h @ [~ c

Fatalizar
fonte
8

Python 3, 45 bytes

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

Isso imprime uma substring por linha e termina com um erro quando a está esgotado.

Testá-lo em repl.it .

Dennis
fonte
2
Que ótima maneira de esgueirar-se em uma impressão!
Xnor
7

Python, 52 , 46 bytes

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

Uma função lambda recursiva.

Agradecimentos a Dennis por eliminar 6 bytes!

DJMcMayhem
fonte
7

Gelatina , 6 bytes

Jx$ĠịY

Experimente online!

        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.
Lynn
fonte
5

Haskell, 34 bytes

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

Exemplo de uso: "lexicographically" # [2,2,2,7,4]->["le","xi","co","graphic","ally"]

Recursão simples.

Ou a chata solução de 29 bytes via built-in:

import Data.Lists
splitPlaces
nimi
fonte
5

Ruby, 26 bytes

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

As cadeias são representadas como matrizes de caracteres.

m-chrzan
fonte
4

PowerShell v2 +, 46 bytes

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

Pega a string $ae a matriz de entrada e $bpassa o loop $b. Cada iteração faz uma fatia da matriz com $abase em $i(o padrão é $nullou 0) e o número atual. Precisa fazer o -1e $i++porque as seqüências de caracteres no PowerShell são zero-indexadas.

Exemplos

(A saída aqui é separada por espaço, porque esse é o método de stringificação padrão para matrizes)

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
AdmBorkBork
fonte
4

Perl, 28 bytes

Inclui +1 para -n

Execute com a sequência de entrada em STDIN seguida por cada número em uma linha separada:

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

Apenas o código:

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

A versão de 23 bytes sem ||"^"também funciona, mas imprime novas linhas finais falsas

"^"pode ser substituído por $_se a sequência não contiver metacaracteres regex

Ton Hospel
fonte
3

MATL , 8 bytes

ys:)1bY{

Experimente online!

Explicação

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
Luis Mendo
fonte
3

JavaScript (ES6), 39 38 35 bytes

Economizou 3 bytes graças ao ETHproductions:

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

Exemplo:

//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" ]


Solução anterior:
38 bytes graças ao Huntro:

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

39 bytes:

(s,a)=>a.map(v=>s.substr(t,v,t+=v),t=0)
Hedi
fonte
1
Você pode salvar um byte fazendo um curry
Huntro
2
.slicesalva alguns bytes:s=>a=>a.map(v=>s.slice(t,t+=v),t=0)
ETHproductions
3

Lote, 74 bytes

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

Estou batendo C? Isso não pode estar certo! Leva a string em STDIN e a matriz como argumentos da linha de comando.

Neil
fonte
3

Java, 119 bytes

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

Golfe:

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

Modifiquei a resposta de Roman Gräf ( /codegolf//a/93992/59935 ), mas não tenho representante suficiente para comentar.

Alterei a implementação do loop e, em vez de definir a string de origem para outra substring em cada iteração, alterei os índices com os quais recebo a substring.

mrco
fonte
2
Bem-vindo ao PPCG! Ótimo primeiro post! É exatamente isso que você deve fazer com uma sugestão de golfe, mas não o suficiente.
Rɪᴋᴇʀ
1
Bem-vindo ao PPCG! E eu concordo com o _EasterlyIrk_ , ótimo primeiro post. Tentei encontrar algo para jogar mais, mas não consegui. Talvez você já tenha visto, mas talvez seja interessante ler dicas para jogar golfe em Java . Mais uma vez, seja bem-vindo e aproveite a sua estadia.
Kevin Cruijssen 22/09
2

sed (82 + 2 para -rn) 84

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

A primeira linha de entrada é a sequência. Em seguida, cada linha depois disso é do tamanho de uma substring em unário .

Exemplo:

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

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

CJam , 11 bytes

lq~{/(ns}/;

Experimente online!

Explicação

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.
Martin Ender
fonte
2

C, 81 bytes

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

Como a write()saída não é armazenada em buffer, qualquer compilador on-line terá dificuldade em produzir isso.

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

Saída sem tubulação:

Hel
lo
, W
ab
c
def
Code

Ayy
le
xi
co
graphic
ally
betseg
fonte
em ideone compilador l'saída do programa c acima [enfrentar a primeira função a mais altura na tela] é "Olá, WabcdefCode Ayylexicographically" sem "\ n" ...
RosLuP
2

PHP, 98 bytes

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

Uso:

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


Saída:

le xi co graphic ally


Provavelmente existe uma solução melhor com PHP.

empurrão
fonte
2

PHP, 82 bytes

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

Pega a entrada como uma sequência e, em seguida, uma lista de números, a saída é separada por novas linhas. por exemplo

php chainify.php lexicographically 2 2 2 7 4

Se você é uma daquelas pessoas capazes de usar $ argv com -r, pode salvar os 6 bytes usados ​​para a tag de abertura.

user59178
fonte
Estou confuso sobre o uso de $argv[++$i]. Por que não $argv[1]e $argv[2]?
precisa saber é o seguinte
Além disso, usando PHP 7.0.2 em sandbox.onlinephpfunctions.com eu bati o limite de 3 segunda vez
MonkeyZeus
não é $argv[2]porque precisamos iterar através dos argumentos suprimidos e é $argv[++$i]a primeira vez para evitar a necessidade de um ,$i=1e, assim, economizando 2 bytes.
user59178
2

PHP, 63 bytes

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

Saída como matriz 85 bytes

<?foreach($_GET["a"]as$p){$o[]=substr($_GET["s"],$s,$p);$s+=$p;}echo json_encode($o);
Jörg Hülsermann
fonte
1

Pitão, 7 bytes

PcwsM._

Coloca a entrada separada por nova linha, com a sequência sem escape e vindo após a matriz. Experimente Online!

Explicação:

     ._  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
Steven H.
fonte
1

Oitava / MATLAB, 31 bytes

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

Esta é uma função anônima com entradas s: string; a: matriz numérica.

Experimente em Ideone .

Explicação

Esta é uma porta da minha resposta MATL.

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
Luis Mendo
fonte
1

Java 142 bytes

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

Golfe:

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;}
Roman Gräf
fonte
1

Awk, 36 caracteres

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

Exemplo de execução:

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

Na vida real, eu usaria assim, apenas não faço ideia de como calcular sua pontuação:

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

Dyalog APL 16.0, 15 caracteres (não concorrente); 15,0, 17 bytes

Solução 16.0

{⍵⊆⍨(⍴⍵)↑⍺/+\⍺}

O Dyalog APL 16.0 adiciona a partição do APL2 primitiva ,, com o glifo .

Solução 15.0:

{(-⍺)↑¨(+\⍺)↑¨⊂⍵}

TryAPL online!

Adão
fonte
1

GNU sed, 55 + 2 (sinalizadores de rn) = 57 bytes

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

Experimente online! (obrigado a @Dennis por adicionar o sed)

Explicação: A sequência de entrada deve estar na primeira linha e os números, em unário , em linhas separadas depois disso. Uma nova linha é lida implicitamente no início de um ciclo, executando o script a cada vez.

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

Execução de teste: usando um documento aqui com EOF como marcador final

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

Saída:

ab
c
def
seshoumara
fonte
1

Vimscript, 79 78 bytes

não muito bonito, tenho certeza que pode ser melhorado ...

Pega um buffer vim e depois chama echom string(A([2,3]))para ver a saída

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

Na verdade, pensei em trapacear e emitir a corda ["abc", "def"] ... Mas resisti: P

Explicação: Exclua (coloca no registro padrão) cada item da matriz quantia caracteres e o adiciona à matriz r... Uma resposta chata de fato.

Christian Rondeau
fonte
1

Lisp comum, 78 76 bytes

Supondo que a função anônima seja permitida:

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

Uso

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

Saída

("AbC" "de" "fGh")

-2 bytes usando em asvez de ande alterando a definição y para ajustar parênteses entre duas variáveis ​​em(subseq ...)


fonte
1

Rebol, 38 bytes

func[s b][map-each n b[take/part s n]]
draegtun
fonte