ASCII'nin Büyük Piramidi


25

Giriş

2600 M.Ö. ve insanlar şimdi piramitler inşa ediyorlar. Onlar zaten piramidin temelini oluşturdular ama nasıl devam edeceklerini bilmiyorlar. Bu yüzden yardım istediler.

Bir piramit yapmanın kuralları oldukça basittir. Önceki katmanın üzerindeki katman için yapmanız gereken tek şey bu adım adım el kılavuzunu takip etmektir:

  1. Önceki katmandan kenarları kesin.

  2. Üstü /karakteri, bir olmalı \karakter ve tersi. Bu , kenarlar dışındaki her karakter için geçerlidir .

  3. En soldaki karakter her zaman /birdir ve en sağdaki karakter her zamandır \.

Bir piramit için bir temel örneği ele alalım:

//\/\/\\

Kenarları keserek bıraktık:

 /\/\/\

Eğik çizgileri ters eğik çizgilerle değiştiririz;

 \/\/\/

En soldaki karakter her zaman /birdir ve en sağdaki karakter her zaman birdir \, yani şunu değiştiririz:

 //\/\\

Bu katmanı önceki katmana yerleştiririz:

 //\/\\
//\/\/\\

Zirveye ulaşana kadar devam ediyoruz (ki bu benziyor /\). Böylece, sonunda:

   /\
  //\\
 //\/\\
//\/\/\\

Çıktı almanız gereken şey budur.

Görev

