P Pr Pre Pref Prefi Префікс Префікс префіксів


34

З огляду на деякий кінцевий список, поверніть список усіх його префіксів, включаючи порожній список, у порядку зростання їх довжини.

(В основному реалізація функції Haskell inits.)

Деталі

  • Список вводу містить цифри (або більше, якщо це зручніше).
  • Вихід повинен бути списком списків .
  • Подання може, але не повинно бути функцією, можна використовувати будь-який ввід / вивід за замовчуванням .
  • Існує відповідь CW на всі тривіальні рішення .

Приклад

[] -> [[]]
[42] -> [[],[42]]
[1,2,3,4] -> [[], [1], [1,2], [1,2,3], [1,2,3,4]]
[4,3,2,1] -> [[], [4], [4,3], [4,3,2], [4,3,2,1]]

Якщо мова не визначає жодних типів, окрім символів, чи можу я взяти введення як рядок та розділити введення новими рядками, у разі повної програми?
NieDzejkob

@NieDzejkob Я не впевнений, який консенсус існує для цього випадку, але відповідь Brainfuck, здається, робить щось подібне.
недолік

Чи можемо ми очікувати, що цей список буде скасований нанівець?

Це особливо часто в C / C ++, головне використання - це рядки.

@Rogem Якщо це звичайне явище, я вважаю, що дозволити це розумно.
недолік

Відповіді:


15

Haskell , 20 байт

Редагувати: все ж байт коротший із абсолютно іншим скануванням.

Анонімна функція, трохи побивши тривіальний імпорт.

scanr(\_->init)=<<id

Спробуйте в Інтернеті!

  • Використовується =<<для абревіатури (scanr(\_->init)=<<id) l = scanr(\_->init) l l.
  • Сканує список lсправа наліво, збираючи проміжні результати за допомогою функції \_->init.
  • Ця функція ігнорує проскановані елементи (вони використовуються лише для отримання потрібної загальної довжини для зібраних результатів), тому дійсно повторює застосування initдо початкового значення сканування, яке також є l.

13

мозковий ебать , 21 12 байт

-9 байт завдяки Арнольду запропонував роздільник ÿзамість нових рядків

-[[<]>[.>],]

Спробуйте в Інтернеті!

Бере байти через STDIN без нульових байтів і друкує ряд префіксів, розділених ÿсимволом з провідним ÿсимволом. Наприклад, для входу Prefixesє вихід ÿÿPÿPrÿPreÿPrefÿPrefiÿPrefixÿPrefixeÿPrefixes.

Для зручності для ознайомлення ось версія з новими рядками .

Пояснення:

-              Create a ÿ character in cell 0
 [        ,]   While input, starting with the ÿ
  [<]>           Go to the start of the string
      [.>]       Print the string
          ,      Append the input to the end of the string

1
Це працює лише на реалізаціях BF з 8-бітовими, непідписаними, обертовими осередками.
Dev

11

JavaScript (ES6), 33 байти

a=>[b=[],...a.map(n=>b=[...b,n])]

Спробуйте в Інтернеті!

Як?

+--- a = input array
|
|       +--- initialize b to an empty array and include it as the first entry
|       |    of the output (whatever the input is)
|       |
|       |          +--- for each value n in a[]:
|       |          |
|       |          |        +--- append n to b[] and include this new array in
|       |          |        |    the final output
|       |          |        |
a => [b = [], ...a.map(n => b = [...b, n])]
               |                  |
               +---------+--------+
                         |
      spread syntax: expands all elements of
      the child array within the parent array

уау, це зовсім новий рівень пояснення коду, дивовижна робота: O
Брайан Х.

@BrianH. Дякую! Прості завдання - це гарні можливості написати детальні пояснення, які неможливо викласти у щільніший код.
Арнольд

Ви зробили це вручну? чи ви отримали допомогу від будь-якого дивного програмного забезпечення, про яке я ніколи не чув?
Брайан Х.

2
Просто Блокнот ++ з деяким редагуванням режиму стовпців .
Арнольд

8

CW для всіх тривіальних записів

Чисто , 19 байт

Версія Haskell працює і в Clean.

import StdLib
inits

Спробуйте в Інтернеті!

Хаскелл , 22 байти

import Data.List
inits

Спробуйте в Інтернеті!

Пролог (SWI) , 6 байт

prefix

Спробуйте в Інтернеті!


Так розірвано - підкреслити чи ні. З одного боку, я ціную всі вбудовані рішення в одному місці. З іншого боку, я дуже не люблю вбудовані програми, тому що вони такі основні ...



6

Perl 6 , 13 байт

{(),|[\,] @_}

Спробуйте в Інтернеті!

Пояснити:

У Perl 6 ви можете обернути оператора у квадратні дужки як альтернативний спосіб написання скорочення списку. [+] @arrayповертає суму елементів у @array, [*] @arrayповертає продукт і т. д. Ви також можете передувати оператору зворотним нахилом, щоб зробити "трикутне" зменшення, яке деякі мови називають "сканувати". Отже [\+] @arrayповертається список, що складається з першого елемента @array, потім суми перших двох елементів, потім суми перших трьох елементів тощо.

