Mısır piramitleri


15

Keops Piramidi, Mısır'da büyük piramit, sadece Antik Dünyanın yedi harikasından en eski, ama aynı zamanda sadece büyük oranda sağlam durumda bir. Mısır Piramitlerinin inşası 20 yıla kadar sürebilir ve o kadar büyüktür ki, Haçlıları ezen büyük Saladin'in oğlu Al-Aziz Uthman, Giza'nın Büyük piramitlerini yıkmaktan vazgeçmek zorunda kaldı, çünkü çok büyük bir görev olarak kabul edildi . Mısır piramitleri çoğunlukla Eski ve Orta Krallık dönemlerinde (MÖ 2686-1690 civarı) ülkenin Firavunları ve onların mezarları için mezarlar olarak inşa edilmiş ve 2008 itibariyle 138 Mısır piramidi keşfedilmiştir.

Görev, bir boşlukla ayrılmış bir mesafeler dizisi giren ve bu mesafelerle ayrılmış 10 × 10 metin piramitleri üreten bir program oluşturmaktır. 1 mesafesi iki karaktere eşittir.

Bir metin piramidi şöyle görünecektir:

         /\
        /--\
       /----\
      /------\
     /--------\
    /----------\
   /------------\
  /--------------\
 /----------------\
/------------------\

Giriş sadece bir satır kesmesinden oluşuyorsa, yukarıdaki gibi bir piramit üretilecektir . Her piramit için, soldaki piramitler öndeymiş gibi görüntülenir.

Örnek I

Giriş:

4 3 1

Çıktı:

         /\      /\    /\/\
        /--\    /--\  /--\-\
       /----\  /----\/----\-\
      /------\/------\-----\-\
     /--------\-------\-----\-\
    /----------\-------\-----\-\
   /------------\-------\-----\-\
  /--------------\-------\-----\-\
 /----------------\-------\-----\-\
/------------------\-------\-----\-\

Örnek II

Giriş:

0 9

Çıktı:

         /\                /\
        /--\              /--\
       /----\            /----\
      /------\          /------\
     /--------\        /--------\
    /----------\      /----------\
   /------------\    /------------\
  /--------------\  /--------------\
 /----------------\/----------------\
/------------------\-----------------\

Örnek III

Giriş:

11

Çıktı:

         /\                    /\
        /--\                  /--\
       /----\                /----\
      /------\              /------\
     /--------\            /--------\
    /----------\          /----------\
   /------------\        /------------\
  /--------------\      /--------------\
 /----------------\    /----------------\
/------------------\  /------------------\

Bu gereksinimleri en az sayıda karakterle yerine getirmek için uygulama kazanır.

Referans: Wikipedia.org


Hattın sonunda ilave boşluklara izin verildiğini sanıyorum?
Peter Taylor

Kime sorduğunuza bağlı. Spesifikasyonun en katı okumasında, çıktıyı takip eden boşluk yoktur. Ama bunun eğlence için olduğu düşünülürse, onunla bir sorunum yok.
nharren

Yani girdi almak için komut satırı argümanlarına izin verilir?
Joey

Gereklilikleri karşıladığı sürece. Şimdi görüyorum ki Whitledge'un çözümü aslında çizgi kırılmalarını girdi olarak işleyemiyor (benim oyumu geri alamıyorum), herhangi bir girdi yoksa bir piramit üreterek bunun etrafında çalışır. Ancak komut satırı argümanları olarak linebreak girişlerini (\ r veya \ n iyi) işleyebilecek bir çözüm bulabilirseniz, o zaman benimle tamam.
nharren

Yanıtlar:


4

Golfscript, 70 karakter

~]0-:|;10,{:§9\-" "*"/""-"§2**+"\\"+:&|{.§>{§-(2*" "*1$}{-2*&>}if}%n}%

Ruby çözümümün doğrudan bağlantı noktası , bu yüzden bunu birkaç karakterle kısaltmanın mümkün olduğuna eminim.


5

Windows PowerShell, 122 132 133 139

$d=@(-split$input)-gt0
0..9|%{' '*(9-($x=$_))+($a="/$('--'*$_)\")+-join($d|%{'  '*(($_-$x-1)*($x-lt$_))
$a[(-2*$_)..-1]})}

Test komut dosyası .

Rastgele giriş ayrıca güzel görüntüler sağlar:

Random pyramids


En $input=Read-Hostüste eklersem çalışır , aksi takdirde girdi istemez. Bu nasıl yapılmalı?
nharren

