Перекриття рядків-блоків


22

Виклик:

Давши список багаторядкових рядків, перекрийте їх (у верхньому лівому куті) та виведіть результат.

Приклад:

Вхід: ["aaaa\naaaa\naaaa\naaaa","bb\nbb\nbb","c"]
Вихід:

cbaa
bbaa
bbaa
aaaa

Правила виклику:

  • Формат введення є гнучким. Ви можете отримувати вхід у вигляді двовимірного списку рядків (тобто [["aaaa","aaaa","aaaa","aaaa"],["bb","bb","bb"],["c"]]) або 3D-списку символів (тобто [[["a","a","a","a"],["a","a","a","a"],["a","a","a","a"],["a","a","a","a"]],[["b","b"],["b","b"],["b","b"]],[["c"]]]). Ви можете приймати всі входи один за одним через STDIN. І т.д.
  • Формат виводу суворий. Можна вибрати друк або повернути багаторядковий рядок. (Якщо у вашій мові немає жодних рядків, виведення у вигляді двовимірного списку символів дозволено як альтернатива. Але лише якщо у вашій мові немає рядків.)
  • Порядок вхідного списку, безумовно, важливий (але вам дозволяється приймати дані зворотно, якщо ви захочете).
  • Вхідні дані містять лише друкований ASCII в діапазоні Unicode [33,126] ( !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~).
  • Вхідними даними будуть лише прямокутники (тому ніяких дивних фігур). Вихідні дані не потрібні прямокутники.
  • Допускаються проміжки пробілу та одна затримка нового рядка. Провідні пробіли та / або нові рядки немає.

Загальні правила:

  • Це , тому найкоротша відповідь у байтах виграє.
    Не дозволяйте мовам коду-гольфу відштовхувати вас від публікації відповідей з не кодовими гольф-мовами. Спробуйте придумати якомога коротшу відповідь на "будь-яку" мову програмування.
  • Для вашої відповіді застосовуються стандартні правила з правилами вводу / виводу за замовчуванням , тому вам дозволяється використовувати STDIN / STDOUT, функції / метод із відповідними параметрами та повним програмами типу повернення. Твій дзвінок.
  • Лазівки за замовчуванням заборонені.
  • Якщо можливо, додайте посилання з тестом для вашого коду (тобто TIO ).
  • Також настійно рекомендується додавати пояснення до своєї відповіді.

Тестові приклади:

Вхід: ["aaaa\naaaa\naaaa\naaaa","bb\nbb\nbb","c"]
Вихід:

cbaa
bbaa
bbaa
aaaa

Вхід: ["12345\n54321","00\n00\n00\n00","001\n011\n012"]
Вихід:

00145
01121
012
00

Вхід: ["sm\noo\nmr\nee\nt!\nh_\ni_\nn_\ng_","!@#$%^\n&*()_+\nqwerty\nuiopas","this\nis_a\ntest"]
Вихід:

this%^
is_a_+
testty
uiopas
t!
h_
i_
n_
g_

Чи дозволені нові лінійки? Або, конкретніше, чи дозволена довільна кількість нових рядків?
JAD

@JAD Так, чому б ні. Поки решта виводиться без провідних пробілів / нових рядків. Обмеження нових рядків / пробілів насправді не важливо, тому їх можна додатково додавати.
Кевін Кройсейсен

Відповіді:


6

Желе , 3 байти

a/Y

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

Я не використовував Jelly деякий час, але я вважав, що завдання в коментарях було подолано. Дуже безпосередньо використовує логічне та ( a) для виконання операції укладання між кожним елементом входу ( /). Yвикористовується для друку у потрібному форматі.


Ах приємно! Мені досить погано з Jelly tbh. Моє підготовлене рішення було ḷ""/Yзі зворотним списком вводу. Навіть не знав про a..
Кевін Кройсейсен

11

JavaScript (Node.js) , 24 байти

