Хайніфікація підрядків


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

Іноді ти просто робиш це нудно.


Поки найкоротший із відповідей пітонів
Кіос

Ну, мабуть, я це передумав, ха-ха ...
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 байт

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


8

Python 3, 45 байт

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

Це друкує одну підрядку на рядок і закінчується помилкою, коли вичерпано a .

Перевірте це на repl.it .


2
Який чудовий спосіб прокрастися в принт!
xnor

7

Пітон, 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

Хаскелл, 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 байти завдяки ETHproductions:

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

Гольф:

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_ , чудовий перший пост. Я намагався знайти щось для гольфу більше, але не зміг. Можливо, ви вже бачили це, але вам можуть бути цікаві для читання поради щодо гольфу на Яві . Ще раз ласкаво просимо і насолоджуйтесь своїм перебуванням.
Кевін Кройсейсен


2

sed (82 + 2 для -рн) 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 l'output з вищезгаданої програми c [справляється з першою функцією більше висоти на екрані] є "Привіт, 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

це не $argv[2]тому, що нам потрібно перебрати аргументовані аргументи, і це $argv[++$i]перший раз, щоб уникнути необхідності a ,$i=1і тим самим заощадити 2 байти.
користувач59178

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

Здійснює введення, розділене новою лінією, при цьому рядок відмічений і не надходить після масиву. Спробуйте в Інтернеті!

Пояснення:

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

Гольф:

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

Лист звичайний, 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.