@ nharren: echo 0 3 4 1|powershell -noprofile -file pyramids.ps1Veya PowerShell'den '0 1 4 3' | .\pyramids.ps1. Yalnızca kabul edebilir gibi bu ne yazık ki, PowerShell golf ile sık görülen bir sorundur ya borulu-in girişi veya etkileşimli girdi. PowerShell, diğer diller ve ortamların sahip olduğu stdin kavramına sahip değildir ve bu bazen gösterir. Görev açıkça numarayı tahmin etmek gibi etkileşim açıkça çağırmadıkça genellikle borulu girdi için gidiyorum .
Joey

Ah evet, şimdi işe yarıyor. Düğme ezme işlemim sonuç vermiyordu ve nedenini bulamadım.
nharren

4

Haskell, 148 karakter

r=replicate
p d=map(\k->foldr(\n i->r(9-k)' '++'/':r(2*k)'-'++"\\"++drop(11+k)(r(2*n)' '++i))""$d++[0])[0..9]
main=interact$unlines.p.map read.words

Bundan oldukça memnun değilim! Çok uzun sürüyor. Fikirler?


Lambda'nın içinde, büyük yığınlarını ++tek bir listeye değiştirebilir ve concat aka kullanabilirsiniz >>=id. Yardımcı olup olmayacağını bilmiyorum. foldr1Bunun yerine başka bir nokta kullanmak olurdu foldr.
FUZxxl

Fikirler için teşekkürler. Bu durumda da yardımcı olmaz: ++Dizileri dönüştürmek size öğe başına yalnızca bir karakter kazandırır ve finalin ek yükü concatburada çok yüksektir. Sonuç türü olarak formu foldrkullanamazsınız foldr1, Stringancak liste türü [Int]( 1Varyantlar foldaynı olmalarını gerektirir.)
MtnViewMark

4

Python, 123 karakter

N=[10]+map(int,raw_input().split())
for y in range(10):print''.join((2*n*' '+'/'+2*y*'-'+'\ ')[-2*n-1:-1]for n in N)[9-y:]

Meraktan, bu python 2.5 mı? Bunu python 3.2'de çalışmak için, harita fonksiyonunu bir liste fonksiyonuna tamamladım, raw_input () öğesini input () olarak değiştirdim ve print () olarak print değiştirdim.
nharren

@nharren: benim için hem 2.4.4 hem de 2.5.2'de çalışıyor.
Keith Randall

4

Yakut 1.9, 116 karakter

d=gets.split-[?0]
10.times{|i|puts [?\s*(9-i),l=?/+?-*2*i+?\\,d.map{|r|i<(r=r.to_i)??\s*2*(r+~i)+l :l[-2*r,99]}]*""}

2

Perl, 130 126 132 karakter

$_=<>;$s=" "x9;map{$k.="/\\"."  "x($_-1)if$_}split;$_="$s$k/\\$s\n";for$i(0..9){print;s%\\-%-\\%g;s%\\/%-\\%g;s%\\ %-\\%g;s% /%/-%g}

Girişi stdin yerine komut satırı bağımsız değişkenleri olarak alan biraz daha kısa sürüm:

$s=" "x9;map{$k.="/\\"."  "x($_-1)if$_}@ARGV;$_="$s$k/\\$s\n";for$i(0..9){print;s%\\-%-\\%g;s%\\/%-\\%g;s%\\ %-\\%g;s% /%/-%g}

Henüz kimsenin regex çözümü yapmadığına inanamıyorum. Perl benim en iyi dilim olmanın çok uzun bir yolu, bu yüzden bu muhtemelen çok daha fazla kaybedebilir. Birisi meydan okumaya hazırsa, sed uygulamasını görmek isterim.

(Teşekkürler, @mbx, 4 karakter için).


foreach == for -> 4 karakter kaydet
mbx

sürümünüzü verilen test kılıflarıyla test ettiniz mi ?!
mbx

@mbx, evet, benim için çalışıyor. Perl 5.10.1, Ubuntu. Hangi hatayı görüyorsun?
Peter Taylor

@Peter Taylor - benim ubuntu ve win32 üzerinde de iyi çalışıyor. İlk önce perl 5.12.1 çalıştıran ideone üzerinde denedim .
mbx

2
»Eğer giriş sadece bir satır sonu içeriyorsa« aslında standart giriş ipuçları.
Joey

1

JavaScript, 396 bayt

