Стол без границ

16

В этом задании вы собираетесь разместить буквы алфавита в декартовой плоскости и вывести результат в виде текста.

Ваш вход будет представлен в виде списка с 3 параметрами:

  • Координата X
  • Координата Y
  • строка

Как?

Мы знаем, что декартова плоскость содержит 2 оси (X,Y) и 4 квадранта, где знаками координат (X,Y) являются (+,+) , (,+) , (,) и (+,) . Например

Рассмотрим следующую матрицу 3 на 3 как декартову плоскость

(1,1)(0,1)(1,1)(1,0)(0,0)(1,0)(1,1)(0,1)(1,1)

Если нам дают на входе что-то вроде [[-1,1,L],[0,1,F]]нашей матрицы будет выглядеть примерно так

LF(1,1)(1,0)(0,0)(1,0)(1,1)(0,1)(1,1)

И окончательный вывод LF

В дополнение к этому есть некоторые моменты, которым мы должны следовать, чтобы получить правильный вывод:

  • Когда координаты X, Y повторяются, вам нужно объединить строки. Пример: предположим, что в (-1,1) строка Fпомещена, и вам нужно поместить строку aв ту же точку. Вы объединяете обе строки, в результате Faчего получается значение (-1,1).
  • Ваш вывод должен соответствовать матрице. Пример представьте это как ваш конечный результат:

Maряеяs(1,0)сUTе(0,-1)(1,-1)

Вы должны вывести

Ma  rie 
i   s       
cute

Почему?

Вы можете просмотреть это как таблицу, в которой столбцы представляют собой значения оси X, а строки - оси Y.

        Column 1    |   Column 2    |   Column 3
        ----------------------------------------
Row 1   |  "Ma"     |      "r"      |     "ie" 
Row 2   |  "i"      |      "s"      |
Row 3   |  "cute"   |               |

Все значения столбцов должны иметь одинаковую длину

        Column 1    |   Column 2    |   Column 3
        ----------------------------------------
Row 1   |  "Ma  "   |      "r"      |     "ie" 
Row 2   |  "i   "   |      "s"      |
Row 3   |  "cute"   |               |

В финале мы выводим результат

Ma  rie
i   s
cute

Тестовые случаи

Input
------------
[[3, 3, "c"]
[4, 1, "un"]
[5, 3, "e"]
[4, 3, "od"]
[4, 2, "lf"]
[1, 2, "go"]
[2, 1, "i"]
[2, 1, "s f"]]

Output
--------------
      code
go     lf 
  is f un

Input
--------------
[[0, 0, 's'],
[-1,1, 'M'],
[0, 1, 'r'],
[-1,1, 'a'],
[1, 1, 'i'],
[-1, 0, 'i'],
[1, 1, 'e'],
[-1,- 1, 'c'],
[-1,- 1, 'u'],
[-1, -1, 'te']]

Output.
----------------
Ma  rie
i   s
cute

Примечания

  • Это должно быть
  • Вы можете обернуть координаты в один список, например [[3, 3], "c"]
  • Вы можете принять вход в любом разумном формате
  • Вы можете предположить, что не будет никакого числа или пустых мест только во входных данных. Например, может быть что-то вроде, a aно никогда 1или " "или 1aили1 1
Луис Фелипе Де Иисус Муньос
источник
песочница
Луис Фелипе Де Иисус Муньос
1
@KevinCruijssen Вы можете предположить, что не будет никакого числа или пустых мест только во входных данных. Там может быть что-то вроде, a aно никогда 1или `` или 1aили1 1
Луис Фелипе Де Иисус Муньос
1
@LuisfelipeDejesusMunoz Спасибо. О, и еще один вопрос, я уверен, что больше людей здесь хотели бы знать: кто такая Мари? ; p
Кевин Круйссен
2
@KevinCruijssen Моя любовь 5 лет назад: c
Луис Фелипе Де Иисус Муньос
1
Можем ли мы принять входные данные как список именованных кортежей? Что - то вроде этого: (int a,int b,string c)?
Воплощение Невежества

