이집트 피라미드


15

이집트에서 가장 큰 피라미드 인 기자의 대 피라미드는 고대 세계에서 가장 오래된 7 대 불가사의 일뿐만 아니라, 그대로 남아 있는 유일한 곳 이기도합니다 . 이집트 피라미드는 건축하는 데 최대 20 년이 걸릴 수 있으며, 십자군을 분쇄 한 위대한 살라딘의 아들 알-아지즈 우트 만은 너무 큰 과제 로 여겨지기 때문에 기자의 위대한 피라미드를 철거해야했습니다 . 이집트 피라미드는 대부분 구약과 중기 시대 (기원전 2686 ~ 1690 년경)에 나라의 파라오와 그 사원들을 위해 무덤으로 지어졌으며, 2008 년 현재 이집트 피라미드는 138 개가 발견되었습니다.

과제는 공백으로 구분 된 일련의 거리를 입력하고 그 거리로 구분 된 10 × 10 텍스트 피라미드를 생성하는 프로그램을 만드는 것입니다. 1의 거리는 두 문자와 같습니다.

텍스트 피라미드는 다음과 같습니다.

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

입력이 줄 바꿈으로 만 구성된 경우 위와 같이 하나의 피라미드가 생성됩니다 . 각 피라미드마다 왼쪽에있는 피라미드가 마치 마치 마치 앞에있는 것처럼 표시됩니다.

예 I

입력:

4 3 1

산출:

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

실시 예 II

입력:

0 9

산출:

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

실시 예 III

입력:

11

산출:

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

가장 적은 수의 문자로 이러한 요구 사항을 충족시키는 응용 프로그램이 승자입니다.

참조 : Wikipedia.org


줄 끝에 추가 공백이 허용된다고 가정합니다.
피터 테일러

당신이 묻는 사람에 따라 다릅니다. 스펙을 가장 엄격하게 읽으면 출력 뒤에 공백이 없습니다. 그러나 이것이 재미 있다고 생각하면 문제가 없습니다.
nharren

입력을 받기위한 명령 행 인수가 허용됩니까?
Joey

요구 사항을 충족하는 한. Whitledge의 솔루션이 실제로 줄 바꿈을 입력으로 처리 할 수 ​​없다는 것을 알았습니다 (공개를 취소 할 수는 없습니다). 입력이 없으면 피라미드를 생성하여 간단히 해결할 수 있습니다. 그러나 명령 줄 인수로 줄 바꿈 입력 (\ r 또는 \ n이 좋습니다)을 처리 할 수있는 솔루션을 찾을 수 있다면 괜찮습니다.
nharren 2016 년

답변:


4

골프 스크립트, 70 자

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

Ruby 솔루션 의 직접 포트 이므로이 문자를 몇 자씩 줄일 수 있다고 확신합니다.


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]})}

테스트 스크립트 .

무작위 입력은 또한 멋진 이미지를 만듭니다.

무작위 피라미드


$input=Read-Host상단에 추가하면 작동하지만 그렇지 않으면 입력을 요청하지 않습니다. 이것을 어떻게 실행해야합니까?
nharren 2016

@nharren : echo 0 3 4 1|powershell -noprofile -file pyramids.ps1또는 PowerShell에서 '0 1 4 3' | .\pyramids.ps1. 만 수용 할 수있는이, 슬프게도, PowerShell에서 골프와 자주 문제 중 하나를 파이프 된 입력 또는 대화식 입력. PowerShell은 실제로 다른 언어와 환경에 stdin이라는 개념이 없으며 때로는이를 보여줍니다. 작업이 Guess the number 와 같은 대화 형 작업을 명시 적으로 요구하지 않는 한 일반적으로 파이프 입력을 사용 합니다 .
Joey

아 네, 이제 작동합니다. 내 버튼 매쉬로 결과가 나오지 않아서 그 이유를 알 수 없었습니다.
nharren 2016 년

4

하스켈, 148 자

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

