Мистецтво формування слова


21

Мистецтво формування слова

Враховуючи двійкову матрицю та рядок літер, замініть всі 1 в матриці зліва направо на літери рядка. Як тільки літери сформували форму матриці, надрукуйте матрицю, замінивши 0 на пробіли. Напевно, простіше просто навести приклад чи два.


Корпус: Футляр ...

Вхід перший:

[0,0,1,0,0]
[0,1,0,1,0]
[1,0,0,0,1]
[0,1,0,1,0]
[0,0,1,0,0]

"PPCGPPCG"

Вихід перший:

  P    
 P C  
G   P
 P C 
  G  

Випадок: Якщо рядок введення більше, ніж кількість одиниць ...

Вхід другий:

[1,0,0]
[0,1,0]
[1,0,1]

lambda

Вихід другий:

l  
 a 
m b

Випадок: Якщо рядок введення коротший, ніж кількість одиниць ...

Вхід третій:

[1,1,1]
[1,0,1]
[1,1,1]

PPCG

Вихід третій:

PPC
G P
PCG

Доступні припущення

  • Ви можете припустити, що рядок вводу ніколи не порожній.
  • Ви можете припустити, що матриця ніколи не буде порожньою.
  • Ви можете не припускати, що двійкова матриця ніколи не буде всіма нулями.

Правила

  • Якщо рядок коротший, ніж кількість одиниць, повторіть рядок; всі вони повинні бути замінені.
  • Якщо рядок довший кількості одиниць, використовуйте лише те, що потрібно.
  • Ви можете використовувати True / False замість цілих чисел / бітів для введення.
  • Поточні пробіли ПОТРІБНІ, усі нулі повинні бути замінені пробілами.
  • Прийнятний єдиний новий рядок.
  • Це кодовий гольф, виграє найменший байт.

Чи потрібно вводити матрицю як масив чи я можу використовувати багаторядковий рядок?
Тит

@Titus це добре, Мартін Ендер вже зробив.
Чарівний восьминіг Урна

Базовий корпус не зліва направо. Ви маєте на увазі зверху вниз, а потім зліва направо?
edc65

1
Якщо матриця, наприклад, є сіткою нулів 2х2, ми повинні вивести єдиний простір або 2х2 сітку пробілів?
artificialnull

@ pieman2201 очистив тест №4, щоб бути кращим.
Чарівний восьминіг Урна

Відповіді:


3

MATL , 11 байт

yz:)1Gg!(c!

Входи - це числова матриця (з ;роздільником рядків) і рядок.

Спробуйте в Інтернеті! Або перевірити тестові випадки: 1 , 2 , 3 .

y       % Take the two inputs implicitly. Duplicate the first
        % STACK: [1,0,0; 0,1,0; 1,0,1], 'lambda', [1,0,0; 0,1,0; 1,0,1]
z       % Number of nonzeros
        % STACK: [1,0,0; 0,1,0; 1,0,1], 'lambda', 4
:       % Range
        % STACK: [1,0,0; 0,1,0; 1,0,1], 'lambda', [1 2 3 4]
)       % Reference indexing (select values)
        % STACK: [1,0,0; 0,1,0; 1,0,1], 'lamb'
1Gg     % Push first input as a logical matrix; will be used as index
        % STACK: [1,0,0; 0,1,0; 1,0,1], 'lamb', [1,0,0; 0,1,0; 1,0,1]
!       % Transpose. This is necessary because MATL uses column-major order
        % (down, then accross)
