Завершить симметричную карту

12

Вам дают четверть карты, которая симметрична по осям X и Y в качестве входных данных. Программа должна распечатать полную карту.

Карта может содержать следующие символы:, -+/\|.и они должны быть повернуты, как и ожидалось. Данные всегда прямоугольные и маленькие.

пример

$ cat in
+---
|./.
|/..

$ ./solution < in
+------+
|./..\.|
|/....\|
|\..../|
|.\../.|
+------+

Самый короткий код выигрывает.


источник
Что именно малый означает для входных данных? Это немного неопределенно для количественной оценки.
Джои
@Joey Скажем, ввод не более 16 строк и 40 символов.
Я понял, что не ставлю ограничения по времени, но если кому-то нужно больше секунды для его решения, я бы очень хотел это увидеть.

Ответы:

1

Golfscript - 32 символа

n%{{.-1%{.3%2=115*^}%+}%zip}2*n*

Из-за симметрии задачи мы повторяем дважды {перевернуть горизонтально, транспонировать ( zip)}. В качестве бонуса вы можете изменить значение 2на большее число, чтобы повторить изображение больше.

Транспонирование символов выполняется как x^=155 if x%3==2, из-за ограниченного пространства символов. Там тоже {.5^3%(45+}на той же длине.

Nabb
источник
3

Холст , 5 4 байта

║Q↷↷

Первый ответ Canvas, так что давайте начнем с простого. :)

-1 байт благодаря @dzaima .

Косые черты автоматически преобразуются при отражении или вращении в Canvas.
Может быть 1 байт ( попробуйте онлайн ), но, к сожалению, он также преобразует точки .в одинарные кавычки 'при зеркальном отражении по горизонтали.

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

Объяснение:

         # (Take the multi-line input implicitly as canvas object)
        # Palindromize the canvas object (without overlap)
       # Output it with a trailing newline (without popping)
  ↷↷    # Rotated the canvas object that's still on the stack by 90 degrees twice
         # (and output it implicitly as well at the end)
Кевин Круйссен
источник
2

Windows PowerShell, 99 103 117 126 129

filter x{$_-split'/'-replace'\\','/'-join'\'}$input|%{$_+-join($_[40..0]|x)}|%{$_
$s=,($_|x)+$s}
$s

Примечания:

  • К сожалению, для этого нужны две вещи, в которых PowerShell общеизвестно плох при игре в гольф: реверсирование строки (или последовательности значений) и транслитерация материала в строке. Я вполне уверен, что это как минимум вдвое больше, чем решение Perl of Ruby.

Тестовое задание:

> gc in| .\map.ps1
+------+
|./..\.|
|/....\|
|\..../|
|.\../.|
+------+

> gc in2
+\/
/\/
> gc in2| .\map.ps1
+\/\/+
/\/\/\
\/\/\/
+/\/\+

история

  • 2011-02-09 11:10 (129) - Первая попытка.
  • 2011-02-09 11:27 (126) - OFSсохранить -joinи сохранить 99..0в переменной.
  • 2011-02-09 11:31 (117) - -replaceработает против массивов, так что не нужно три -replaceсек , но может сделать -split, -replace, -joinвместо этого.
  • 2011-02-09 15:03 (105) - Вместо того, чтобы делать одно и то же дважды, сделайте это один раз и переверните. И помещение присваивания в скобки заставляет его выплевывать значение в конвейер :-)
  • 2011-02-09 15:08 (103) - Мне больше не нужно $a, так как 99..0сейчас он не используется так часто.
  • 2011-02-09 15:17 (99) - После filterопределения не должно быть пробела . Удалил $xи вместо этого собирал каждую строку во время первого запуска в массиве, а затем выводил ее для второй половины.
детеныш
источник
2

Рубин - 88 87 символов

t=->s{s.tr'/\\\\','\\\\/'}
puts a=$<.map{|l|l.chop!+t[l.reverse]}
puts a.reverse.map &t

Тестовый забег

D:\tmp>ruby cg_sym_map.rb < sym_map.in.
+------+
|./..\.|
|/....\|
|\..../|
|.\../.|
+------+
Уайл Э. Койот
источник
1
Хорошо, мне нравится пут-задание.
Ах, вот и моя кончина ;-) Я знал, что это произойдет в конце концов
Джои
2

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

S‖M⌈

-1 байт благодаря @Neil .

Древесный уголь автоматически справляется с отражением косой черты.

Попробуйте онлайн (многословно) или Попробуйте онлайн (чисто) .

