Закінчіть симетричну карту


12

Вам вводиться одна чверть карти, яка симетрична над осями x і y як вхідні дані. Програма повинна надрукувати повну карту.

Карта може містити такі символи:, -+/\|.і їх слід повернути так, як очікувалося. Дані завжди прямокутні і невеликі.

Приклад

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

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

Найкоротший код виграє.


Що саме означає малий для вхідних даних? Це трохи розпливчасто для кількісної оцінки.
Joey

@Joey Скажімо, що вхід становить не більше 16 рядків і 40 символів.

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

Відповіді:


1

Гольфскрипт - 32 символи

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

Через симетрію задачі повторюємо двічі {переверніть горизонтально, транспоніруйте ( zip)}. Як бонус, ви можете змінити значення 2на більшу кількість, щоб повторити зображення більше.

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


3

Полотно , 5 4 байти

║Q↷↷

Перша відповідь Canvas, тому почнемо з легкої. :)

-1 байт завдяки @dzaima .

Штрихи автоматично перетворюються при дзеркальному відображенні або обертанні в полотні.
Можливо, це був 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 тільки з тих пір додав ще кілька різнонаправлень, в тому числі, що дає вам право і вниз в одному байті.
Ніл

@Neil Як ви користуєтесь кодом Verbose ? :RightDownзвичайно, це не буде результат, який ми хотіли б.
Кевін Кройсейсен

Багатонаправлені просто беруть :префікс у режимі «Докладний».
Ніл

@Neil Отже :Right:Down, чи ::RightDown, чи щось інше? Жоден із цих двох результатів не дасть в кодованій версії -vlаргументу. Яким повинен бути багатослівний код, щоб отримати S‖M⌈при використанні -vlarg?
Kevin Cruijssen

ReflectMirror(:⌈)
Ніл


1

Shell Scripting !!

#!/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
+------+
|......|
|..\/..|
|../\..|
|......|
+------+


0

Гольфскрипт - 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

@Nabb, дякую, що зробив мій код величезним: P
ВАС

Позначити: Використовуйте змінні для повторних рядків, якщо вона робить її коротшою. Хоча є кілька інших хитрощів, які ви можете спробувати розібратися, перш ніж я опублікую свою відповідь пізніше.
Nabb

@Nabb, Спасибі, я спробую розібратися і дати мені 30 хвилин: D
ВАС

@Nabb, я все ще не міг зрозуміти, ви можете опублікувати своє.
ВИ

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)); ВСТАВИТЬ INTO @t (s) SELECT value + TRANSLATE (REVERSE (value), '\ /', '/ \') FROM STRING_SPLIT (@ s, char (10)); ВИБІРІТЬСЯ З (ВИБРАТИ l, s ВІД @t UNION ALL SELECT 1e3-l, TRANSLATE (s, '\ /', '/ \') ВІД @t) b ЗАМОВИТИ l

читабельна для людини :

оголосити @t TABLE (l INT IDENTITY (1,1), s CHAR (40));
ВСТАВИТИ В @ @ (s)
  SELECT значення + TRANSLATE (ПОВЕРНЕННЯ (значення), '\ /', '/ \')
  ВІД STRING_SPLIT (@ s, char (10));

ВИБРАТИ s 
ВІД (
   ВИБІР l, s ВІД @t 
   СОЮЗ ВСІХ 
   ВИБІР 1e3-l, ПЕРЕКЛАД (s, '\ /', '/ \') ВІД @t
  ) б 
ЗАМОВЛЕННЯ l

вихід (як текст у студії ex.management):

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

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