Искусство Формирования Слова


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 вместо целых чисел / битов для ввода.
  • ТРЕБУЮТСЯ пробелы, все нули должны быть заменены пробелами.
  • Один завершающий перевод строки является приемлемым.
  • Это код-гольф, выигрывает меньшее количество байт.

Должна ли матрица вводиться как массив или я могу использовать многострочную строку?
Титус

@ Титус в порядке, Мартин Эндер уже сделал.
Волшебная Осьминог Урна

Базовый случай не слева направо. Вы имеете в виду сверху вниз, затем слева направо?
edc65

1
Если матрица представляет собой, например, сетку нулей 2x2, мы должны вывести один пробел или сетку пробелов 2x2?
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 в основном переопределяет, как я всегда видел коллекции ...
Волшебная Осьминога Урна

@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

Вот гифка "запуска" программы ":

Я печатаю ключи


1
Хахаха, люблю отказ от ответственности.
Волшебная Осьминог Урна

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

Хорошо, GIF действительно аккуратный, но вы думаете, вы могли бы включить его только по ссылке? Это отстает от моего хрома каждый раз, когда я пытаюсь прокрутить мимо :(
wnnmaw

6

Retina , 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 и заменить их пробелом в конце?
Недла2004

@ nedla2004, как ты предлагаешь мне это делать? Просто добавление .replace('\x00',' ')в конце добавляет 20 байтов
wnnmaw

Но тогда я думаю, что вы могли бы избавиться от этого: map (лямбда-н: chr (n + 32), l)
nedla2004

Второе решение работает со значениями NULL все время, что экономит мне 12 байт, а переключение на пробелы в конце обойдется мне дороже
wnnmaw

Я думал, что вы можете удалить больше, чем на самом деле.
Недла2004

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()]хорошая методология, хотя я не знаю Python.
Волшебная Урна Осьминога

Было бы круто, но 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

Common Lisp, 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 байта благодаря Мукул Кумар

Golfed:

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

Ungolfed:

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 - if ^: Qo @ - Q [o ++] dR - еще ""

Еще более неконкурентоспособен, 8 байт

.FIQo@(P

Попробуй это здесь!

  • print_grid теперь выравнивает пустые строки правильно
  • deep_for теперь делает угадайку на ложностях, отличных от истинных

.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

Mathematica, 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.