Hoàn thành bản đồ đối xứng


12

Bạn được cung cấp một phần tư bản đồ đối xứng qua các trục x và y làm đầu vào. Chương trình nên in bản đồ hoàn chỉnh.

Bản đồ có thể chứa các ký tự sau : -+/\|., và chúng sẽ được biến như mong đợi. Các dữ liệu luôn luôn là hình chữ nhật và nhỏ.

Thí dụ

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

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

Mã ngắn nhất sẽ thắng.


Chính xác những gì nhỏ có nghĩa là cho dữ liệu đầu vào? Đó là một chút mơ hồ để định lượng.
Joey

@Joey Hãy nói rằng đầu vào có nhiều nhất là 16 hàng và 40 ký tự.

Tôi nhận ra rằng tôi không đặt giới hạn thời gian, nhưng nếu ai đó cần nhiều hơn một giây cho giải pháp của mình, tôi thực sự muốn thấy nó.

Câu trả lời:


1

Golfscript - 32 ký tự

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

Do tính đối xứng của vấn đề, chúng tôi lặp lại hai lần {lật theo chiều ngang, hoán vị ( zip)}. Là một phần thưởng, bạn có thể thay đổi giá trị 2thành một số lớn hơn để lặp lại hình ảnh nhiều hơn.

Chuyển vị ký tự được thực hiện như x^=155 if x%3==2, do không gian ký tự bị hạn chế. Cũng có {.5^3%(45+}cùng chiều dài.


3

Canvas , 5 4 byte

║Q↷↷

Câu trả lời Canvas đầu tiên, vì vậy hãy bắt đầu với một câu hỏi dễ. :)

-1 byte nhờ @dzaima .

Các dấu gạch chéo được tự động chuyển đổi khi phản chiếu hoặc xoay trong Canvas.
Có thể là 1 byte ( Dùng thử trực tuyến ), nhưng thật không may, nó cũng biến đổi các dấu chấm .thành dấu ngoặc đơn 'khi phản chiếu theo chiều ngang.

Hãy thử trực tuyến.

Giải trình:

         # (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

Ghi chú:

  • Thật không may, điều này cần hai điều mà PowerShell nổi tiếng là không tốt trong khi chơi gôn: Đảo ngược một chuỗi (hoặc chuỗi các giá trị) và chuyển ngữ các thứ trong một chuỗi. Tôi khá chắc chắn rằng điều này ít nhất gấp đôi so với giải pháp Perl of Ruby.

Kiểm tra:

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

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

Lịch sử

  • 2011/02/09 11:10 (129) - Nỗ lực đầu tiên.
  • 2011/02/09 11:27 (126) - OFSđể lưu -joinvà lưu 99..0trong một biến.
  • 2011/02/09 11:31 (117) - -replacelàm việc với mảng, vì vậy tôi không cần ba -replaces nhưng có thể làm một -split, -replace, -jointhay thế.
  • 2011/02/09 15:03 (105) - Thay vì làm điều tương tự hai lần, hãy làm một lần và đảo ngược nó. Và đặt một bài tập vào dấu ngoặc đơn làm cho nó nhổ giá trị của nó vào đường ống dẫn :-)
  • 2011/02/09 15:08 (103) - Bây giờ tôi không cần sử dụng $anữa vì 99..0không được sử dụng thường xuyên.
  • 2011/02/09 15:17 (99) - Không cần phải có khoảng trắng sau filterđịnh nghĩa. Đã xóa $xvà thay vào đó thu thập mọi dòng trong lần chạy đầu tiên trong một mảng và sau đó xuất ra dòng đó cho nửa thứ hai.

2

Ruby - 88 87 ký tự

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

Chạy thử nghiệm

D:\tmp>ruby cg_sym_map.rb < sym_map.in.
+------+
|./..\.|
|/....\|
|\..../|
|.\../.|
+------+

1
Đẹp, tôi thích sự phân công.

À, có sự sụp đổ của tôi ;-) Tôi biết cuối cùng nó sẽ đến
Joey


2

Than , 5 4 byte

S‖M⌈

-1 byte nhờ @Neil .

Than tự động xử lý phản ánh các dấu gạch chéo chính xác.

Dùng thử trực tuyến (dài dòng) hoặc Thử trực tuyến (thuần túy) .

Giải trình:

Lấy đầu vào dưới dạng chuỗi:

InputString()
S

Phản chiếu gương cả về phía bên phải và xuống dưới ( :⌈là một nội dung cho :Right, :Down):