function p(a){for(u=0;u<10;u++){t[u+a][9-u]="/";for(k=9-u+1+a;k<10+u+a;k++)t[k][u]="-";
t[10+u+a][u]="\\"}}function _(a){t=[];for(i=0;i<50;i++){t[i]=[];for(j=0;j<10;j++)t[i][j]=" "
}var a=a.split(" "),b=a.reduce(function(a,b){return a-0+(b-0)})*2;for(i=a.length-1;i>=0;
i--)p(b),b-=a[i]*2-0;p(0);a="";for(j=0;j<10;j++){b="";for(i=0;i<50;i++)b+=t[i][j];
a+=b.replace(/\s+$/,"")+(j<9?"\n":"")}return a}

JavaScript ile kazanamayacağım, ancak şimdi bir JavaScript girişi var :)

Kullanım: _("1 2 3")vb.


1

Yakut (112)

Farklı bir yaklaşımla Ventero'nun Ruby çözümünden biraz daha kısa. Ruby öğrenmeye yeni başladım, bu yüzden bu muhtemelen biraz azaltılabilir.

s=' '*9+r='/\\';gets.split.map{|i|s+=' '*2*(i.to_i-1)+r}
10.times{puts s;s.gsub!' /','/-';s.gsub!(/\\.?/,'-\\')}

1

Powershell, 105 98 bayt, spesifikasyonların en katı okuması

-7 migimaru en dan bayt cevap .