나는 이것에 상당히 불만족 스럽다! 너무 길다. 아이디어?


람다 안에서 큰 더미를 ++단일 목록으로 변경하고 concat aka를 사용할 수 있습니다 >>=id. 도움이 될지 모르겠습니다. 다른 요점은 foldr1대신에 사용하는 것입니다 foldr.
FUZxxl

아이디어 주셔서 감사합니다. 이 경우에도 도움이되지 않습니다 : ++시퀀스를 변환 하면 항목 당 하나의 문자 만 저장되며 최종 결과의 오버 헤드 concat가 너무 높습니다. 는 foldr사용 할 수없는 foldr1결과 시간이 같은 양식을 String목록 형태 인 반면 [Int]합니다 ( 1변종 fold들이 동일하게해야합니다.)
MtnViewMark

4

파이썬, 123 자

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:]

호기심 에서이 파이썬 2.5입니까? 이것을 파이썬 3.2에서 작동시키기 위해 map 함수를 목록 함수로 감싸고 raw_input ()을 input ()으로 변경하고 print를 print ()로 변경했습니다.
nharren

@ nharren : 2.4.4와 2.5.2에서 모두 작동합니다.
Keith Randall

4

루비 1.9, 116 자

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

130 개 126 132 문자

$_=<>;$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}

stdin이 아닌 명령 행 인수로 입력을받는 약간 짧은 버전 :

$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}

아무도 정규식 솔루션을 아직 사용하지 않았다고 믿을 수 없습니다. Perl은 제 최고의 언어가되기에 먼 길이므로, 아마도 더 많이 잃을 수도 있습니다. 누군가 도전에 직면하면 sed 구현을보고 싶습니다.

(4 개의 문자에 대해 @mbx 감사합니다).


foreach ==
for-

주어진 테스트 케이스로 버전을 테스트 했습니까?!
mbx 2018 년

@ mbx는 그렇습니다. Perl 5.10.1, 우분투. 당신은 어떤 버그를보고 있습니까?
피터 테일러

@ 피터 테일러-내 우분투와 win32에서도 잘 작동합니다. 먼저 perl 5.12.1을 실행하는 ideone에서 시도했습니다 .
mbx

2
»입력이 줄 바꿈으로 만 구성된 경우«실제로 표준 입력에 대한 힌트입니다.
Joey

1

자바 스크립트, 396 바이트

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로 이길 수는 없지만 지금 JavaScript 항목이 있습니다 :)

사용법 : _("1 2 3")


1

루비 (112)

다른 접근 방식으로 Ventero의 Ruby 솔루션보다 약간 짧습니다. 방금 Ruby를 배우기 시작했기 때문에 아마도 약간 줄어들 수 있습니다.

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 바이트, 사양을 가장 엄격하게 읽습니다.

migimaru의 답변 에서 -7 바이트 .

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

테스트 스크립트 :

$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 
}

산출:

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

Powershell, 101 94, 하나의 선행 공백으로 재미 있음

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

0

이보다 짧은 C # 3 버전을 얻을 수 없습니다. 나는 문자 수를 정확히 알지 못하지만 잃어버린 것 같습니다. :-(

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과 Code Golf를 우연히 혼동 했습니까?
Joey

1
최소한 시도하는 척하십시오. 골프를 타면 사람들이 당신에게 장황한 말을하지 않습니다 .
dmckee --- 전 변조 고양이 새끼

나는 그것이 당신의 멋진 트릭을 설명하는 당신의 장황한 버전이라고 생각합니다. 골프 버전을 게시하지 않은 것 같습니다.
mbx

@Joey, @dmckee-골프 버전에 대해 생각했지만 그 문제를 해결하지 못했습니다. 나는 어쨌든이 게임에 끔찍하다. 모호한 코드는 내 본성과 완전히 반대입니다. 나는 골프 퍼즐에서 멀리 떨어져 있어야한다! -@mbx-슬프게도 멋진 트릭은 없습니다.
Jeffrey L Whitledge
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.