(       % Assignment indexing (fill with values). Since the original matrix
        % is numeric, the new values are introduced as their ASCII codes
        % STACK: [108, 0, 109; 0, 97, 0; 1, 0, 98]
c       % Convert to char
        % STACK: ['l m'; ' a '; '  b']
!       % Transpose back. Implicitly display
        % STACK: ['l  '; ' a '; 'm b']

MATL в основному переосмислює те, як я завжди бачив колекції ...
Magic Octopus Urn

@carusocomputing Як ​​і в Matlab, основним типом даних є "прямокутні" масиви: матриці або їх n-мірні аналоги. Вони можуть містити числа, знаки або булеві значення. Є також масиви комірок, які можуть містити довільні речі, як-от списки Python
Луїс Мендо

Найкраща відповідь обрана через 2 тижні відкрито.
Чарівний восьминіг Урна

8

Vim, 44 42 байти

qqy$P0xjf1"_xP{@qq@q:s/0/ /g^M:s/,/^V^M/g^M{D

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

Тут, ^Mбуквально новий рядок, і ^VєCTRL-V

Приймає вхід у такому форматі:

PPCG
00100,01010,10001,01010,00100

Відмова від відповідальності: Якщо рядок довше ~ 40 символів, у Вашого комп'ютера може закінчитися оперативний обмін.

Пояснення:

qq             @qq@q                            # Start recording a recursive macro.
  y$P0x                                         # Duplicate the string and cut out the first character
       jf1"_xP{                                 # Find the first 1, and replace it with the cut character from the string.
                                                # Now we have replaced all the 1's with their respective character, but we still have the array in the original format, and we have the string massivly duplicated at the first line, so we need to clean it up:
                    :s/0/ /g^M                  # Replace all 0's with a space
                              :s/,/^V^M/g^M     # Replace all ,'s with a newline. The ^V acts like a backslash, it escapes the newline so that the command isn't run too soon
                                           {D   # Delete the first line

Ось подарунок від мене "запуск" програми:

Me typing the keys


1
Хахаха, люблю відмову.
Чарівний восьминога Урна

Ви можете використовувати {замість того, ggщоб зняти пару.
DJMcMayhem

Гаразд, gif дійсно акуратний, але ви думаєте, що ви могли б включити його лише за посиланням? Це відстає від мого хрому щоразу, коли я намагаюся прокрутити повз :(
wnnmaw

6

Сітківка , 41 33 байт

0

+1`(.)(.*)(\D+)1
$2$1$3$1
A1`

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

Вхідний рядок задається на першому рядку вводу, а за ним - матриця. Оскільки у Retina немає поняття списків (або насправді нічого, крім рядків), у двійковій матриці немає роздільників, за винятком каналів рядків для окремих рядків.

Пояснення

0

Перетворює нулі в пробіли.

+1`(.)(.*)(\D+)1
$2$1$3$1

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

A1`

Відкиньте перший рядок, тобто рядок введення.



6

JavaScript ES6, 67 53 50 49 байт

Збережено 3 байти завдяки @ETHproductions Збережено ще 1 завдяки @Neil

(a,b,i)=>a.replace(/./g,c=>+c?b[++i]||b[i=0]:' ')

f=
(a,b,i)=>a.replace(/./g,c=>+c?b[++i]||b[i=0]:' ')

G=_=>h.innerHTML = f(`00100
01010
10001
01010
00100`,z.value)
h.innerHTML = G()
<input id=z oninput="G()" value="PPCG"></input>
<pre id=h>

Старий код, перш ніж я знав, що рядкові матриці - це дійсний формат введення:

(a,b)=>a.map(c=>c.map(d=>d?b[i++%b.length]:' ').join``,i=0).join`
`


Я б припустив c=>' '[c]||b[i++%b.length], але, на жаль, це байт довше ...
ETHproductions

1
Однак є ще один спосіб зберегти 3 байти:(a,b,i)=>a.replace(/\d/g,c=>+c?b[++i]||b[i=0]:' ')
ETHproductions

Я думаю, що це розпочнеться з другого символу рядка. Було б непогано оновити фрагмент.
Тит

1
@Titus Спочатку iє undefined, тому ++iповертається NaN. Так як bне має NaNвласності, b[++i]повертається undefined, і ||оператор запускає його правій стороні аргумент, встановивши , iщоб 0і повертає перший символ в b.
ETHproductions

1
Для чого тестуєте \d? Звичайно, .достатньо, оскільки вам доведеться мати справу лише з 0s і 1s ( .не відповідає новим рядкам).
Ніл

5

Perl, 40 байт

36 байт коду + -i -pпрапори.

@F=$^I=~/./g;s/1/$F[$i++%@F]/g;y;0; 

(відзначте остаточний пробіл та відсутність остаточного нового рядка).

Для його запуску введіть рядок введення після -iпрапора та подайте матрицю на вхід:

perl -iPPCGPPCG -pe '@F=$^I=~/./g;s/1/$F[$i++%@F]/g;y;0; ' <<< "00100
01010
10001
01010
00100"

Якщо ваш Perl трохи застарілий, вам може знадобитися додати остаточну крапку з комою (після пробілу).


5

Python 2, 114 71 байт

Виявляється, я знову винайшов колесо, досить непогана подвійна заміна на багаторядковій струні. Рядок має додаткову перевагу: можливість рахувати нулі безпосередньо, а не робити дійсно потворне s*len(L)*len(L[0])для вкладеного списку

lambda S,s:S.replace("0"," ").replace("1","{}").format(*s*S.count('0'))

Старе рішення:

lambda s,L:"\n".join(["".join(map(lambda n:chr(n+32),l)).replace("!","{}")for l in L]).format(*s*len(L)*len(L[0]))

Спочатку ми перетворимо всі + 32 з chr(всі нулі стають простору), то ми замінимо всі з !з , {}щоб з допомогою formatфункції.

Якщо NULLможна вважати пробілом. Якщо я вирішив обдурити і використовувати NULLзамість місця, я можу пропустити додавання 32, щоб зберегти 12 байт. ( printвідображається '\x00'як пробіл)

lambda s,L:"\n".join(["".join(map(chr,l)).replace('\x01','{}')for l in L]).format(*s*len(L)*len(L[0]))

Чи не буде коротше використовувати NULL, а замінити їх пробілом наприкінці?
nedla2004

@ nedla2004, Як ти пропонуєш це зробити? Щойно додавання в .replace('\x00',' ')кінці додає 20 байт
wnnmaw

Але тоді я думаю, ви могли б позбутися цього: map (lambda n: chr (n + 32), l)
nedla2004

Друге рішення працює з NULLs весь час, що заощаджує мені 12 байт, переміщення на пробіли в кінці обійдеться мені дорожче
wnnmaw

Я думав, ти можеш видалити більше, ніж ти насправді можеш.
nedla2004

3

APL, 18 байт

{(⍴⍺)⍴X\⍵⍴⍨+/X←,⍺}

Це функція, яка приймає булеву матрицю як лівий аргумент, а рядок - як її аргумент.

      (↑(1 0 0)(0 1 0)(1 0 1)) {(⍴⍺)⍴X\⍵⍴⍨+/X←,⍺}'lambda'
l  
 a 
m b

Пояснення:

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

  • X←,⍺: вирівняти матрицю і зберегти результат у X.
  • ⍵⍴⍨+/X: переформатуйте вектор символів, щоб він мав необхідну кількість елементів (це також допоможе подовжити рядок шляхом повторення символів, якщо це необхідно).
  • X\: візьміть один із символів для кожного 1та пробіл для кожного 0в X.
  • (⍴⍺)⍴: переформатуйте результат так, щоб він мав форму оригінальної матриці.

3

PHP, 110 91 97 88 82 81 80 75 байт

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

while(""<$c=$argv[1][$i++])echo$c<1?$c?:" ":($s=$argv[2])[$k++%strlen($s)];

Бігайте з -r. Очікує матрицю як багаторядковий рядок у першому аргументі, рядок у другому аргументі.


1
Версія на 80 байт, заснована на вашій версії на 82 байти: foreach(str_split($argv[1])as$c)echo$c<1?$c?:" ":($s=$argv[2])[$k++%strlen($s)];я змінив порядок двох тернарів і, таким чином, скинув дужки з другого, використовуючи, <1а не>0
user59178

1
ви можете зберегти 4 байти, скориставшись for(;""!=$c=$argv[1][$i++];)замістьforeach(...)
user59178

3

PowerShell v2 +, 70 байт

param($a,$b)$b|%{-join($_|%{if($_){$a[$n++];$n%=$a.length}else{' '}})}

Вважає вхідне слово як $aі матрицю як масив масивів як $b(див. Приклади нижче). Петлі наскрізь $b, потім петлі через елементи кожного ряду $_|%{...}. Внутрішній цикл - це if/ elseумова, коли ми або виводимо $a[$n++]і приймаємо mod-рівну довжині рядка, або виводимо пробіл ' '. Вони -joinредагуються назад у рядок. Кожен з рядків залишається на конвеєрі, і неявний вихід з новими рядками між відбувається через Write-Outputпри завершенні програми.

PS C:\Tools\Scripts\golfing> .\the-art-of-word-shaping.ps1 'PPCGPPCG' @(@(0,0,1,0,0),@(0,1,0,1,0),@(1,0,0,0,1),@(0,1,0,1,0),@(0,0,1,0,0))
  P  
 P C 
G   P
 P C 
  G  

PS C:\Tools\Scripts\golfing> .\the-art-of-word-shaping.ps1 'lambda' @(@(1,0,0),@(0,1,0),@(1,0,1))
l  
 a 
m b

PS C:\Tools\Scripts\golfing> .\the-art-of-word-shaping.ps1 'PPCG' @(@(1,1,1),@(1,0,1),@(1,1,1))
PPC
G P
PCG


2

Python 3, 104 (або 83) байт

import itertools as i
def f(s,L):s=i.cycle(s);return'\n'.join(' '.join(next(s)*e for e in l)for l in L)

Існує коротший варіант (83 байти), але він вийде з ладу, якщо рядок в 999 разів коротший, ніж потрібно:

def f(s,L):s=list(s)*999;return'\n'.join(' '.join(s.pop(0)*e for e in l)for l in L)

Друге рішення для мене не працює, тому що ви не можете зателефонувати nextза списком. Якщо ви s=iter(list(s)*999)це зробите, це (89 байт)
L3viathan

1
@ L3viathan вибачте, я мав на увазі, що це буде s.pop(0). Здається, я скопіював неправильну версію, виправив це.
Алісса

s[i++%s.length()]це хороша методологія, хоча пітон не знаю.
Чарівний восьминога Урна

Це було б круто, але немає такого, як i++у Python
Алісса

1

Pyth, 12 байт

jms?R@z~hZ\ 

Спробуйте в Інтернеті: Демонстрація

Пояснення:

jms?R@z~hZ\ dQ   implicit d and Q at the end
                 I use the variable Z, which is initialized with 0 by default
 m           Q   map each line d of the Q (input matrix) to:
   ?R       d       map each number d of the line either to
     @z~hZ             input[Z++] (increase Z, but lookup in input string with old value)
          \            or space
  s                 join chars to a string
j                print each string on a separate line


1

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

(defun m(g w)(let((a 0))(loop for r in g do(loop for e in r do(format t"~[ ~;~c~]"e(char w a))(if(= e 1)(setf a(mod(1+ a)(length w)))))(format t"~%"))))

Використання:

* (m (list (list 1 0 1)
           (list 0 1 0)
           (list 1 0 1)) "ppcg")
p p
 c 
g p

Ця функція проходить через кожен елемент кожного рядка сітки. formatРядок управління або друкує простір , якщо елемент є 0 або споживає аргумент символьного , якщо елемент дорівнює 1. Символ нового рядка друкується після кожного рядка сітки. Якщо рядок занадто короткий, він повторюється з початку; якщо це занадто довго, виводиться лише відповідна частина.


1

Піп , 18 байт

17 байт коду, +1 для -lпрапора.

Yb{a?y@++vs}MMa^s

Масив сприймає як перший аргумент командного рядка таким чином: 100 010 101(потрібно цитувати в оболонках), а рядок - як аргумент другого командного рядка.Спробуйте в Інтернеті!

Пояснення

                   a and b are cmdline args, s is space, v is -1
Yb                 Yank b into global variable y
              a^s  Split a on space into list of rows
  {        }MM     Map this function to the items of the items of a (i.e. each character):
   a               Function argument
    ?              Ternary operator (truthy if 1, falsey if 0)
       ++v         If truthy, increment v...
     y@            ... and use it to index into y (cyclically)
                   I.e.: each time we hit a 1, replace it with the next character of y
          s        If falsey, space
                   The result is a list of lists of characters; -l concats sublists and
                   newline-separates the main list

1

Ява, 237 233 байт

Редагувати: збережено 4 байти завдяки Мукулу Кумару

Гольф:

String T(int[][]m,String b){int l=m.length,a=0;String o="";for(int i=0;i<l;i++){for(int j=0;j<l;j++){if(m[i][j]==1&&a<b.length()){o+=Character.toString(b.toCharArray()[a]);a++;if(a== b.length()-1)a=0;}else o+=" ";}o+="\n";}return o;}

Безголівки:

public String T(int[][] m, String b) {
    int l = m.length,a=0;
    String o = "";
    for(int i = 0; i < l; i++)
    {
        for(int j = 0; j < l; j++)
        {
            if(m[i][j] == 1 && a < b.length())
            {
                o += Character.toString(b.toCharArray()[a]);
                a++;

                if(a == b.length() - 1)
                    a = 0;
            }
            else
             o += " ";
        }
        o += "\n";
    }
    return o;
}

Тестування:

  int[][] matrix = new int[][]
  {{ 0, 0, 1, 0, 0 }, { 0, 1, 0, 1, 0 },
  { 1, 0, 0, 0, 1 },{ 0, 1, 0, 1, 0 },
  { 0, 0, 1, 0, 0 },};
  TheArtOfWordShaping taows = new TheArtOfWordShaping();
  System.out.println(taows.T(matrix, "PPCGPPCG"));

  matrix = new int[][] {{1,0,0}, {0,1,0}, {1,0, 1}};
  taows = new TheArtOfWordShaping();
  System.out.println(taows.T(matrix, "lamda"));

  matrix = new int[][] {{1,1,1},{1,0,1},{1,1, 1}};
  taows = new TheArtOfWordShaping();
  System.out.println(taows.T(matrix, "PPCG"));

  P  
 P C 
G   P
 P C 
  P  

l  
 a 
m d

PPC
P P
CPP

Ви можете оголосити всі int в одному рядку .....
Mukul Kumar

1

Пайк, 12 байт

.FdRIKQoQl%@

Спробуйте тут!

Виводить матрицю символів

Або 9 байт, неконкурентоспроможний.

.FdRIKQo@

Спробуйте тут!

  • Додайте обгортання на індексатори, де індекс, який вимагається, більший, ніж довжина індексуемого. .F - deep_for (введення) I - якщо ^: Qo @ - Q [o ++] dR - else ""

Ще більш неконкурентоспроможний, 8 байт

.FIQo@(P

Спробуйте тут!

  • print_grid тепер правильно вирівняє порожні рядки
  • deep_for тепер відгадує тип на фальсифікатах іншого типу до truthies

Сігналы абмеркавання

.F    (  -  deep_for(input)
 I       -   if ^:
  Qo@    -    input[o++]
       P - pretty_print(^)

1

Java, 122 байти

String g(int[][]a,char[]b){String r="";int e=0;for(int[]c:a){for(int d:c){r+=d==0?' ':b[e++%b.length];}r+='\n';}return r;}

0

Математика, 76 байт

""<>(s=#2;f:=(s=RotateLeft[s];Last[s]);Map[If[#1,f," "]&,#,{2}]~Riffle~"\n")&

Безіменна функція двох аргументів, перший з яких ( #) - це масив Trues і Falses, а другий з яких (s ) - список символів. Функція помічника

f:=(s=RotateLeft[s];Last[s])

визначено, що ставить ходи першого символу s до кінця, а потім повертає цей щойно переміщений символ. fКілька разів зателефонувавши циклічно поверне символівs у порядок.

Основна функція

Map[If[#1,f," "]&,#,{2}]

який закликає fкожногоTrue значення у вхідному масиві і повертає пробіл на кожному помилковому вході. ( {2}РозповідьMap працює над елементами списків компонентів масиву, а не самими списками.)

Ці 60 байт повертають масив символівs та пробілів. Обгортка

    ""<>(...~Riffle~"\n")&

ставить нові рядки між списками кожного масиву, а потім об'єднує все.


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