Ось [\,] @_трикутне зменшення над вхідним масивом @_за допомогою оператора побудови списку ,. Таким чином, він оцінює до списків списків: перший елемент @_, перші два елементи @_і т. Д. Це майже те, що потрібно, але проблема викликає спочатку єдиний порожній список. Отже, першим елементом списку повернень є буквально порожній список (),, тоді зменшення над списком введення згладжується на решту списку повернення |.


2
O_o, що тут навіть відбувається
лише ASCII



5

R , 40 39 байт

function(L)lapply(0:length(L),head,x=L)

Спробуйте в Інтернеті!

-1 байт завдяки digEmAll

Вихід типу R listтрохи дивний; він використовує послідовну індексацію, так, наприклад, вихід для

list(1,2) є

[[1]]                     # first list element
list()

[[2]]                     # second list element
[[2]][[1]]                # first element of second list element
[1] 1


[[3]]                     # third list element
[[3]][[1]]                # first element of third list element
[1] 1

[[3]][[2]]                # etc.
[1] 2

Приймаючи введення як вектор, натомість дає більш акуратний вихідний формат, хоча тоді введення технічно не є list.



@digEmВсі спасибі!
Джузеппе


4

Математика, 22 21 байт

-1 байт дякую Міші Лаврову !

{}~FoldList@Append~#&

Чиста функція. Приймає список як вхідний і повертає список списків як вихідний. Я вважаю, що це найкоротше можливе рішення.


Ми можемо записати те саме рішення, як компактніше {}~FoldList@Append~#&.
Міша Лавров

@MishaLavrov Дякую! Я не думав використовувати подібну форму аргументу 1 + 2.
LegionMammal978



3

PowerShell , 65 байт

param($a)'';$x=,0*($y=$a.count);0..--$y|%{$x[$_]=@($a[0..$_])};$x

Спробуйте в Інтернеті!

PowerShell корисно розгортає списки списків, коли за замовчуванням Write-Outputвідбувається по завершенні програми, тому ви отримуєте один елемент на рядок. Натисніть на a, -join','щоб краще переглянути список списків, перетворивши внутрішні списки в рядки.

(Ab) використовує той факт, що спроба вивести порожній масив (наприклад, @()) не призводить до відсутності виводу, тому порожній вхід масиву просто має ''як вихід, оскільки $a[0..$_]результат не призведе до нічого. Це також викине деякі вражаючі повідомлення про помилки.


Загортання його в парени замість присвоєння економить 20 байт . Якщо ви не вважаєте, що це вважається поверненням списків. Мені завжди було нечітко від цього розрізнення.
Веска

@veskah Так, це майже те, що я мав перед редагуванням цієї версії. Проблема з вашим рішенням або моїм попереднім рішенням - він не повертає список списків. TIO1 - TIO2
AdmBorkBork

3

1
Це якась вуду. ,\(,()),в К4. Приєднання до нульового списку разом із внесеним внеском? як робота?
Стрітер

1
@streetster ()- порожній список. (,()),xпередчуває це x. нарешті ,\ робить конфа-сканування. xопускається , щоб сформувати композицію. зауважте, що трейлінг ,є діадичним, тому це "конкомат", а не "зарахування".
ngn

1
@streetster в k4 це може бути байт коротше: 1_',\0,але мій аналізатор недостатньо розумний, щоб впоратися з цим ...
ngn

3

Лист звичайний , 39 байт

(defun f(l)`(,@(if l(f(butlast l))),l))

Спробуйте в Інтернеті!

Пояснення

(defun f(l)                           )  ; Define a function f
           `(                        )   ; With the list (essentially capable of interpolation), containing:
             ,@                          ;     The value of, flattened to one level
               (if l              )      ;         If l is not the empty list (which is the representation of nil, i.e. the only falsy value)
                    (f(butlast l))       ;         Recurse with all of l but the tail
                                   ,l    ;     The value of l

3

F #, 53 байти

Насправді я отримав два досить подібних відповіді на це, обидві однакової довжини. Вони обидва приймають загальну послідовність sяк параметр.

Перше рішення:

let i s=Seq.init(Seq.length s+1)(fun n->Seq.take n s)

Спробуйте в Інтернеті!

Seq.takeприймає перші nелементи послідовності. Seq.initстворює нову послідовність з підрахунком (в даному випадку) довжини послідовності sплюс 1, і для кожного елемента в послідовності приймаються перші nелементи в s.

Друге рішення:

let i s=Seq.map(fun n->Seq.take n s){0..Seq.length s}

Як і раніше, за винятком того, що він створює послідовність від 0 до довжини s. Потім бере цю кількість елементів з s.

Спробуйте це і в Інтернеті!


fun s->Seq.map(fun n->Seq.take n s){0..Seq.length s} економить 1 байт
втілення невігластва

3

MATL, 15 12 байт

3 байти збережено завдяки @Giuseppe

vin:"G@:)]Xh

Спробуйте в MATL Online .

Через те, що MATL відображає вихід, ви не можете явно бачити порожній масив у масиві комірок. Ось версія, яка показує вихід трохи більш чітко.

Пояснення

v       # Vertically concatenate the (empty) stack to create the array []
i       # Explicitly grab the input
n       # Compute the number of elements in the input (N)
:       # Create an array from [1, ..., N]
"       # Loop through this array
  G     # For each of these numbers, M
  @:    # Create an array from [1, ..., M]
  )     # Use this to index into the initial array
]       # End of the for loop
Xh      # Concatenate the entire stack into a cell array

