Цепочка подстрок


27

Введение

Для этого примера возьмем строку Hello, World!и массив [3, 2, 3]. Чтобы найти цепочку подстрок, мы пройдем следующий процесс:

Первый номер массива 3, таким образом, мы получаем подстроку [0 - 3], которая есть Hel. После этого мы удаляем первые 3символы из исходной строки, что оставляет нас с lo, World!.

Второе число в массиве 2, так что мы получаем подстроку [0 - 2]из нашей новой строки, которая дает нам lo. Оставшаяся строка становится , World!.

Последнее число - это то 3, что нам дает , W. Подстроки цепь все из подстрок в сочетании, что дает нам:

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

Для более наглядного примера:

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

Задание

Учитывая , с непустой строкой и в непустой массиве только состоящий из положительных целых чисел ( > 0), выходные в подстроках цепи . Вы можете предположить, что сумма всех целых чисел в массиве не превышает длину строки.

Вы также можете предположить, что строки никогда не будут содержать новых строк.

Контрольные примеры

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

Это , поэтому выигрывает представление с наименьшим количеством байтов!

Ответы:



12

Python 2, 42 байта

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

Иногда ты просто делаешь это скучно.


Пока самый короткий из слишком многих ответов Python
Cyoce

Ну, видимо, я обдумывал это, ха-ха ...
DJMcMayhem

8

Брахилог , 20 13 байт

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

Попробуйте онлайн!

Это крайне неэффективно и время ожидания TIO для последнего контрольного примера.

объяснение

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

Чуть более эффективная версия, 15 байт