Ответы:

8

JavaScript (ES8),  186 180  179 байт

Сохранено 1 байт благодаря @Shaggy

a=>(g=d=>a.some(([x,y,s])=>(w[x+=d]>(l=((r=o[y=d-y]=o[y]||[])[x]=[r[x]]+s).length)||(w[x]=l),x|y)<0,w=[o=[]])?g(-~d):o.map(r=>w.map((w,x)=>(r[x]||'').padEnd(w)).join``).join`
`)``

Попробуйте онлайн!

Отрицательные показатели в JS (или их отсутствие)

Учитывая массив A[], в JS совершенно законно делать что-то подобное A[-1] = 5. Однако это не сохранит значение в самом массиве. Вместо этого он неявно приведет этот отрицательный индекс к строке ( "-1") и установит соответствующее свойство в окружающем объекте массива.

Плохая новость заключается в том, что свойства не могут быть повторяемы с помощью таких методов, как map():

a = [];
a[1] = 3;
a[-1] = 5;
a.map((v, i) => console.log(v + ' is stored at index ' + i))

Попробуйте онлайн!

Приведенный выше код будет отображаться только 3 is stored at index 1.

Возможный обходной путь будет:

a = [];
a[1] = 3;
a[-1] = 5;
Object.keys(a).map(k => console.log(a[k] + ' is stored with key ' + k))

Попробуйте онлайн!

Но:

  • Это не очень удобно для гольфа.
  • Ключи не отсортированы по порядку номеров.

Что мы здесь делаем

Мы определенно хотим работать с положительными ценностями обоих Икс и Y во избежание проблем, описанных выше.

Мы могли бы сделать первый проход данных, ища минимальное значение Икс и минимальное значение Y, Но это было бы довольно долго.

Вот что мы делаем вместо этого:

  • мы начнем с dзнак равно0
  • мы обрабатываем итерацию, где Икс заменяется на Икс+d и Y заменяется на d-Y
  • если мы имеем Икс<0 или Y<0 для любой записи мы прерываем и рекурсивно начинаем другую попытку с d+1
Arnauld
источник
Я думаю , что вы можете сохранить байты, объявляя oв w: w=[o=[]].
Лохматый
@ Шэгги Я думаю, это действительно безопасно. Благодарю. :)
Арно
5

APL (Dyalog Unicode) , 39 байтов SBCS

Анонимный инфикс лямбда, принимающий * списки координат и строк в качестве левого и правого аргументов.

{⊃,/↑¨↓⌽m⊣m[c],←⍵⊣m←(⊃⌈/c1+⍺-⌊/⍺)⍴⊂''}

Попробуйте онлайн!

{} "Дфн"; Аргументы left (координаты) и right (строки) и :

⊂'' вложенная пустая строка, поэтому используйте в качестве заполнения для массива

(... )⍴ циклический г eshape в массив из следующих размеров:

  ⌊/⍺ наименьшее значение по каждой оси координат

  ⍺- вычесть это из всех координат

  1+ добавьте это к одному (так как мы хотим инклюзивный диапазон)

  c← хранить в c(для гр oordinates)

  ⌈/ самое высокое значение вдоль каждой оси из этих

   распаковать для использования в качестве размеров

m← хранить в m(для м атрикс)

⍵⊣ откажитесь, что в пользу строк

m[c],← добавить их к mкоординатамc

m⊣ отменить те в пользу измененного m

 зеркало

 разбить на список списков строк

↑¨ смешать каждый список строк в матрицу символов, добавив пробелы

,/ уменьшить путем горизонтальной конкатенации

 распаковать (так как сокращение снижает рейтинг с 1 до 0)


* Если требуется взять один аргумент из переплетенных координат и строк, он будет на 5 байт длиннее.

Адам
источник
4

05AB1E , 45 44 байта

WsàŸãεUõIvyнXQiyθ«]IZsß->ôεíDéθgjí}øRJʒðKĀ}»

Принимает входные координаты как внутренний список.

Попробуйте онлайн или проверьте все контрольные примеры .

