Incatenamento del sottostrato


27

introduzione

Per questo esempio, prendiamo la stringa Hello, World!e l'array [3, 2, 3]. Per trovare la catena di sottostringa, seguiamo il seguente processo:

Il primo numero dell'array è 3, quindi otteniamo la sottostringa [0 - 3], che è Hel. Successivamente, rimuoviamo i primi 3caratteri dalla stringa iniziale, che ci lascia con lo, World!.

Il secondo numero dell'array è 2, quindi otteniamo la sottostringa [0 - 2]dalla nostra nuova stringa, che ci dà lo. La stringa rimanente diventa , World!.

L'ultimo numero è a 3, che ci dà , W. La catena di sottostringa è costituita da tutte le sottostringhe combinate, il che ci dà:

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

Per un esempio più visivo:

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

L'obiettivo

Data una stringa non vuota e un array non vuoto costituito solo da numeri interi positivi ( > 0), genera la catena di sottostringa . Si può presumere che la somma di tutti i numeri interi nella matrice non superi la lunghezza della stringa.

Puoi anche supporre che le stringhe non conterranno mai nuove righe.

Casi test

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

Questo è , quindi vince l'invio con il minor numero di byte!

Risposte:



12

Python 2, 42 byte

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

A volte lo fai solo nel modo noioso.


Finora la più breve delle troppe risposte in pitone
Cyoce,

Beh, a quanto pare lo stavo pensando troppo, ahah ...
DJMcMayhem

8

Brachylog , 20 13 byte

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

Provalo online!

Questo è estremamente inefficiente e scade il TIO per l'ultimo caso di test.

Spiegazione

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 versione leggermente più efficiente, 15 byte

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


8

Python 3, 45 byte

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

Ciò stampa una sottostringa per riga e termina con un errore quando a è esaurito.

Testarlo su repl.it .


2
Che bel modo di intrufolarsi in una stampa!
xnor

7

Python, 52 , 46 byte

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

Una funzione lambda ricorsiva.

Grazie a Dennis per la rasatura di 6 byte!


7

Gelatina , 6 byte

Jx$ĠịY

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

5

Haskell, 34 byte

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

Esempio di utilizzo: "lexicographically" # [2,2,2,7,4]->["le","xi","co","graphic","ally"]

Ricorsione semplice.

O la noiosa soluzione da 29 byte tramite built-in:

import Data.Lists
splitPlaces

5

Rubino, 26 byte

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

Le stringhe sono rappresentate come matrici di caratteri.


4

PowerShell v2 +, 46 byte

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

Accetta stringa $ae matrice di input $b, passa in rassegna $b. Ogni iterazione, esegue una sezione di array $abasata su $i(impostazione predefinita a $null, o 0) e il numero corrente. Deve eseguire il comando -1e $i++poiché le stringhe in PowerShell sono indicizzate a zero.

Esempi