Bir piramidin temeli göz önüne alındığında (uzunluğu 3'ten büyük), tam piramidin çıktısını alın. En soldaki karakterin /ve en sağdaki karakterin a olduğunu kabul edebilirsiniz \. Bazın uzunluğunun her zaman eşit olduğunu da varsayabilirsiniz . Kullanımı sonunda boşluk bırakılır. Kullanımı lider boşluklar da uzun yerinde piramit kalır yanı, izin verilir. 1 izleyen ve 1 önde gelen yeni satır kullanılmasına izin verilir.

Test durumları

Input: /\\\
Output:
 /\
/\\\

Input: //\\///\/\
Output:
    /\
   /\\\
  /\///\
 ///\\\/\
//\\///\/\

Input: /////////////\
Output:
      /\
     /\\\
    /////\
   /\\\\\\\
  /////////\
 /\\\\\\\\\\\ 
/////////////\

Bu , bu yüzden en az sayıda bayt olan gönderim kazanıyor!


Bana temel bir hücresel otomatı hatırlatıyor . Belki bu gelecekteki ilginç bir mücadeleye neden olabilir
DoctorHeckle

Yanıtlar:


9

Jelly ,28 26 2524 bayt

QṚ,QyḊḊṖṖj@QµÐĿµJ’⁶ẋ⁸żYṚ

Dennis sayesinde -4 bayt

Yemek tarifi:

QṚ,QyḊḊṖṖj@QµÐĿµJ’⁶ẋ⁸żYṚ - one argument: input()
Q  Q       Q             - set of Left=input(): "/\"
 Ṛ                       - reverse Left: "\/"
  ,                      - Left-pair-Right: ["\/","/\"]
     ḊḊṖṖ                - dequeue Left twice, then pop twice: input()[2:-2]
    y                    - translate Right with mapping in Left: swaps internal slashes
         j@              - join Right with separator Left (@ swaps operands)
            µ  µ         - chain separators to form a 1,1,1 chain of chains
             ÐĿ          - loop while results are unique and collect them
                J        - yield [1,...,len(Left=input())]
                 ’       - decrement: [0,....len(input())-1]
                  ⁶      - " "
                   ẋ     - repeat Left Right times: ["", " ", ...]
                    ⁸ż   - zip Right and Left (⁸ is the link's Left argument):
                                ...pads the loop results
                      Y  - joins Left with line-feeds
                       Ṛ - reverse Left

(limonata ile servis edilir, bu piramitler susuz işçiler için yapar)

TryItOnline'da kendi eğik piramidinizi hazırlayın ya da OP'nin önerdiği tüm lezzetleri deneyin



11

Pyth - 27 26 bayt

OP'de verilen işlem, boş satır için geçerli olana kadar tekrarlayana kadar azaltır.

j_.e+*kdb.ujXtPtPNK"\/")_K

Test Takımı .


8

Python 2,78 bayt

f=lambda s,p='\n':(s[2:]and f('/%s\\'%s.translate('/\\'*128)[2:-2],p+' '))+p+s

Bir dizge çıktısı tekrarlayan bir fonksiyon. Piramidin her katmanı, üstündeki katmanla özyinelemeli çağrıya eklenir. Yeni psatır karakteri olarak başlayan önek , üçgeni oluşturmak için bir boşluk daha kazanır. Bir sonraki katman, eğik çizgileri değiştirerek, ilk ve son iki sembolü keserek ve onu sol ve sağ çizginin içine sokarak üretilir.

Python 3, içinde bir bayt kaydedebilir *99.translate , uzunluk-256 gereksinimi düştüğü , .


Akıllıca çeviri kullanarak, ancak yazdırmak zorunda değil miyiz?
Jonathan Allan

@JonathanAllan Varsayılan olarak , sadece meydan yazdığı gibi çıktı almak zorunda.
xnor

6

Haskell, 98 94 90 85 bayt

q=init.tail
s '/'='\\'
s _='/'
t#""=t++"\\\n"
t#l=(' ':t)#(s<$>q l)++t++l#""
("/"#).q

Kullanım örneği (not: Haskell'de değişmez dizgilerdeki ters eğik çizgilerin çıkması gerekir \\):

*Main> putStr $ (("/"#).q) "//\\\\///\\/\\"
    /\
   /\\\
  /\///\
 ///\\\/\
//\\///\/\

Basit yineleme yaklaşımı: #işi iç elemanların üzerinde ve üzerinde sçeviren haritalama yaparak yapar . Ek parametre girinti seviyesini izler ve her özyinelemeli aramada bir boşlukla genişletilir./\t

Not: İkinci özyinelemeli çağrı #(-> l#"") temel duruma doğrudan atlar ve sadece eklemek kısa yoldur l, \ve bir satır, yerini aldığı yani ++l++"\\\n".

Düzenleme: @xnor 5 byte kaydetti. Teşekkürler!


l++"\\\n"benziyor l#"".
xnor

1
Bir dizede iki karakter takas için ilginç bir yol solduğunu [c|x<-s,c<-"ab",c/=x].
xnor

@xnor: İkinciden kurtulmak için birçok şey denedim ++"\\\n", ancak bunu kaçırdım. Teşekkürler!
nimi

6

Python 3, 108 104 101 94 91 89 88 bayt

b,f='\/';p=lambda t,n='\n':(t[2:]and p(f+''.join(map({f:b,b:f}.get,t[2:-2]))+b,n+' '))+n+t

-7 (! Bana biz basmak gerekmez bildirerek) XNOR sayesinde bayt
-3 XNOR sayesinde bayt (işlev bildiriminde beyanı dışında [oh d'] alarak)
-1 Dennis bayt sayesinde (replace f,b='/\\'ile b,f='\/')

İdeone üzerinde test edin . Not: çift ters eğik çizgi için ayarlanan giriş (tek bir ters eğik çizgiyle sonuçlanırsa ham dizeler bile çalışmaz).


Ortaklaşa f,b='/\\'fonksiyonun dışını ilan edebilirsiniz .
xnor

@xnor Teşekkürler, sayamıyorum ^^
Jonathan Allan 21

5

JavaScript (ES6), 91 86 bayt

f=
(s,t=`
`)=>s[2]?f(`/${s.slice(2,-2).replace(/./g,c=>c>`/`?`/`:`\\`)}\\`,t+` `)+t+s:t+s
;
<input placeholder=Basis oninput=o.textContent=f(this.value)><pre id=o>

Çıktı, öncü bir yeni satır karakteri içerir.


3

Ruby, 80 bayt

f=->s{s[-3]>?!&&f[" "+s.gsub(/^( *\/).|.(.$)?/){$1||$2||($&>?/??/:?\\)}]
puts s}

Ungolfed

f = ->s{
  s[-3] > ?! &&
    f[" " + s.gsub(/^( *\/).|.(.$)?/) {
      $1 || $2 || ($& > ?/ ? ?/ : ?\\)
    }]
  puts s
}

İdeone bakın: http://ideone.com/HN0l0Y


benim kötü, bunu fvücutta
görmedim

3

Toplu, 137 bayt

@echo off
if %1==/\ goto g
set s=%1
set s=\%s:~2,-2%/
set s=%s:/=-%
set s=%s:\=/%
set s=%s:-=\%
call %0 %s% "%~2 "
:g
echo %~2%1

Uygun bir şekilde kullanmam %~2ve %1bayt harcamak zorunda kalmamam anlamına gelir setlocal. Açıklama: Batch boş dizgede değişiklik yapamayacağından, bir sonraki katmanı "yanlış" kenarlarla ayarlamalıyız, bu daha sonra dizge değişimlerinin bir parçası olarak düzeltilecektir.


2

BASH (sed + sort) 71 66 Bayt

sed -rne':l;p;y|\\|1|;y|/|\\|;y|1|/|;th;:h;s|\\.(.*)./| /\1\\|;tl'|sort   
sed -rne':l;p;y|\\/|1\\|;y|1|/|;th;:h;s|\\.(.*)./| /\1\\|;tl'|sort

girdi stdin'den geliyor.
Örnek:

echo '//\\' |sed -rne':l;p;y|\\|1|;y|/|\\|;y|1|/|;th;:h;s|\\.(.*)./| /\1\\|;tl'|sort

 /\
/\\\

Açıklama:
-n- bastırmak oto baskı
:l- ve tlbaşına şube geri bu hat dışında şeymiş /\
p - bu satırı yazdırmak
y|\\/|1\\|;y|1|/|yerine - \ile 1, /birlikte \ve daha sonra 1birlikte /
th;:h- testi ve aynı yerde atlamak sadece bir sonraki yer değiştirme test alır böylece, sonra
s|\\.(.*)./| /\1\\|- her iki taraftaki kesilmiş dış iki parçayı değiştirin {space}/ve \
sort- spaceönce gelir, /böylece her şey doğru sıraya koyulur


2

05AB1E, 42 38 36 bayt

Dg;<FÐgÍ©£R®ÍN-£„/\‡'/ðN>׫«R'\«}r»

Çevrimiçi deneyin!

Açıklama:

# Read the input to the stack, loop for 0 .. len(input) / 2 - 1
Dg;<F
# Save the layer by pushing a copy on the stack, then push
# len(layer) - 2 to both the top of the stack and register_c
     ÐgÍ©
# a = pop(); b = pop(); push(b[0:a].reverse())
# This removes the last 2 characters and reverses
         £R
# push(register_c - 2 - N)
           ®ÍN-
# a = pop(); b = pop(); push(b[0:a])
# This removes the leading spaces and the first two slashes
               £
# Push "/\" and "\/" to the stack.
                 „/\Â
# Transliterate the slashes
                     ‡
# Add N+1 spaces and a / to the end of the (reversed) current layer
                      '/ðN>׫«
# Reverse the layer and add a \ to the end.
                              R'\«
# End the loop
                                  }
# Reverse the stack and join it with newlines. It is implicitly printed.
                                   r»

( Bunu işaret ettiği için Emigna'ya teşekkür eder DD -> Ðve DR -> Â).


Dg;GDðK¦¦¨¨„/\‡'\«R'/«ðN׫R}r»7 bayt kaydeder.
Emigna

Bu bana yeterince farklı görünüyor, kendi cevabınızı eklemeniz gerektiğini düşünüyorum :).
16'da

1

Go, 300 276 bayt

package main
import(."regexp";."os")
func p(b string)string{
s:=MustCompile(`((\s*.)(\S*)(\S))`).FindStringSubmatch(b)
if s[3]!=""{r:=""
for _,c:=range s[3][1:len(s[3])-1]{r+=`\/`[c/64:c/46]}
return p(" "+s[2]+r+`\`)+s[1]+"\n"}
return s[1]+"\n"}
func main(){print(p(Args[1]))}

Uzun versiyon:

package main

import (
    "regexp"
    "os"
)

func pyramid(base string) string {
    m := regexp.MustCompile(`^((\s*\S)(\S*)(\S))\s*`).FindStringSubmatch(base)
    if len(m[3]) > 0 {
        reversed := ""
        for _, c := range m[3][1:len(m[3]) - 1] {
            if c == '/' {
                reversed += `\`
            } else {
                reversed += `/`
            }
        }
        return pyramid(" " + m[2] + reversed + m[4]) + m[1] + "\n"
    }
    return m[1] + "\n"
}

func main() {
    print(pyramid(os.Args[1]))
}

import(."regexp";."os")2 bayt kaydeder
Sefa

@Sefa Teşekkürler, bunun dışında 22 baytı daha sıktım.
Roland Illig

1

Perl, 53 52 bayt

İçin +1 içerir -p

STDIN'deki giriş ile çalıştırın, örn.

./pyramid.pl <<< '//\\///\/\'

pyramid.pl:

#!/usr/bin/perl -p
s%^( *)/.(.*)..%"$1 \\$2/
"=~y|\\/|/\\|r.$&%e&&redo

1

05AB1E , 31 bayt

Dg;GDðK¦¦¨¨„/\‡'\«R'/«ðN׫R}r»

açıklama

Dg;G                        }    # for N in [1..len(input)/2-1]
    D                            # make a copy of previous layer
     ðK                          # remove all spaces
       ¦¦¨¨                      # remove first 2 and last 2 chars
           „/\‡                 # replace '/' with '\' and vice versa
                '\«              # add a backslash at the end
                   R             # reverse
                    '/«          # ad a slash at the end
                       ðN׫      # add N spaces
                           R     # reverse back
                             r»  # reverse stack and join on newline
                                 # implicitly print

Çevrimiçi deneyin


1

> <> , 186 179 175 171 bayt

0&v &+1&<
  >i:0)?^~&2,:&v
v'/'~v?:-1<  }0<
o    >84*o^-$;?=@:&:&}:~<
\&::&{:@+$}1+[{l1-$-2*:&1+{
>}1-:?!v$:l2%?!vo
^o'/'v?~e  (*5a<
^o'\'< &   >~]a'\'oo{1+:^
  {$1- >:?!^

oooh adam bu kesinlikle benim en büyük> <> cevabım.

Hala yapılması gereken bazı golf kaldı (alt alan oldukça israf)

Çevrimiçi deneyin


0

Powershell, 142 bayt

function s($s){if($s.Trim()-eq'/\'){return $s}
$n=$s-replace'\\','#'-replace'/','\'-replace'#','/'-replace'\\.(.*)./',' /$1\'
(s($n))+"`n$s"
}

0

C #, 250 bayt

s=>{int j=s.Length/2,i=0;var l=new string[j];l[j-1]=s;while(++i<j){var n=l[j-i].Trim().Substring(1,l[j-i].Trim().Length-2);l[j-i-1]=new string(' ',i)+"/"+n.Replace("/","#").Replace(@"\","/").Replace("#",@"\").Substring(1,n.Length-2)+@"\";}return l;};

Kesinlikle daha fazla golf oynayabilirim ama beynim öldü, o yüzden onu olduğu gibi bırakmaya karar verdim.

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.