Cadena de subcadenas

27

Introducción

Para este ejemplo, tomemos la cadena Hello, World!y la matriz [3, 2, 3]. Para encontrar la cadena de subcadenas, pasamos por el siguiente proceso:

El primer número de la matriz es 3, por lo que obtenemos la subcadena [0 - 3], que es Hel. Después de eso, eliminamos los primeros 3caracteres de la cadena inicial, lo que nos deja con lo, World!.

El segundo número de la matriz es 2, por lo que obtenemos la subcadena [0 - 2]de nuestra nueva cadena, que nos da lo. La cadena sobrante se convierte en , World!.

El último número es un 3, que nos da , W. La cadena de subcadenas son todas las subcadenas combinadas, lo que nos da:

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

Para un ejemplo más visual:

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

La tarea

Dada una cadena no vacía y una matriz no vacía que solo consta de enteros positivos ( > 0), genera la cadena de subcadena . Puede suponer que la suma de todos los enteros en la matriz no excede la longitud de la cadena.

También puede suponer que las cadenas nunca contendrán nuevas líneas.

Casos de prueba

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

Este es el , por lo que gana el envío con el menor número de bytes.

Adnan
fuente

Respuestas:

33

05AB1E , 1 byte

£

Este es el comando de subcadena (0, N).
Aplicado en una lista, esto funciona repetidamente en el resto de la cadena.

Pruébalo en línea!

Emigna
fuente
99
No se puede superar eso.
Steven H.
12

Python 2, 42 bytes

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

A veces lo haces de forma aburrida.

xnor
fuente
Hasta ahora, la más corta de las demasiadas respuestas de Python
Cyoce
Bueno, aparentemente estaba pensando demasiado, jaja ...
DJMcMayhem
8

Brachylog , 20 13 bytes

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

Pruébalo en línea!

Esto es extremadamente ineficiente y agota el tiempo de espera en TIO para el último caso de prueba.

Explicación

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

Una versión un poco más eficiente, 15 bytes.

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

Fatalizar
fuente
8

Python 3, 45 bytes

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

Esto imprime una subcadena por línea y termina con un error cuando a se agota.

Probarlo en repl.it .

Dennis
fuente
2
¡Qué gran manera de escabullirse en una impresión!
xnor
7

Python, 52 , 46 bytes

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

Una función lambda recursiva.

¡Gracias a Dennis por reducir 6 bytes!

DJMcMayhem
fuente
7

Jalea , 6 bytes

Jx$ĠịY

Pruébalo en línea!

        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
fuente
5

Haskell, 34 bytes

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

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

Recurrencia simple

O la aburrida solución de 29 bytes a través de incorporado:

import Data.Lists
splitPlaces
nimi
fuente
5

Rubí, 26 bytes

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

Las cadenas se representan como matrices de caracteres.

m-chrzan
fuente
4

PowerShell v2 +, 46 bytes

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

Toma la cadena de entrada $ay la matriz $b, se repite $b. Cada iteración, hace una porción de matriz $abasada en $i(por defecto $null, o 0) y el número actual. Necesita hacer el -1y $i++porque las cadenas en PowerShell están indexadas a cero.

Ejemplos

(La salida aquí está separada por espacios, porque ese es el método de stringificación predeterminado para las matrices)

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
fuente
4

Perl, 28 bytes

Incluye +1 para -n

Ejecute con la cadena de entrada en STDIN seguido de cada número en una línea separada:

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

Solo el código:

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

La versión de 23 bytes sin ||"^"también funciona, pero imprime líneas falsas

"^"puede ser reemplazado por $_si la cadena no contiene meta caracteres regex

Ton Hospel
fuente
3

MATL , 8 bytes

