เสร็จสิ้นแผนที่สมมาตร


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+}มีความยาวเท่ากัน


3

Canvas , 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ทำงานกับอาร์เรย์ดังนั้นผมจึงไม่ต้องสาม-replaces แต่สามารถทำ-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

Ruby - 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
ดีฉันชอบการมอบหมาย

อ่ามีการตายของฉัน ;-) ฉันรู้ว่ามันจะเกิดขึ้นในที่สุด
Joey


2

Charcoal , 5 4 ไบต์

S‖M⌈

-1 ขอบคุณไบต์@Neil

ถ่านจะจัดการกับการสะท้อนของ slash อย่างถูกต้องโดยอัตโนมัติ

ลองออนไลน์ (verbose)หรือลองออนไลน์ (บริสุทธิ์)

คำอธิบาย:

รับอินพุตเป็นสตริง:

InputString()
S

สะท้อนกระจกทั้งสองไปทางขวาและลง ( :⌈เป็น builtin สำหรับ:Right, :Down):

ReflectMirror(:⌈)
‖M⌈

@ ASCII-only ได้เพิ่ม multidirectionals ไปแล้วบางส่วนซึ่งรวมถึงการให้ข้อมูลที่ถูกต้องและเป็นไบต์เดียว
Neil

@Neil คุณใช้ในรหัส Verbose อย่างไร :RightDownแน่นอนว่าจะไม่เป็นผลลัพธ์ที่เราต้องการ
Kevin Cruijssen

Multidirectionals ใช้:คำนำหน้าในโหมด Verbose
Neil

@ Neil ดังนั้น:Right:Downหรือ::RightDownหรืออย่างอื่น? อย่างไรก็ตามผลลัพธ์ทั้งสองนี้จะไม่ให้อาร์กิวเมนต์ที่เข้ารหัสในเวอร์ชัน-vlนั้น รหัส verbose จะต้องเกิดอะไรขึ้นS‖M⌈เมื่อใช้-vlarg?
Kevin Cruijssen

ReflectMirror(:⌈)
Neil


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

หมายเหตุ: เนื่องจากโพสต์ผู้เขียนแสดงความคิดเห็น40Let'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

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

@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 ไบต์

อินพุต :

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

บีบอัด :

ประกาศ @t TABLE (l INT เอกลักษณ์ (1,1), s CHAR (40)); INSERT INTO @t (s) ค่า SELECT + การแปล (REVERSE (ค่า), '\ /', '/ \') จาก STRING_SPLIT (@ s, char (10)); เลือก s จาก (เลือก l, s จาก @t ยูเนี่ยนทั้งหมดเลือก 1e3-l, แปล (s, '\ /', '/ \') จาก @t) b เรียงตาม l

มนุษย์อ่านได้ :

ประกาศ @t TABLE (l INT เอกลักษณ์ (1,1), s CHAR (40));
INSERT INTO @t (s)
  เลือกค่า + แปล (REVERSE (ค่า), '\ /', '/ \')
  จาก STRING_SPLIT (@ s, อักขระถ่าน (10));

เลือก 
จาก(
   เลือก l, s จาก @t 
   ยูเนี่ยนทั้งหมด 
   เลือก 1e3-l, แปล (s, '\ /', '/ \') จาก @t
  ) ข 
เรียงตามล

เอาต์พุต (เป็นข้อความใน ex.management studio):

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

(ได้รับผลกระทบ 6 แถว)
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.