ReflectMirror(:⌈)
‖M⌈

@ ASCII-only kể từ đó đã thêm một số đa hướng bao gồm cả cung cấp cho bạn quyền và xuống trong một byte đơn.
Neil

@Neil Bạn sử dụng mã Verbose như thế nào? :RightDowntất nhiên sẽ không phải là kết quả mà chúng ta muốn
Kevin Cruijssen

Đa hướng chỉ cần một :tiền tố trong chế độ Verbose.
Neil

@Neil Vậy :Right:Down, ::RightDownhay cái gì khác? Cả hai kết quả này sẽ không đưa ra một phiên bản được mã hóa với -vlđối số. Mã verbose sẽ phải trở thành gì S‖M⌈khi sử dụng -vlarg?
Kevin Cruijssen

ReflectMirror(:⌈)
Neil

1

Perl, 80 ký tự

print reverse map{s@.*@($b=$&)=~y:/\\:\\/:,$&.reverse$b@e;print;y@/\\@\\/@;$_}<>

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

Tôi / O

./solution in

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

1

CJam, 26 byte

CJam mới hơn thử thách này, vì vậy câu trả lời này không đủ điều kiện cho dấu kiểm màu xanh lá cây, nhưng dù sao đó cũng là một bài tập thú vị

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

Kiểm tra nó ở đây.

Giải trình

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.";

Sự hoán vị ở cuối dẫn đến lần lật thứ hai được thực hiện dọc theo các cột. Cuối cùng, chúng tôi chuyển đổi bản đồ một lần nữa, vì vậy chúng tôi kết thúc với định hướng ban đầu.


1

Powershell, 95 byte

Lấy cảm hứng từ câu trả lời của Joey .

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

Lưu ý: 40bởi vì tác giả đăng bình luậnLet's say the input is at most 16 rows and 40 characters .

Kịch bản thử nghiệm:

$f = {

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

}

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

Đầu ra:

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

0

Hồng ngọc - 105

t=->s{s.tr '/\\\\','\\\\/'}
$<.read.split.map{|l|print l+=t[l.reverse]+"
"
l}.reverse.map{|l|print t[l]}

0

Golfscript - 44 ký tự

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

kết quả

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

Một tập lệnh khác chỉ hoạt động chẳng hạn và không lật cho '\' - 32 ký tự

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

kết quả

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

`\` cũng cần phải được lật.
Nabb

@Nabb, cảm ơn, điều đó làm cho mã của tôi rất lớn: P
BẠN

Đánh dấu: Sử dụng các biến cho các chuỗi lặp lại nếu nó làm cho nó ngắn hơn. Mặc dù có một vài thủ thuật khác mà bạn có thể cố gắng tìm ra trước khi tôi đăng câu trả lời của mình sau.
Nabb

@Nabb, Cảm ơn, tôi sẽ cố gắng tìm ra và để tôi có 30 phút: D
BẠN

@Nabb, tôi vẫn không thể hiểu, bạn có thể đăng bài của bạn.
BẠN

0

Haskell , 76 byte

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

Hãy thử trực tuyến!

-- 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 byte

đầu vào :

DECLARE @s VARCHAR (100) = '+ ---' + CHAR (10) + '| ...' + CHAR (10) + '| .. \';

nén :

khai báo @t TABLE (l INT IDENTITY (1,1), s CHAR (40)); INSERT INTO @t (s) CHỌN giá trị + TRANSLATE (REVERSE (value), '\ /', '/ \') TỪ CHUINGI (@ s, char (10)); CHỌN TỪ (CHỌN l, s TỪ @t ĐOÀN TẤT CẢ CHỌN 1e3-l, TRANSLATE (s, '\ /', '/ \') TỪ @t) b ĐẶT HÀNG B l

con người có thể đọc được :

khai báo @t BẢNG (l INT IDENTITY (1,1), s CHAR (40));
XÁC NHẬN VÀO @t (s)
  Giá trị CHỌN + CHUYỂN (REVERSE (giá trị), '\ /', '/ \')
  TỪ STRINGinksLIT (@ s, char (10));

CHỌN 
TỪ(
   CHỌN l, s TỪ @t 
   ĐOÀN TẤT CẢ 
   CHỌN 1e3-l, TRANSLATE (s, '\ /', '/ \') TỪ @t
  ) b 
ĐẶT HÀNG B l

đầu ra (dưới dạng văn bản trong ex.man Quản lý studio):

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

(6 hàng bị ảnh hưởng)
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.