Збережено 2 байти завдяки @Grimy

Передбачається, що повернута рядок друкується на терміналі, який підтримує коди аварійного відтворення ANSI . Містить недрукований символ ESC, який можна уникнути (каламбур не призначений), як \x1Bпоказано нижче.

a=>`\x1B[2J\x1B[H`+a.join`\x1B[H`

Це не працює в TIO, але ви можете спробувати онлайн! щоб побачити вихідний вихід.

Як?

Використовувані послідовності CSI :

  • ED (Стерти на дисплеї):

    ESC[2J

    де 2 означає "очистити весь екран"

  • CUP (положення курсору):

    ESC[H

    що означає "переміщує курсор до рядка n , стовпця m ", де і n і m опущені та неявно встановлені в 1 (лівий верхній кут екрана).

Приклад виведення

output


Якщо припустити термін, сумісний із ECMA-48, ви можете опустити і те, і інше ;. Крім того, я думаю, що це має бути "JavaScript + термінал" або щось подібне, що не конкурує з чистим JavaScript.
Grimmy

@Grimy Дякую! (Для всіх, хто цікавиться, ось специфікація ECMA-48 - але я не знайшов, де згадується, що крапку з комою можна опустити - якщо вона взагалі згадується.)
Arnauld,

1
5.4.2.h кілька смутно сформульований, але цікаві біт: if the last parameter sub-string(s) is empty, the separator preceding it may be omitted. Оскільки є лише дві підрядки, роздільник, що передує останньому підрядку, є єдиним, і його можна опустити.
Grimmy

Я не знаю ANSI, але перший \x1B[H+ необхідний? Чи не за замовчуванням він починається вліво зліва, і його потрібно скидати лише після кожного вводу (що і є тим, що приєднується)? Або він спочатку починається десь за замовчуванням, і ви повинні явно дозволити йому запускатись у цій позиції курсора, щоб він успішно перейшов на цю позицію при з'єднанні?
Кевін Кройсейсен

1
@Arnauld Оскільки ви, ймовірно, завжди будете мати щось інше на терміналі під час виконання цієї функції, я думаю, що початкове скидання потрібно все-таки. Що стосується пропускаючого друку, я думаю, що f=a=>print(`\x1B[H`+a.join`\x1B[H`)з цим результатом f(input_here)буде такий же вихід, як і print(f(input_here))? Тому я не бачу, чому вам не дозволять опустити printі просто повернути рядок.
Кевін Кройсейсен

7

R , 120 , 111 110 107 байт

function(x,`!`=ncol,M=array('',Reduce(pmax,Map(dim,x)))){for(m in x)M[1:!t(m),1:!m]=m
write(t(M),1,!M,,'')}

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

Функція, що приймає список матриць символів (приймається 3D введення).

(як ви можете помітити з кількості байтів, це зробити не дуже просто в R ...)

  • -9 байт завдяки @Giuseppe
  • -4 байти завдяки @RobinRyder

4
Я дійсно очікував 200-байтного рішення! Я дам це приємне щедро, коли це питання стане придатним для баунті
Джузеппе,

@Giuseppe: ще набагато довше інших мов ... :(
digEmAll

2
111 байт, використовуючи arrayзамість matrix!
Джузеппе

@Giuseppe: акуратно!
digEmAll

3
107 з псевдонімом ncol(можна перенести, щоб отримати nrow).
Робін Райдер

5

Python 2 , 88 байт

n,f=None,filter
for l in map(n,*input()):print''.join(f(n,x)[-1]for x in map(n,*f(n,l)))

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


Пояснення (з прикладом):

Бере 2D-список як вхідний.

Input: [["12345","54321"],["00","00","00","00"],["001","011","012"]]

Спочатку список введення зафіксовано, щоб отримати рядки кожного вхідного прямокутника ( map(None,l)той самий zip найдовший):

map(n,*input())   gives:

('12345', '00', '001')
('54321', '00', '011')
(None, '00', '012')
(None, '00', None)

Кожен із цих рядків потім фільтрують до видалених Nones та знову застебнуто:

map(None,*filter(None,l))

filter(None,l) for each l gives:

('12345', '00', '001')
('54321', '00', '011')
('00', '012')
('00',)

map*... gives:

[('1', '0', '0'), ('2', '0', '0'), ('3', None, '1'), ('4', None, None), ('5', None, None)]
[('5', '0', '0'), ('4', '0', '1'), ('3', None, '1'), ('2', None, None), ('1', None, None)]
[('0', '0'), ('0', '1'), (None, '2')]
['0', '0']

Який список символів для кожної позиції бажаного результату. Ці списки фільтруються знову, і останній береться:

filter(None,x)   gives:

[('1', '0', '0'), ('2', '0', '0'), ('3', '1'), ('4',), ('5',)]
[('5', '0', '0'), ('4', '0', '1'), ('3', '1'), ('2',), ('1',)]
[('0', '0'), ('0', '1'), ('2',)]
['0', '0']

and with [-1]:

['0', '0', '1', '4', '5']
['0', '1', '1', '2', '1']
['0', '1', '2']
['0', '0']

Нарешті, отримані списки з'єднуються та друкуються:

print''.join(..)

00145
01121
012
00

RE "Повертає список рядків", у правилах зазначено "Формат виводу є суворим. Ви можете вибрати друк або повернути багаторядковий рядок. 2D або 3D списки, оскільки виходи не дозволені." Повна програма на 88 байтів здається прекрасною
Джонатан Аллан

@JonathanAllan, привіт, я неправильно прочитав суворий вихід (або забув?: P)
TFeld

5

R, 107 97 байт

function(x)for(i in 1:max(lengths(x))){for(m in x)if(i<=length(m))cat(m[i],'\r',sep='');cat('
')}

Не працює на TIO, що може бути пов'язано з використанням \rсимволу повернення каретки. Це працює над моєю локальною установкою Р.

Вводиться як список, що містить вектор рядків:

x <- list(c("aaaa","aaaa","aaaa","aaaa"),c("bb","bb","bb"),c("c"))

Петлі над рядками кожного прямокутника, друкуючи повернення каретки після кожного, перезавантажуючи рядок.

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

R, 85 байт

function(x)for(i in 1:8e8){for(m in x)if(i<=length(m))cat(m[i],'\r',sep='');cat('
')}

106 байт Приємно бачити, як ти тут і там робиш гольф!
Джузеппе

Можливо 97 байт ; незрозуміло, чи справді це працює, оскільки я тестую лише TIO
Джузеппе

@Giuseppe Привіт! Ваша пропозиція працює на мене. Якщо нам дозволено друкувати останні рядки, можливо також просто використовувати довільно великий для циклу, але я думаю, що це підштовхує межі завдання.
JAD

@JAD: чудова ідея використання \r, і ласкаво просимо! Лише зауваження, я думаю, що це працює лише в інтерактивних сесіях R (коли interactive()повертається правда)
digEmAll

@digEmAll Це працює на моїй машині за допомогою rscriptкомандного рядка. Я підозрюю, що це справа Windows / Linux, оскільки Windows використовує \r\nдля нових рядків та Linux \n.
JAD

4

APL (Dyalog Unicode) , 22 байти SBCS

Функція анонімного мовчазного префікса, яка бере аргумент списку 2D-масивів символів. Друкує.

(⊃{⍺@(⍳⍴⍺)⊢⍵}/)⌽,∘⊂1⌷↑

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

Це працює, створюючи полотно, потім додаючи його до списку блоків, і зменшуючи (складаючи) функцію, яка розміщує блоки у кутку.

 змішайте 2D блок, щоб створити ортогональний 3D-блок, обклавши їх пробілами за потребою

1⌷ візьміть перший шар

 додайте, що
 потім
⌽, додає перевернутий список блоків

() Застосувати таку негласну функцію:

{}/ Зменшити, використовуючи таку анонімну лямбда:

  ⊢⍵ з правильним аргументом як полотно…

  ⍺@() Внести зміни до елементів лівого аргументу, розміщених у таких показниках:

   ⍴⍺ форма лівого аргументу

    в ɩ ndices масиву цієї форми

 розкрити (оскільки скорочення додано для зменшення рангу)


4

Haskell, 66 байт

unlines.foldl((const?)?)[]
(g?(a:b))(c:d)=g a c:(g?b)d;(_?a)b=a++b

Введення приймаються у вигляді списку списку рядків в зворотному порядку, наприклад , для першого тесту: [["c"],["bb","bb","bb"],["aaaa","aaaa","aaaa","aaaa"]].

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


3

05AB1E , 12 байт

Порт пітонного розчину TFeld на
2 байти збережений завдяки Grimy

ζεðKζðδK€θJ,

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

Пояснення

ζ             # transpose input with space as filler
 ε            # apply to each
  ðK          # remove spaces
    ζ         # transpose with space as filler
     ðδK      # deep remove spaces
        €θ    # get the tail of each
          J   # join each
           ,  # print

Альтернативна версія 14 байт

õζεÅ»DŠg.$J}θ,

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

Пояснення

õζ              # zip with empty string as filler
  ε             # apply to each
   Å»      }    # cumulative reduce by
     D          # duplicate second input
      Š         # move down twice on stack
       g.$      # remove len(other_copy) elements from the other input
          J     # join with other copy
            θ,  # print the last element

1
О, потрібно пам’ятати, що --no-lazyце виправлення, як все-таки використовувати карту / фільтр з друком для неявного y, щоб зберегти байт порівняно з vy...,:) Я знав, що працював у старій версії, але в новій версії він також виводить [...]. Не знав, що це через відсутність --no-lazy. ;) Що стосується самої відповіді, дуже приємно! Я знав, що необхідне накопичувальне зменшення, але я не міг реально розібратися, коли спробував сам. Зробити це виглядає так просто ..
Кевін Круїссен

Я це згадував у правилах, але забув застосувати його до тестових випадків .., але пробілів у введенні не буде. Тому ви, ймовірно, можете зберегти там кілька байтів, оскільки zip-filler за замовчуванням є пробілом. (Не впевнений, чи збереже це щось у вашій першій відповіді, але в порту це може бути.)
Кевін Круїссен

2
õζεõKможе бути ζεðK, õζõδKможе бути ζðδK.
Grimmy

@Grimy: О так, пробіли більше не можуть бути вхідними. Спасибі!
Емінья



2

PowerShell 6 , лише консоль, 20 байт

на основі відповіді Арнальда . Ця робота лише з консоллю і не працює в TIO.

cls
$args-join"`e[H"

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


PowerShell , 103 байти

$args|%{$l=$_-split'
';$r=&{$r+($l|%{''})|%{($x=$l[$j++])+($_-replace"^.{0,$("$x"|% Le*)}")}|?{$_}}}
$r

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

Розгорнуто:

$args|%{
    $l=$_-split"`n"
    $r=&{                           # run this scriptblock in a new scope
        $r+($l|%{''})|%{
            $x=$l[$j++]             # a new line or $null
            $w="$x"|% Length
            $y=$_-replace"^.{0,$w}" # remove first chars from the current line
            $x+$y                   # output the new line plus tail of the overlapped line
        }|?{$_}                     # filter out not empty lines only
    }                               # close the scope and remove all variables created in the scope
}
$r


1

Рубін , 67 байт

Введення - це список рядків. Складає список рядків і виконує перезапис, коли він проходить через входи, а потім з'єднує їх новим рядком (представленим змінною $/) наприкінці, щоб відповідати суворому виводу.

->i,*r{i.map{|e|j=-1;e.map{|l|r[j+=1]||='';r[j][0,l.size]=l}};r*$/}

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


1

C (GCC, MinGW) 138 байт

Припускається, що CR ставить курсор на початок поточного рядка.

d,i,l;f(S,n,p,t)char**S,*p,*t;{for(d=i=0;i<n;d+=l)p=strchr(t=S[i],10),printf("\n%.*s\r"+!!i,l=p?p-t:strlen(t),t),S[i++]+=l+!!p;d&&f(S,n);}

Тестували:

int main()
{
    char *test1[] = {"aaaa\naaaa\naaaa\naaaa","bb\nbb\nbb","c"};
    char *test2[] = {"12345\n54321","00\n00\n00\n00","001\n011\n012"};
    char *test3[] = {"sm\noo\nmr\nee\nt!\nh_\ni_\nn_\ng_","!@#$%^\n&*()_+\nqwerty\nuiopas","this\nis_a\ntest"};

    f(test1, 3);
    f(test2, 3);
    f(test3, 3);
}


1

Javascript (браузер) , 216 208 204 байт

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

var n='\n',x=s=>s.split``.reverse().join``,i,j,f=a=>a.map(s=>s.split(n).map(y=>x(y))).reduce((a,b)=>{for(i=0;i<b.length;i++){j=a[i];if(!j)j=b[i];a[i]=b[i].padStart(j.length,j)}return a}).map(s=>x(s)).join(n)

У будь-якому випадку, це те, що спочатку розбиває всі рядки, потім обертає всі рядки, а потім циклічно зменшує операцію padStart всі всі рядки разом. Потім поверніть всі рядки знову, а потім з'єднайте їх з новими рядками.

Особлива подяка Кевіну Крейсейну за те, що він нагадав мені, що остання частина циклу for for відбувається в кінці, і загальна економія байтів становить 8 байт.

var n='\n',x=s=>s.split``.reverse().join``,i,j,f=a=>a.map(s=>s.split(n).map(y=>x(y))).reduce((a,b)=>{for(i=0;i<b.length;a[i]=b[i++].padStart(j.length,j))if(!(j=a[i]))j=b[i];return a}).map(s=>x(s)).join(n)

console.log(f(["aaaa\naaaa\naaaa\naaaa","bb\nbb\nbb","c"]));
console.log(f(["12345\n54321","00\n00\n00\n00","001\n011\n012"]));
console.log(f(["sm\noo\nmr\nee\nt!\nh_\ni_\nn_\ng_","!@#$%^\n&*()_+\nqwerty\nuiopas","this\nis_a\ntest"]));


1
Обидва ('')можуть бути двома `, щоб зберегти чотири байти :)
Кевін Круїйсен

1
Крім того , ви можете замінити for(i=0;i<b.length;i++){j=a[i];if(!j)j=b[i];a[i]=b[i].padStart(j.length,j)}з for(i=0;i<b.length;a[i]=b[i++].padStart(j.length,j))if(!(j=a[i]))j=b[i];.
Кевін Кройсейсен

1
jСпочатку присвоюється (j=a[i]), то якщо-заява зроблена з if(!...)j=b[i];(де ...це (j=a[i]), так відновної вартості j), і потім ;a[i]=b[i++].padStart(j.length,j))виконується в кінці ітерації для циклу .. Не знаєте , де проблема, і здається, працює?
Кевін Крейссен

1
ooohhh .... * великі очі * що щось розблокували
Цхаллака

1
До речі, якщо ви їх ще не бачили, поради щодо гольфу на <всіх мовах> та поради щодо гольфу в JavaScript можуть бути цікавими для прочитання. :)
Кевін Круїссен

1

C (gcc) , 51 47 байт

f(char**s){for(;*s;printf("\e[s%s\e[u",*s++));}

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

-4 байти завдяки стельовій коті.

Використовує послідовності CSI для збереження / відновлення позиції курсору. Просто повторює пройдений масив рядків (у тому ж форматі, що і argv) та друкує<save position>string<restore position> для кожного.

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


1

Japt -P , 7 байт

Приймає введення як масив багаторядкових рядків, виводить одну багаторядкову рядок.

ú y_¸¬Ì

Спробуй це

ú y_¸¬Ì     :Implicit input of array
ú           :Right pad each line of each element with spaces to the length of the longest
  y         :Transpose
   _        :Map
    ¸       :  Split on spaces
     ¬      :  Join
      Ì     :  Last character
            :Implicitly join and output

1

T-SQL-запит, 297 295 байт

Використовуючи ¶ як роздільник, а змінну таблиці як вхід.

DECLARE @ table(a varchar(max),k int identity(1,1))
INSERT @ values('aaaa¶aaaa¶aaaa¶aaaa'),('bb¶bv¶bb'),('c');

WITH c as(SELECT k,row_number()over(partition
by k order by k)s,value v FROM @ CROSS APPLY
string_split(a,'¶')s),m(i,l,e)as(SELECT*FROM c
WHERE k=1UNION ALL
SELECT k,s,STUFF(e,1,len(v),v)FROM m
JOIN c ON-~i=k and s=l)SELECT
top 1with ties e FROM m
ORDER BY rank()over(partition by l order by-i)

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


1

Javascript (браузер), 129 124 байт

Моя перша спроба кодування в гольф. Я читаю посилання, наведені в правилах (лазівки, стандартні правила ...), тому сподіваюся, що я зробив щось не так!


Я зберігав дані, як вони є у першій публікації (форма плоского масиву).

_=o=>{o=o.map(i=>i.split`\n`),r=o.shift();for(a of o)for(l in a)b=a[l],r[l]=r[l]?b+r[l].slice(b.length):b;return r.join`\n`}

Дякуємо Кевіну Крейсейну за збереження 5 байт.


Тести:


1
Ласкаво просимо до PPCG! Приємна перша відповідь, +1 від мене. Деякі дрібниці до гольфу: for(a of o){for(l in a){b=a[l],r[l]=(r[l])?b+r[l].slice(b.length):b}}може бути for(a of o)for(l in a)b=a[l],r[l]=r[l]?b+r[l].slice(b.length):b;:)
Кевін Кройсейсен

1
@KevinCruijssen - Дякую, я оновив свій пост! Я прочитав ці два посібники перед публікацією, вони були корисні. Але я, можливо, пропускаю кілька хитрощів, які могли б ще більше покращити мою спробу!
Кевін Біболлет

1
Ще одна річ з мого першого коментаря, який ви пропустили, - це круглі дужки, навколо =(r[l])?яких можна видалити =r[l]?:)
Kevin Cruijssen

1
@ KévinBibollet, це потрібно для того, щоб повернути кінцевий результат r. Без цього результат відображення замість цього буде повернутий.
Кудлатий

1
Якщо ви хочете зберегти формат вводу / виводу, який використовується в тестових випадках, ви все одно можете опуститися до 85 байт, але слід зазначити, що введення / виведення є гнучким.
Кудлатий

1

Піт , 18 байт

L.tb0VyQsme #dy #N

Спробуйте в Інтернеті! (зверніть увагу: сам код оцінює лише один блок, тестовий набір інтерпретатора запускає програму один раз для кожного рядка введення)

На основі рішення Pyfhon 2 TFeld .

Пояснення:

L.tb0         # define a lambda function called y which does a transpose, padding with integer 0's
VyQ           # loop over transposed first input line (Q = eval(input()) ) (loop index = N)
   s          # concatenate array of strings (implicitly printed)
    m         # map over
         y #N # transpose of non-falsy values of N
     e        # for each item: last element of array
       #d     # relevant space at the start! filter with identity function, removes falsy values

для пояснення того, чому сам алгоритм працює, дивіться відповідь TFeld.


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