Объяснение:

Wsà           # Get the minimum and maximum of the (implicit) input-list
   Ÿ          # Create a list in the range [min, max]
    ã         # Create each possible pair by taking the cartesian product with itself
ε             # Map each coordinate to:
 U            #  Pop and store the coordinate in variable `X`
 õ            #  Push an empty string ""
  Iv          #  Loop `y` over the input-items:
    yн        #   Get the coordinates of item `y`
      XQi     #   If it's equal to variable `X`:
         yθ   #    Get the string of item `y`
           «  #    Concat it to the (non-)empty string
]             # Close the if-statement, loop, and map
 IZsß         # Get the maximum and minimum of the input-list
     -        # Subtract them from each other
      >       # And increase it by 1
       ô      # Split the list into parts of this size
ε             # Map each part to:
 í            #  Reverse each inner string
  Déθg        #  Get the length of the longest inner string
      j       #  Prepend spaces to each item up to that length
       í      #  And reverse every item back again
              #  (so the spaces are trailing instead of leading)
            # After the map: zip/transpose; swapping rows/columns
  R           # Reverse the entire list
   J          # Join each inner list together to a single string
ʒðKĀ}         # Remove all strings consisting only of spaces
     »        # Join the strings by newlines (and output implicitly)
Кевин Круйссен
источник
3

Древесный уголь , 60 байт

≔Eθ§ι¹η≔Eθ§ι⁰ζF…·⌊ζ⌈ζ«≔E…·⌊η⌈η⭆θ⎇∧⁼ι§μ⁰⁼κ§μ¹§μ²ωε⮌εM⌈EεLκ±Lε

Попробуйте онлайн! Ссылка на подробную версию кода. Объяснение:

≔Eθ§ι¹η≔Eθ§ι⁰ζ

Извлеките координаты из ввода.

F…·⌊ζ⌈ζ«

Цикл по координатам х.

≔E…·⌊η⌈η⭆θ⎇∧⁼ι§μ⁰⁼κ§μ¹§μ²ωε

Зацикливание по y-координатам, извлечение и объединение всех строк по заданным координатам.

⮌ε

Напечатайте строки в обратном порядке, когда координаты y перевернуты по сравнению с системой координат Charcoal.

M⌈EεLκ±Lε

Перейти к началу следующего столбца.

Нил
источник
3

Perl 5 -p00 -MList::Util=max, 148 байт

s/(\S+) (\S+) (.*)
/$a{$1}=max$a{$1},length($h{$2}{$1}.=$3);''/ge;for$y(sort{$b-$a}keys%h){map{printf"%-$a{$_}s",$h{$y}{$_}}sort{$a-$b}keys%a;say""}

TIO

Как

  • s/(\S+) (\S+) (.*) /... ;''/ge;, флаги подстановки, /gцикл /eeval, замена заменяет пустую переменную ввода / переменная по умолчанию
  • $a{$1}=max$a{$1},length($h{$2}{$1}.=$3), автоматически оживляет карту% h карты, чей первый уровень задает yвторой уровень xи объединяет строку $3со значением, получает длину и автоматически оживляет вторую карту% a, ключи которой xи значение max длины по столбцу ( x)
  • for$y(sort{$b-$a}keys%h){... ;say""}, для индексов строк $yв ключах, %hотсортированных по нумерации, say""в конце выведите новую строку
  • map{... }sort{$a-$b}keys%a, для индекса столбца $_в ключах% a, отсортированных численно
  • printf"%-$a{$_}s",$h{$y}{$_}, вывести строку, выровненную влево по ширине столбца
Науэль Фуйе
источник
3

Чисто , 212 206 байт

import StdEnv,StdLib
? =minList
m=maxList
c=flatten
$a#(x,y,z)=unzip3 a
=flatlines(map c(transpose[[ljustify(m(map length l))k\\l<-[reverse[c[s\\(u,v,s)<-a|u==i&&v==j]\\j<-[?y..m y]]],k<-l]\\i<-[?x..m x]]))

Попробуйте онлайн!

Οurous
источник