ys:)1bY{

Pruébalo en línea!

Explicación

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
fuente
3

JavaScript (ES6), 39 38 35 bytes

Guardado 3 bytes gracias a ETHproductions:

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

Ejemplo:

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


Solución anterior:
38 bytes gracias a 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
fuente
1
Puede guardar un byte al curry
Huntro
2
.sliceguarda algunos 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%%

Estoy golpeando a C? ¡Esto no puede ser correcto! Toma la cadena en STDIN y la matriz como argumentos de línea de comandos.

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

Golfizado:

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

Modifiqué la respuesta de Roman Gräf ( /codegolf//a/93992/59935 ), pero no tengo suficiente representante para comentar.

Cambié la implementación del bucle y, en lugar de establecer la cadena de origen en otra subcadena en cada iteración, simplemente cambio los índices con los que obtengo la subcadena.

mrco
fuente
2
Bienvenido a PPCG! Gran primer post! Esto es exactamente lo que debe hacer con una sugerencia de golf, pero no suficiente representante.
Rɪᴋᴇʀ
1
Bienvenido a PPCG! Y estoy de acuerdo con _EasterlyIrk_ , excelente primer post. Traté de encontrar algo para jugar más al golf, pero no pude. Tal vez ya lo haya visto, pero puede que le resulten interesantes los Consejos para jugar golf en Java . Una vez más, bienvenidos, y disfruten su estadía.
Kevin Cruijssen
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

La primera línea de entrada es la cadena. Luego, cada línea después de eso es del tamaño de una subcadena en unario .

Ejemplo:

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

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

CJam , 11 bytes

lq~{/(ns}/;

Pruébalo en línea!

Explicación

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

Debido a que la write()salida no está almacenada en un búfer, cualquier compilador en línea tendrá dificultades para enviar esto.

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

Salida sin tubería:

Hel
lo
, W
ab
c
def
Code

Ayy
le
xi
co
graphic
ally
Betseg
fuente
en el compilador ideone la salida del programa c anterior [haciendo frente a la primera función cuanto más alta en la pantalla] es "Hola, WabcdefCode Ayylexicographically" sin "\ 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


Salida:

le xi co graphic ally


Probablemente haya una mejor solución con PHP.

jrenk
fuente
2

PHP, 82 bytes

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

Toma la entrada como una cadena y luego una lista de números, la salida está separada por nuevas líneas. p.ej

php chainify.php lexicographically 2 2 2 7 4

Si eres una de esas personas capaces de usar $ argv con -r, puedes guardar los 6 bytes utilizados para la etiqueta de apertura.

usuario59178
fuente
Estoy confundido sobre el uso de $argv[++$i]. ¿Por qué no $argv[1]y $argv[2]?
MonkeyZeus
Además, usando PHP 7.0.2 en sandbox.onlinephpfunctions.com llegué al límite de 3 segundos
MonkeyZeus
no es $argv[2]porque necesitemos iterar a través de los argumentos supiled y es $argv[++$i]la primera vez que evitamos la necesidad de ay ,$i=1ahorrando 2 bytes.
user59178
2

PHP, 63 bytes

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

Salida como matriz de 85 bytes

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

Pyth, 7 bytes

PcwsM._

Toma la entrada separada por nueva línea, con la cadena sin escape y que viene después de la matriz. Pruébalo en línea!

Explicación:

     ._  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.
fuente
1

Octava / MATLAB, 31 bytes

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

Esta es una función anónima con entradas s: cadena; a: matriz numérica.

Pruébalo en Ideone .

Explicación

Este es un puerto de mi respuesta 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
fuente
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;
}

Golfizado:

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
fuente
1

Awk, 36 caracteres

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

Ejecución de muestra:

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

En la vida real lo usaría así, pero no tengo idea de cómo calcular su puntaje:

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

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

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

Pruébalo en línea! (gracias a @Dennis por agregar sed)

Explicación: La cadena de entrada debe estar en la primera línea y los números, en unario , en líneas separadas después de eso. Una nueva línea se lee implícitamente al comienzo de un ciclo, ejecutando el script 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

Prueba de funcionamiento: utilizando un documento aquí con EOF como marcador final

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

Salida:

ab
c
def
seshoumara
fuente
1

Vimscript, 79 78 bytes

no muy bonito, estoy seguro de que se puede mejorar ...

Toma un búfer vim, luego llama echom string(A([2,3]))para ver la salida

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

De hecho, pensé en hacer trampa y sacar la cadena ["abc", "def"] ... Pero me resistí: P

Explicación: Eliminar (pone en el registro predeterminado) la cantidad de caracteres de cada elemento de la matriz y lo agrega a la matriz r... Una respuesta realmente aburrida.

Christian Rondeau
fuente
1

Lisp común, 78 76 bytes

Asumiendo que se permita la función anónima:

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

Salida

("AbC" "de" "fGh")

-2 bytes usando en aslugar de andy cambiando la definición y para ajustar los paréntesis entre dos variables en(subseq ...)


fuente
1

Rebol, 38 bytes

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