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.

Respuestas:



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.


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


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 .


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!


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.

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

5

Rubí, 26 bytes

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

Las cadenas se representan como matrices de caracteres.


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

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


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

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)

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.


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.


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

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.

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

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.


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.


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

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

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

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

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


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

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.


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


Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.