(L'output qui è separato dallo spazio, perché quello è il metodo di stringa di default per gli array)

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 byte

Include +1 per -n

Esegui con la stringa di input su STDIN seguita da ciascun numero su una riga separata:

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

Solo il codice:

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

La versione a 23 byte senza ||"^"anche una sorta di lavoro, ma stampa nuove righe finali spurie

"^"può essere sostituito da $_se la stringa non contiene meta caratteri regex


3

MATL , 8 byte

ys:)1bY{

Provalo online!

Spiegazione

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 byte

Risparmio di 3 byte grazie a ETHproductions:

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

Esempio:

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


Soluzione precedente:
38 byte grazie a Huntro:

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

39 byte:

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

1
È possibile salvare un byte
eseguendo il

2
.slicesalva alcuni byte:s=>a=>a.map(v=>s.slice(t,t+=v),t=0)
ETHproductions

3

Lotto, 74 byte

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

Sto battendo C? Questo non può essere giusto! Accetta la stringa su STDIN e l'array come argomenti della riga di comando.


3

Java, 119 byte

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

Ho modificato la risposta di Roman Gräf ( /codegolf//a/93992/59935 ), ma non ho abbastanza rappresentante per commentare.

Ho modificato l'implementazione del ciclo e invece di impostare la stringa di origine su un'altra sottostringa in ogni iterazione, cambio semplicemente gli indici con cui ottengo la sottostringa.


2
Benvenuti in PPCG! Ottimo primo post! Questo è esattamente ciò che dovresti fare con un suggerimento sul golf, ma non abbastanza rappresentante.
Rɪᴋᴇʀ

1
Benvenuti in PPCG! E sono d'accordo con _EasterlyIrk_ , ottimo primo post. Ho cercato di trovare qualcosa da golf in più, ma non ci sono riuscito. Forse l'hai già visto, ma potresti trovare interessanti suggerimenti per giocare a golf in Java . Ancora una volta benvenuto, e goditi il ​​tuo soggiorno.
Kevin Cruijssen,


2

sed (82 + 2 per -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 prima riga di input è la stringa. Quindi ogni riga successiva è la dimensione di una sottostringa in unario .

Esempio:

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

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

2

CJam , 11 byte

lq~{/(ns}/;

Provalo online!

Spiegazione

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 byte

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

Poiché l' write()output non è bufferizzato, nessun compilatore online avrà difficoltà a emetterlo.

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

Uscita senza tubazioni:

Hel
lo
, W
ab
c
def
Code

Ayy
le
xi
co
graphic
ally

nel compilatore ideone l'output del programma sopra c [far fronte alla prima funzione più alta nella schermata] è "Ciao, WabcdefCodice Ayylexicograficamente" senza "\ n" ...
RosLuP

2

PHP, 98 byte

<?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


Produzione:

le xi co graphic ally


Probabilmente c'è una soluzione migliore con PHP.


2

PHP, 82 byte

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

Prende l'input come una stringa e quindi un elenco di numeri, l'output è separato da nuove righe. per esempio

php chainify.php lexicographically 2 2 2 7 4

Se sei una di quelle persone in grado di usare $ argv con -r puoi salvare i 6 byte usati per il tag di apertura.


Sono confuso sull'uso di $argv[++$i]. Perché no $argv[1]e $argv[2]?
MonkeyZeus,

Inoltre, usando PHP 7.0.2 su sandbox.onlinephpfunctions.com ho raggiunto il limite di 3 secondi
MonkeyZeus,

non è $argv[2]perché dobbiamo iterare attraverso gli argomenti supiled ed è $argv[++$i]la prima volta per evitare la necessità di un ,$i=1e quindi salvare 2 byte.
user59178

2

PHP, 63 byte

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

Output come array 85 byte

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

1

Pyth, 7 byte

PcwsM._

Prende l'input separato da newline, con la stringa senza escape e proveniente dall'array. Provalo online!

Spiegazione:

     ._  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 byte

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

Questa è una funzione anonima con input s: stringa; a: matrice numerica.

Provalo su Ideone .

Spiegazione

Questa è una porta della mia risposta 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 byte

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 personaggi

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

Esecuzione di esempio:

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

Nella vita reale lo userei in questo modo, non ho idea di come calcolare il suo punteggio:

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 byte

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

Provalo online! (grazie a @Dennis per l'aggiunta di sed)

Spiegazione: La stringa di input dovrebbe essere sulla prima riga e successivamente i numeri, in unario , su righe separate. Una nuova riga viene letta implicitamente all'inizio di un ciclo, eseguendo lo script ogni volta.

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

Esecuzione del test: utilizzo di un documento qui con EOF come marker di fine

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

Produzione:

ab
c
def

1

Vimscript, 79 78 byte

non molto carino, sono sicuro che può essere migliorato ...

Prende un buffer vim, quindi chiama echom string(A([2,3]))per vedere l'output

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

In realtà ho pensato di imbrogliare ed emettere la stringa ["abc", "def"] ... Ma ho resistito: P

Spiegazione: Elimina (mette nel registro predefinito) ogni array contiene quantità di caratteri e lo aggiunge all'array r... Una risposta davvero noiosa.


1

Lisp comune, 78 76 byte

Supponendo che la funzione anonima sia consentita:

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

Produzione

("AbC" "de" "fGh")

-2 byte utilizzando asanziché ande modificando la definizione y per adattare le parentesi tra due variabili(subseq ...)


1

Rebol, 38 byte

func[s b][map-each n b[take/part s n]]
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.