Simetrik bir haritayı bitir


12

Girdi olarak x ve y eksenleri üzerinde simetrik olan bir haritanın dörtte biri size verilir. Program haritanın tamamını yazdırmalıdır.

Harita şu karakterleri içerebilir: -+/\|.ve beklenen şekilde döndürülmelidir. İçindeki veriler her zaman dikdörtgen ve küçüktür.

Misal

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

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

En kısa kod kazanır.


Küçük giriş verileri için tam olarak ne anlama geliyor? Ölçmek biraz belirsiz.
Joey

@Joey Diyelim ki giriş en fazla 16 satır ve 40 karakter.

Zaman sınırı koymadığımı fark ettim, ancak birisinin çözümü için bir saniyeden daha fazlasına ihtiyacı varsa, bunu gerçekten görmek isterim.

Yanıtlar:


1

Golfscript - 32 karakter

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

Sorunun simetrisi nedeniyle, iki kez tekrarlıyoruz {yatay olarak çevir, transpoze ( zip)}. Bir bonus olarak, 2görüntüyü daha fazla tekrarlamak için değeri daha büyük bir sayıya değiştirebilirsiniz.

Karakter aktarımı, x^=155 if x%3==2kısıtlı karakter alanı nedeniyle yapılır . Orada da {.5^3%(45+}aynı uzunlukta.


3

Tuval , 5 4 bayt

║Q↷↷

İlk Canvas cevabı, o zaman kolay bir cevapla başlayalım. :)

@Dzaima sayesinde -1 bayt .

Eğik çizgiler, Tuvalde yansıtma veya döndürme sırasında otomatik olarak dönüştürülür.
1 bayt olabilir ( çevrimiçi deneyin ), ancak ne yazık ki yatay olarak yansıtırken noktaları .tek tırnaklara dönüştürür '.

Çevrimiçi deneyin.

Açıklama:

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

Notlar:

  • Maalesef bu, Golf sırasında PowerShell'in kötü bir şekilde kötü olduğu iki şeye ihtiyaç duyar: Bir dizeyi (veya değerler dizisini) tersine çevirme ve bir dizede harfleri dönüştürme. Bunun Perl of Ruby çözümünün en az iki katı uzunluğundan eminim.

Ölçek:

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

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

Tarih

  • 2011-02-09 11:10 (129) - İlk deneme.
  • 2011-02-09 11:27 (126) - Bir değişkeni OFSsaklamak -joinve saklamak için 99..0.
  • 2011-02-09 11:31 (117) - -replaceÜç gerek kalmaz, diziler karşı çalışır -replaces ama yapabilir -split, -replace, -joinyerine.
  • 2011-02-09 15:03 (105) - Aynı şeyi iki kez yapmak yerine, bir kez yapın ve tersine çevirin. Ve parantez içine bir atama koymak değerini boru hattına tükürmesine neden olur :-)
  • 2011-02-09 15:08 (103) - $aArtık buna ihtiyacım olmadığı için artık ihtiyacım yok 99..0.
  • 2011-02-09 15:17 (99) - filterTanımdan sonra boşluk olması gerekmez . Kaldırıldı $xve bunun yerine bir dizideki ilk çalıştırma sırasında her satırı toplayıp ikinci yarının çıktısını alın.

2

Yakut - 88 87 karakter

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

Test sürüşü

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

1
Güzel, görevlendirmeyi seviyorum.

Ah, ölümüm var ;-) Sonunda geleceğini biliyordum
Joey


2

Kömür , 5 4 bayt

S‖M⌈

@Neil sayesinde -1 bayt .

Kömür, eğik çizgileri yansıtan otomatik olarak işler.

Çevrimiçi deneyin (ayrıntılı) veya Çevrimiçi deneyin (saf) .

Açıklama:

Girişi dize olarak alın:

InputString()
S

Aynayı hem sağa hem aşağıya doğru yansıtın ( :⌈bunun için bir yerleşiktir :Right, :Down):

ReflectMirror(:⌈)
‖M⌈

@ ASCII-only, o zamandan beri size tek bir baytta sağa ve aşağıya dönüş de dahil olmak üzere daha fazla çok yönlü ekledi .
Neil

@Neil Ayrıntılı kodda nasıl kullanılır ? :RightDownTabii ki istediğimiz sonuç olmayacak.
Kevin Cruijssen

Çok yönlü :, Ayrıntılı modda bir önek alır .
Neil

@Neil Peki :Right:Down, ya ::RightDownda başka bir şey? Bu iki sonuçtan hiçbiri argümanı olan kodlanmış sürümde bir vermeyecektir -vl. Ne kod Ayrıntılı almak olmayı olurdu S‖M⌈kullanırken -vlarg?
Kevin Cruijssen

ReflectMirror(:⌈)
Neil

1

Perl, 80 karakter

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

1

Kabuk Betiği !!

#!/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 bayt

CJam bu meydan okumadan daha yeni, bu yüzden bu cevap yeşil onay işareti için uygun değil, ama yine de eğlenceli bir egzersizdi

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

Burada test edin.

açıklama

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

Sondaki aktarma, sütunlar boyunca gerçekleştirilecek ikinci saygıyı yönlendirir. Sonunda haritayı yeniden aktarıyoruz, bu yüzden orijinal yönelim elde ediyoruz.


1

Powershell, 95 bayt

Joey'nin cevabından ilham aldı .

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

Not: 40çünkü yazar yorumu yayınlar Let's say the input is at most 16 rows and 40 characters.

Test komut dosyası:

$f = {

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

}

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

Çıktı:

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

0

Yakut - 105

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

0

Golfscript - 44 karakter

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

sonuç

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

Yalnızca örneğin çalışan ve '\' için çevrilmeyen başka bir komut dosyası - 32 karakter

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

sonuç

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

`` Ayrıca çevrilmeli.
Nabb

@Nabb, teşekkürler, kodumu çok büyük yaptı: P
YOU

Mark: Kısaltırsa tekrarlanan dizeler için değişkenler kullanın. Daha sonra cevabımı göndermeden önce anlamaya çalışabileceğiniz birkaç püf noktası olmasına rağmen.
Nabb

@Nabb, Teşekkürler, anlamaya çalışacağım ve 30 dakika geçirmeme izin vereceğim: D
YOU

@ Nabb, hala anlayamadım, sizinkini gönderebilirsiniz.
SİZ

0

Haskell , 76 bayt

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

Çevrimiçi deneyin!

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

girdi :

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

sıkıştırılmış :

@t TABLO ilan et (l INT IDENTITY (1,1), s CHAR (40)); STRING_SPLIT'DEN @t (s) SEÇİNİZ SEÇİM değeri + ÇEVİR (GERİ (değer), '\ /', '/ \') (@ s, char (10)); SİZDEN SEÇİN (l SEÇİN, @T BİRİNCİ TÜM SEÇ 1e3-l, ÇEVİRİ (s, '\ /', '/ \') @ t) b SİPARİŞ L

okunabilir insan :

TABLO beyan (l INT IDENTITY (1,1), s CHAR (40));
@T (s) içine yerleştirin
  SEÇ değeri + ÇEVİRİ (TERS (değer), '\ /', '/ \')
  FROM STRING_SPLIT (@ s, karakter (10));

SELECT s 
DAN (
   L, s'den @ SEÇİN 
   BİRLİK TÜMÜ 
   1t3-l, ÇEVİRİ (s, '\ /', '/ \') @t
  ) b'yi 
SİPARİŞ VER

çıktı (yönetim stüdyosunda metin olarak):

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

(6 satır etkilenir)
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.