($a=' '+-join(,5+$args-gt0|%{'  '*--$_+'/\'}))
1..9|%{($a=$a-replace' /','/-'-replace'\\.?','-\')}

Test komut dosyası:

$f = {

($a=' '+-join(,5+$args-gt0|%{'  '*--$_+'/\'}))
1..9|%{($a=$a-replace' /','/-'-replace'\\.?','-\')}

}

@(
,(@"
         /\
        /--\
       /----\
      /------\
     /--------\
    /----------\
   /------------\
  /--------------\
 /----------------\
/------------------\
"@)

,(@"
         /\      /\    /\/\
        /--\    /--\  /--\-\
       /----\  /----\/----\-\
      /------\/------\-----\-\
     /--------\-------\-----\-\
    /----------\-------\-----\-\
   /------------\-------\-----\-\
  /--------------\-------\-----\-\
 /----------------\-------\-----\-\
/------------------\-------\-----\-\
"@, 4,3,1)

,(@"
         /\                /\
        /--\              /--\
       /----\            /----\
      /------\          /------\
     /--------\        /--------\
    /----------\      /----------\
   /------------\    /------------\
  /--------------\  /--------------\
 /----------------\/----------------\
/------------------\-----------------\
"@, 0,9)

,(@"
         /\                    /\
        /--\                  /--\
       /----\                /----\
      /------\              /------\
     /--------\            /--------\
    /----------\          /----------\
   /------------\        /------------\
  /--------------\      /--------------\
 /----------------\    /----------------\
/------------------\  /------------------\
"@, 11)
) | % {
    $expected, $a = $_
    $result = &$f @a
    ($result-join"`n")-eq$expected
    $result 
}

Çıktı:

True
         /\
        /--\
       /----\
      /------\
     /--------\
    /----------\
   /------------\
  /--------------\
 /----------------\
/------------------\
True
         /\      /\    /\/\
        /--\    /--\  /--\-\
       /----\  /----\/----\-\
      /------\/------\-----\-\
     /--------\-------\-----\-\
    /----------\-------\-----\-\
   /------------\-------\-----\-\
  /--------------\-------\-----\-\
 /----------------\-------\-----\-\
/------------------\-------\-----\-\
True
         /\                /\
        /--\              /--\
       /----\            /----\
      /------\          /------\
     /--------\        /--------\
    /----------\      /----------\
   /------------\    /------------\
  /--------------\  /--------------\
 /----------------\/----------------\
/------------------\-----------------\
True
         /\                    /\
        /--\                  /--\
       /----\                /----\
      /------\              /------\
     /--------\            /--------\
    /----------\          /----------\
   /------------\        /------------\
  /--------------\      /--------------\
 /----------------\    /----------------\
/------------------\  /------------------\

Powershell, 101 94, önde gelen bir boşlukla eğlence

($a=-join(,6+$args-gt0|%{'  '*--$_+'/\'}))
1..9|%{($a=$a-replace' /','/-'-replace'\\.?','-\')}

0

Bundan daha kısa C # 3 sürümünü alamadım. Karakter sayısını tam olarak bilmiyorum, ama kaybettiğimden şüpheleniyorum. :-(

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;

namespace PyramidRenderer
{
    /// <summary>
    /// Generates ASCII-art pyramids at user-specified horizontal locations to
    /// the standard output stream.
    /// </summary>
    public class Program
    {
        /// <summary>
        /// Generates one or more ASCII-art pyramids at the locations specified and 
        /// sends them to the standard output stream.
        /// </summary>
        /// <param name="args">The command-line arguments. These should be non-negative 
        /// integers that specify the horizontal distance of each additional pyramid from the 
        /// preceeding pyramid. Whether or not any distances are suppplied, a pyramid
        /// is rendered at the starting location.</param>
        public static void Main(string[] args)
        {
            try
            {
                AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);

                int[] pyramidDistances = ParsePyramidLocationsFromCommandLine(args).ToArray();
                PyramidCollection pyramids = new PyramidCollection(pyramidDistances);
                pyramids.RenderToText(Console.Out);
            }
            catch (ArgumentException ex)
            {
                Console.Error.WriteLine(ex.Message);
            }
        }

        /// <summary>
        /// Handler for the unhandled exception. This just displays the error message to 
        /// the standard error stream.
        /// </summary>
        /// <param name="sender">Required but unnecessary sender object for the event handler.</param>
        /// <param name="e">The object that represents the exception.</param>
        private static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
        {
            Debug.Assert(e.ExceptionObject != null);

            string exceptionText;
            Exception ex = e.ExceptionObject as Exception;
            if (ex == null)
                exceptionText = e.ExceptionObject.ToString();
            else
                exceptionText = ex.Message;
            Console.Error.WriteLine(exceptionText);
        }

        /// <summary>
        /// Takes the command-line arguments and converts them to a sequence of 
        /// non-negative integers.
        /// </summary>
        /// <param name="args">The command-line arguments as supplied to Main.</param>
        /// <returns>A sequence of integers that represent the user’s distance selections.</returns>
        /// <exception cref="ArgumentException">An invalid argument was supplied.</exception>
        private static IEnumerable<int> ParsePyramidLocationsFromCommandLine(string[] args)
        {
            Debug.Assert(args != null);

            foreach (string arg in args)
            {
                int result;
                if (int.TryParse(arg, out result))
                {
                    if (result < 0)
                        throw new ArgumentException(string.Format("Invalid distance specified: {0}", arg));

                    yield return result;
                }
                else
                {
                    throw new ArgumentException(string.Format("Invalid option: {0}", arg));
                }
            }
        }
    }

    /// <summary>
    /// Represents a single pyramid to be rendered.
    /// </summary>
    internal class Pyramid
    {
        /// <summary>
        /// The height of the pyramids in text rows. The width of each pyramid will be
        /// twice the height.
        /// </summary>
        internal const int Height = 10;

        /// <summary>
        /// The length in characters of the horizontal unit distance in which the user 
        /// specifies the pyramid distances.
        /// </summary>
        internal const int PyramidUnits = 2;

        /// <summary>
        /// The character to output as the background of the pyramids.
        /// </summary>
        private const char backgroundChar = ' ';

        /// <summary>
        /// The character to output as the left edge of the pyramids.
        /// </summary>
        private const char leftEdgeChar = '/';

        /// <summary>
        /// The character to output within each pyramid, between the edges.
        /// </summary>
        private const char brickChar = '-';

        /// <summary>
        /// The character to output as the right edge of the pyramids.
        /// </summary>
        private const char rightEdgeChar = '\\';

        /// <summary>
        /// The absolute horizonal location of the pyramid’s bottom left corner as 
        /// specified in PyramidUnits.
        /// </summary>
        private int position;

        /// <summary>
        /// Constructs a new pyramid object at the specified location.
        /// </summary>
        /// <param name="position">The absolute horizonal location of the pyramid’s bottom
        /// left corner in PyramidUnits.</param>
        internal Pyramid(int position)
        {
            Debug.Assert(position >= 0);

            this.position = position;
        }

        /// <summary>
        /// Renders a single row the pyramid to the supplied text stream starting at
        /// the indicated location.
        /// </summary>
        /// <param name="textWriter">The output stream to which the pyramid is to
        /// be rendered.</param>
        /// <param name="row">The row of the pyramid to render. Zero is the top row,
        /// and Height - 1 is the bottom row.</param>
        /// <param name="startingPosition">The text character position—indexed at zero—at 
        /// which the rendering is to begin. If non-zero, this identifies the column one 
        /// past the ending location of the previous pyramid.</param>
        /// <returns>The horizontal location (in characters) at which the next item 
        /// may be rendered.</returns>
        internal int RenderRow(TextWriter textWriter, int row, int startingPosition)
        {
            Debug.Assert(textWriter != null);
            Debug.Assert(row >= 0);
            Debug.Assert(startingPosition >= 0);

            int leftBoundary = Height - 1 - row + position * PyramidUnits;
            int rightBoundary = Height + row + position * PyramidUnits;

            startingPosition = RenderField(textWriter, backgroundChar, startingPosition, leftBoundary);
            startingPosition = RenderField(textWriter, leftEdgeChar, startingPosition, leftBoundary + 1);
            startingPosition = RenderField(textWriter, brickChar, startingPosition, rightBoundary);
            startingPosition = RenderField(textWriter, rightEdgeChar, startingPosition, rightBoundary + 1);
            return startingPosition;
        }

        /// <summary>
        /// Outputs a sequence of repeated characters from the indicated starting position to
        /// just before the ending position, unless the starting position is already equal to
        /// or greater than the ending position.
        /// </summary>
        /// <param name="textWriter">The output stream to which the field is to be rendered.</param>
        /// <param name="character">The character to be repeated in the output.</param>
        /// <param name="startingPosition">The location at which rendering may begin in 
        /// characters indexed at zero.</param>
        /// <param name="endingPosition">The location one past the location at which rendering
        /// is to end.</param>
        /// <returns>The position at which the next field may begin.</returns>
        private static int RenderField(TextWriter textWriter, char character, int startingPosition, int endingPosition)
        {
            Debug.Assert(textWriter != null);
            Debug.Assert(startingPosition >= 0);
            Debug.Assert(endingPosition >= 0);

            int charCount = endingPosition - startingPosition;
            if (charCount <= 0)
                return startingPosition;
            textWriter.Write(new string(character, charCount));
            return endingPosition;
        }
    }

    /// <summary>
    /// A collection of pyramids to be displayed.
    /// </summary>
    internal class PyramidCollection
    {
        /// <summary>
        /// A left-to-right ordered list of the pyramids that the user has 
        /// requested to be rendered.
        /// </summary>
        List<Pyramid> allPyramids = new List<Pyramid>();

        /// <summary>
        /// Constructs a new pyramid collection.
        /// </summary>
        /// <param name="distances">The distances of each non-leftmost pyramid (in PyramidUnits) after
        /// the previous pyramid. The total number of pyramids will be one greater than the length of
        /// the distances array.</param>
        internal PyramidCollection(int[] distances)
        {
            Debug.Assert(distances != null);

            int nextPosition = 0;
            allPyramids.Add(new Pyramid(nextPosition));
            foreach (int nextDistance in distances)
            {
                Debug.Assert(nextDistance >= 0);

                try
                {
                    checked
                    {
                        nextPosition += nextDistance;
                        int endLocation = nextPosition * Pyramid.PyramidUnits + Pyramid.Height * 2;
                    }
                }
                catch (OverflowException)
                {
                    // Ignore any pyramids specified beyond the integer maximum distance.
                    break;
                }
                allPyramids.Add(new Pyramid(nextPosition));
            }
        }

        /// <summary>
        /// Outputs ASCII-art images of the pyramids in this collection to the 
        /// provided output stream.
        /// </summary>
        /// <param name="textWriter">The output stream to which the pyramids
        /// are to be rendered.</param>
        internal void RenderToText(TextWriter textWriter)
        {
            Debug.Assert(textWriter != null);

            for (int row = 0; row < Pyramid.Height; row++)
            {
                int startingPosition = 0;
                foreach (Pyramid pyramid in allPyramids)
                {
                    startingPosition = pyramid.RenderRow(textWriter, row, startingPosition);
                }
                textWriter.WriteLine();
            }
        }
    }

}

3
Code Bowling ve Code Golf'ü şans eseri karıştırdınız mı?
Joey

1
En azından deniyormuş gibi yap. Eğer golf oynarsanız insanlar size karşı ayrıntılı bir dil tutmazlar .
dmckee --- eski moderatör yavru kedi

Şık hilelerinizi açıklamak için bu ayrıntılı versiyonunuz sanırım. Görünüşe göre golf versiyonunu yazmayı unuttun.
mbx

@Joey, @dmckee - Bir golf versiyonu yapmayı düşündüm, ama bunu yapmadım. Zaten bu oyunda berbatım. Belirsiz kod tamamen benim doğaya aykırı. Muhtemelen golf bulmacalarından uzak durmalısınız! - @mbx - Ne yazık ki, şık numaralar yok.
Jeffrey L Whitledge
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.