використовувати vзамість []. І не :використовується 1як перший аргумент за замовчуванням? Тож це може бути vin:"G@:)]Xh12 байт.
Джузеппе

@Giuseppe Дякую! Мій MATL трохи іржавий, здається :(
Suever


2

Вугілля деревне , 6 байт

Eθ…θκθ

Спробуйте в Інтернеті! Посилання на багатослівну версію коду. Пояснення:

 θ      Input array
E       Map over elements
   θ    Input array
  …     Moulded to length
    κ   Current loop index
        Implicitly print each array double-spaced
     θ  Input array
        Implicitly print

Ціною в 1 байт можна попросити вугілля надрукувати n+1масив -елемент, який включає вхід як його останній елемент, але вихід такий же, хоча положення курсору було б іншим, якби потім ви надрукували щось інше.



2

RAD , 7 байт

(⊂⍬),,\

Спробуйте в Інтернеті!

Це також працює в Dyalog APL як функція.

Як?

Це працює однаково як для APL, так і для RAD, враховуючи їх тісний зв’язок.

  • (⊂⍬) порожній масив
  • , претендував на
  • ,\ префікси (які виключають порожній масив.)



2

мозковий ебать , 43 байти

Візьміть список ненульових символів як вхідні дані та поверне всі префікси, розділені новим рядком. Потрібна подвійна нескінченна або обгорткова стрічка.

,>-[+>,]<[-<]<<++++++++++[[<]>[.>]>[-<+>]<]

Спробуйте в Інтернеті!


Ще одна відповідь перевершила мене більш ніж на половину, бо я не думав про друк друку під час читання. Звичайно, цей метод не буде працювати з друком збільшуючих суфіксів.
користувач202729

40 байт з деякою перестановкою
Джо Кінг

2

C # (Visual C # Interactive Compiler) , 39 байт

x=>x.Select((_,i)=>x.Take(i)).Append(x)

Спробуйте в Інтернеті!


Вам потрібно включити використання System.Linq; у свій рахунок. І, схоже, деяка ваша логіка виводу полягає у вашому виведенні масивів. Тому що порожній масив просто повертає порожній масив.
LiefdeWen

@LiefdeWen - я розумію, що оскільки цей інтерпретатор містить посилання на System.Linqмене, я не повинен включати це в кількість байтів. Моє подання вважалося б іншою мовою, ніж скажімо .NET Core. github.com/dotnet/roslyn/wiki/C%23-Interactive-Walkthrough - Ви згадуєте про друк, який є окремим випуском, я хотів би розібратися в цьому першим.
дата

Що стосується друку, то ось версія, яка в основному скидає результат на консоль - tio.run/##XY29CsIwGEX3PEXGBGKhtVt/… - не така вже точно! У мене є питання, коли це прийнятно використовувати Arrayпроти IListпроти IEnumerable.
дата

2

F # (моно) , 45 байт

fun x->List.mapi(fun i y->List.take i x)x@[x]

Спробуйте в Інтернеті!

Я не зовсім впевнений, що це дійсно, але здається, що він відповідає тому самому синтаксису "анонімного лямбда", який я, здається, використовував у кількох інших мовах.


2

Java 8+ , 86 77 байт

-9 байт завдяки Kevin Cruijssen (позбувшись імпорту)!

x->java.util.stream.IntStream.range(0,x.size()+1).mapToObj(t->x.subList(0,t))

Спробуйте в Інтернеті!

Альтернативно, 65 байт

Далі буде надруковано результати stdout (завдяки Олів’є Грегоаре ):

x->{for(int i=0;i<=x.size();)System.out.print(x.subList(0,i++));}

Спробуйте в Інтернеті


Ви можете пограти в гольф до 77 байт, просто скориставшись java.util.stream.IntStreamбезпосередньо та відмовившись від імпорту.
Кевін Кройсейсен

@KevinCruijssen: О, дякую! Я навіть не знав, що це можливо, це, безумовно, корисно (принаймні для цілей гольфу).
ბიმო

x->{for(int i=0;i<=x.size();)System.out.println(x.subList(0,i++));}( 67 байт ). Це друкує замість використання потоків. Друк, як правило, є найкоротшим способом виведення складних структур.
Олів'є Грегоар

@ OlivierGrégoire: У такому випадку ви, мабуть, зможете піти, System.out.printоскільки вихід все одно однозначний.
ბიმო

@BMO Дійсно, це було б можливо!
Олів'є Грегоар


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.