Объяснение:

Возьмите ввод как строку:

InputString()
S

Отразите зеркало как вправо, так и вниз ( :⌈встроено для :Right, :Down):

ReflectMirror(:⌈)
‖M⌈
Кевин Круйссен
источник
С тех пор @ ASCII-only добавлено еще несколько разнонаправленных каналов, в том числе дает вам право и вниз в одном байте.
Нил
@Neil Как вы используете в подробном коде? :RightDownконечно не будет результатом, которого мы хотели бы.
Кевин Круйссен
Разнонаправленные просто берут :префикс в режиме Verbose.
Нил
@Neil Так :Right:Down, или ::RightDown, или что-то еще? Однако ни один из этих двух результатов не будет представлен в закодированной версии с -vlаргументом. Что должен получить подробный код S‖M⌈при использовании -vlarg?
Кевин Круйссен
ReflectMirror(:⌈)
Нил
1

Perl, 80 символов

print reverse map{s@.*@($b=$&)=~y:/\\:\\/:,$&.reverse$b@e;print;y@/\\@\\/@;$_}<>
ninjalj
источник
1

Сценарии оболочки!

#!/bin/sh

rm temp
touch temp
file=$1
for STRING in `cat $1`
do
   printf $STRING >> temp
   for ((COUNT=0; COUNT<${#STRING}; COUNT++))
   do
      RECORD[$COUNT]=${STRING:$COUNT:1}
   done
   for ((REV_COUNT=${#STRING}; REV_COUNT>=0; REV_COUNT--))
      do
        if [ "${RECORD[$REV_COUNT]}" = "\\" ]; then
            printf "/" >> temp
        elif [ "${RECORD[$REV_COUNT]}" = "/" ]; then
            printf "\\" >> temp
        else
           printf "${RECORD[$REV_COUNT]}" >> temp
        fi
      done
   echo >> temp
done
cat temp
tac temp > temp2
for STRING in `cat temp2`
do
   for ((COUNT=0; COUNT<${#STRING}; COUNT++))
   do
      RECORD[$COUNT]=${STRING:$COUNT:1}
   if [ "${RECORD[$COUNT]}" = "\\" ]; then
            printf "/"
   elif [ "${RECORD[$COUNT]}" = "/" ]; then
            printf "\\"
   else
           printf "${RECORD[$COUNT]}"
   fi
   done
echo
done

I / O

./solution in

+------+
|./..\.|
|/....\|
|\..../|
|.\../.|
+------+
Аман ЗееК Верма
источник
1

CJam, 26 байтов

CJam новее этой задачи, поэтому этот ответ не имеет права на зеленую галочку, но в любом случае это было забавное упражнение

qN/{{_W%"\/"_W%er+}%z}2*N*

Проверьте это здесь.

объяснение

qN/{{_W%"\/"_W%er+}%z}2*N*
qN/                        "Read STDIN and split on newlines.";
   {                 }2*   "Execute this block twice.";
    {             }%       "Map this block onto each line.";
     _W%                   "Duplicate and reverse.";
        "\/"               "Push the string '\/'.";
            _W%            "Duplicate and reverse.";
               er          "Character transliteration, swaps slashes and backslashes.";
                 +         "Append to first half of the line.";
                    z      "Zip, i.e. transpose the map.";
                        N* "Join with newlines.";

Транспонирование в конце приводит ко второму переключению вдоль столбцов. В конце мы снова транспонируем карту и получаем исходную ориентацию.

Мартин Эндер
источник
1

Powershell, 95 байт

Вдохновленный ответом Джои .

filter x{$_;$_[40..0]|%{$_-split'/'-replace'\\','/'-join'\'}},($args|%{-join(,($_|% t*y)|x)})|x

Примечание: 40потому что автор публикует комментарий Let's say the input is at most 16 rows and 40 characters.

Тестовый скрипт:

$f = {

filter x{$_;$_[40..0]|%{$_-split'/'-replace'\\','/'-join'\'}}
,($args|%{-join(,($_|% t*y)|x)})|x

}

@(
    ,( ("+---",
        "|./.",
        "|/.."),
        "+------+",
        "|./..\.|",
        "|/....\|",
        "|\..../|",
        "|.\../.|",
        "+------+")
    ,( ("+\/",
        "/\/"),
        "+\/\/+",
        "/\/\/\",
        "\/\/\/",
        "+/\/\+")
    ,( ("+---",
        "|...",
        "|..\"),
        "+------+",
        "|......|",
        "|..\/..|",
        "|../\..|",
        "|......|",
        "+------+")
) | % {
    $m,$expected = $_
    $result = &$f @m
    "$result"-eq"$expected"
    $result
}

Выход:

True
+------+
|./..\.|
|/....\|
|\..../|
|.\../.|
+------+
True
+\/\/+
/\/\/\
\/\/\/
+/\/\+
True
+------+
|......|
|..\/..|
|../\..|
|......|
+------+
Mazzy
источник
0

Рубин - 105

t=->s{s.tr '/\\\\','\\\\/'}
$<.read.split.map{|l|print l+=t[l.reverse]+"
"
l}.reverse.map{|l|print t[l]}
Арно Ле Блан
источник
0

Golfscript - 44 символа

n%{.-1%'/'/{'\\'/'/'*}%'\\'*+}%.-1%{-1%}%+n*

результат

$ cat in2
+-/|/\
/\|//-
$ cat in2 | golfscript codegolf-761.gs 
+-/|/\/\|\-+
/\|//--\\|/\
\/|\\--//|\/
+-\|\/\/|/-+

Еще один скрипт, который работает только для примера и не переворачивает '\' - 32 символа

n%{.-1%'/'/'\\'*+}%.-1%{-1%}%+n*

результат

$ cat in
+---
|./.
|/..
$ cat in | golfscript codegolf-761.gs 
+------+
|./..\.|
|/....\|
|\..../|
|.\../.|
+------+
$ 
ВЫ
источник
`\` также нужно перевернуть.
Наб
@Nabb, спасибо, это сделало мой код огромным: P
ВЫ
Mark: используйте переменные для повторяющихся строк, если это делает их короче. Хотя есть несколько других хитростей, которые вы можете попытаться выяснить, прежде чем я опубликую свой ответ позже.
Наб
@Nabb, спасибо, постараюсь разобраться и дать мне 30 минут: D
ВЫ
@ Набб, я все еще не могу понять, ты можешь опубликовать свой.
ВЫ
0

Haskell , 76 байт

c '/'='\\';c '\\'='/';c x=x;i=(c<$>)
q#x=x++q(reverse x)
f=((i<$>)#).map(i#)

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

-- Only / and \ get converted, all other chars are passed as is
c '/'='\\';c '\\'='/';c x=x

-- "Invert" the string (that is switch all / and \ in it)
-- Just map our conversion function over the string
i = (c<$>)

-- Helper: Concatenate a list with its reversed copy (with the given function applied to the copy)
q # x = x ++ q (reverse x)

-- the resulting function:
f = ((i<$>)#) . -- produce the lower half of the image by reversing the upper half and inverting slashes in each line
    map (i#) -- produce the upper half or the image (by concating each input line with its reversed, inverted version)
Макс ехлаков
источник
0

MS-SQL 2017, 243 байта

вход :

ОБЪЯВИТЬ @s VARCHAR (100) = '+ ---' + CHAR (10) + '| ...' + CHAR (10) + '| .. \';

сжатый :

объявить @t TABLE (l INT IDENTITY (1,1), s CHAR (40)); INSERT INTO @t (s) ВЫБРАТЬ значение + TRANSLATE (REVERSE (значение), '\ /', '/ \') FROM STRING_SPLIT (@ s, char (10)); ВЫБРАТЬ s ИЗ (ВЫБРАТЬ l, s ИЗ @t СОЮЗА ВСЕ ВЫБРАТЬ 1e3-l, ПЕРЕВОДИТЬ (s, '\ /', '/ \') ОТ @t) b ЗАКАЗАТЬ ПО l

человек читаемый :

объявить @t TABLE (l INT IDENTITY (1,1), s CHAR (40));
INSERT INTO @t (s)
  ВЫБЕРИТЕ значение + ПЕРЕВОД (REVERSE (значение), '\ /', '/ \')
  FROM STRING_SPLIT (@ s, char (10));

ВЫБРАТЬ s 
ИЗ(
   ВЫБЕРИТЕ l, s ОТ @t 
   СОЮЗ ВСЕХ 
   ВЫБЕРИТЕ 1e3-l, TRANSLATE (s, '\ /', '/ \') ОТ @t
  ) б 
ЗАКАЗАТЬ ПО Л

вывод (как текст в ex.management studio):

+ ------ +                                
| ...... |                                
| .. \ / .. |                                
| ../ \ .. |                                
| ...... |                                
+ ------ +                                

(Затронуто 6 строк)
Марцин Ф
источник