т:.? {~ л} а, ч @ [~ с


8

Python 3, 45 байт

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

Это печатает один подстроки в каждой строке и завершается с ошибкой , когда исчерпан.

Проверьте это на repl.it .


2
Какой отличный способ подкрасться к печати!
xnor

7

Python, 52 , 46 байт

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

Рекурсивная лямбда-функция.

Спасибо Деннису за то, что он сбрил 6 байтов!


7

Желе , 6 байт

Jx$ĠịY

Попробуйте онлайн!

        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 байта

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

Пример использования: "lexicographically" # [2,2,2,7,4]->["le","xi","co","graphic","ally"]

Простая рекурсия.

Или скучное 29-байтовое решение с помощью встроенного:

import Data.Lists
splitPlaces

5

Рубин, 26 байт

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

Строки представлены в виде массивов символов.


4

PowerShell v2 +, 46 байт

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

Принимает входную строку $aи массив $b, зацикливается $b. Каждая итерация выполняет срез массива на $aоснове $i(по умолчанию $nullили 0) и текущего числа. Требуется сделать -1и $i++потому что строки в PowerShell с нулевой индексацией.

Примеры

(Выходные данные здесь разделены пробелами, потому что это метод строковой классификации по умолчанию для массивов)

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 байт

Включает +1 для -n

Запустите со строкой ввода в STDIN, за которой следуют каждое число в отдельной строке:

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

Просто код:

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

23-байтовая версия ||"^"также не работает, но печатает ложные конечные переводы строк

"^"можно заменить, $_если строка не содержит метасимволов регулярных выражений


3

MATL , 8 байт

ys:)1bY{

Попробуйте онлайн!

объяснение

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 байт

Сохранено 3 байта благодаря продуктам ETH:

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

Пример:

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


Предыдущее решение:
38 байтов благодаря Huntro:

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

39 байтов:

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

1
Вы можете сохранить один байт,
каррируя

2
.sliceсохраняет несколько байтов:s=>a=>a.map(v=>s.slice(t,t+=v),t=0)
ETHproductions

3

Пакетная, 74 байта

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

Я бью С? Это не может быть правдой! Принимает строку в STDIN и массив в качестве аргументов командной строки.


3

Java, 119 байт

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

Я изменил ответ Романа Грефа ( /codegolf//a/93992/59935 ), но у меня недостаточно репутации, чтобы комментировать.

Я изменил реализацию цикла и вместо установки исходной строки на другую подстроку в каждой итерации, я просто меняю индексы, с помощью которых я получаю подстроку.


2
Добро пожаловать в PPCG! Отличный первый пост! Это именно то, что вы должны сделать с предложением гольфа, но недостаточно реп.
Rɪᴋᴇʀ

1
Добро пожаловать в PPCG! И я согласен с _EasterlyIrk_ , отличный первый пост. Я пытался найти что-то еще для гольфа, но не смог. Может быть, вы уже видели это, но вы можете найти советы по игре в гольф на Java интересными для чтения. Еще раз добро пожаловать, и приятного пребывания.
Кевин Круйссен


2

sed (82 + 2 для -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

Первая строка ввода - это строка. Тогда каждая строка после этого является размером подстроки в одинарном формате .

Пример:

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

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

2

CJam , 11 байт

lq~{/(ns}/;

Попробуйте онлайн!

объяснение

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 байт

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

Поскольку write()вывод не буферизирован, любой онлайн-компилятор будет испытывать трудности при его выводе.

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

Выход без трубопровода:

Hel
lo
, W
ab
c
def
Code

Ayy
le
xi
co
graphic
ally

в ideone compiler l'output из вышеупомянутой программы c [копирование первой функции с большей высотой на экране] выглядит так: «Hello, WabcdefCode Ayylexicographically» без «\ n» ...
RosLuP

2

PHP, 98 байт

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

Использование:

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


Выход:

le xi co graphic ally


Вероятно, есть лучшее решение с PHP.


2

PHP, 82 байта

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

Принимает ввод в виде строки, а затем список чисел, вывод разделяется новыми строками. например

php chainify.php lexicographically 2 2 2 7 4

Если вы один из тех, кто может использовать $ argv с -r, вы можете сохранить 6 байтов, используемых для открывающего тега.


Я запутался в использовании $argv[++$i]. А почему бы $argv[1]и нет $argv[2]?
MonkeyZeus

Кроме того, используя PHP 7.0.2 на sandbox.onlinephpfunctions.com, я преодолел 3-секундный лимит времени
MonkeyZeus 21.09.16

это не $argv[2]потому, что нам нужно перебирать аргументы supiled, и это $argv[++$i]первый раз, когда мы избегаем необходимости в a ,$i=1и, следовательно, экономим 2 байта.
user59178 22.09.16

2

PHP, 63 байта

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

Вывести как массив 85 байт

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

1

Pyth, 7 байт

PcwsM._

Принимает ввод, разделенный новой строкой, со строкой unesceded и идущей после массива. Попробуйте онлайн!

Объяснение:

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

Октава / MATLAB, 31 байт

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

Это анонимная функция с входами s: string; a: числовой массив.

Попробуйте это в Ideone .

объяснение

Это порт моего ответа 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 байта

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 символов

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

Образец прогона:

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

В реальной жизни я бы использовал это так, просто не знаю, как рассчитать его оценку:

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


1

GNU sed, 55 + 2 (флаги rn) = 57 байт

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

Попробуйте онлайн! (спасибо @Dennis за добавление sed)

Объяснение: Входная строка должна быть в первой строке, а цифры, в одинарном , в отдельных строках после этого. Новая строка неявно читается в начале цикла, каждый раз запуская скрипт.

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

Тестовый прогон: здесь используется документ с EOF в качестве конечного маркера

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

Выход:

ab
c
def

1

Vimscript, 79 78 байт

не очень красиво, я уверен, что это может быть улучшено ...

Принимает буфер vim, затем вызывает, echom string(A([2,3]))чтобы увидеть вывод

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

Я на самом деле думал об обмане и выводе строки ["abc", "def"] ... Но я сопротивлялся: P

Объяснение: Удалить (помещает в регистр по умолчанию) каждый массив, перечисляет количество символов и добавляет его в массив r... Действительно скучный ответ.


1

Common Lisp, 78 76 байт

Предполагается, что анонимная функция разрешена:

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

использование

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

Выход

("AbC" "de" "fGh")

-2 байта, используя asвместо andи изменяя определение y, чтобы соответствовать скобкам между двумя переменными в(subseq ...)


Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.