Восстановление города ASCII


17
     + - +
+ - + | | + - + + - +
| | | | | | | |
+ - + + - + + - + + - +

Жители ASCIIville восстанавливают свой город и набрасывают новые чертежи. Ваша задача - нарисовать их новый город, исходя из того, сколько зданий они хотят.

Входом будет количество зданий. Каждое здание имеет половину высоты входа (округляется, если нечетное), не включая верх и низ здания.

Давайте нарисуем базовый пример 4

+ - + + - + + - + + - +
| | | | | | | |
| | | | | | | |
+ - + + - + + - + + - +

Как вы можете видеть здесь, |в каждом здании есть два s, потому что входное значение было четыре. Но есть подвох! (имеется в виду, что приведенный выше пример неверен, и пример в верхней части этого поста является реальным выводом для 4)

Для каждого здания, которое не является простым числом, его высота уменьшается на единицу. Если число делится на 3 , 5 или 10 , оно уменьшается еще на один. Если он делится на два или более из этих чисел, вычитаемая сумма складывается ( 10 делится на 10 и 5, и это не простое число, поэтому оно вычитается на 3 ).

Давайте посмотрим на пример с входом 5.

     + - +
+ - + | | + - + + - + + - +
| | | | | | | | | |
| | | | | | | | | |
+ - + + - + + - + + - + + - +

Вот пример 7

     + - + + - +
+ - + | | + - + + - + + - + | |
| | | | | | | | | | + - + | |
| | | | | | | | | | | | | |
| | | | | | | | | | | | | |
+ - + + - + + - + + - + + - + + - + + - +

И пример 10

     + - + + - +
+ - + | | + - + + - + + - + | | + - +
| | | | | | | | | | + - + | | | | + - +
| | | | | | | | | | | | | | | | | | + - +
| | | | | | | | | | | | | | | | | | | |
| | | | | | | | | | | | | | | | | | | |
+ - + + - + + - + + - + + - + + - + + - + + - + + - + + - +

И вернемся к 6

     + - +
+ - + | | + - + + - + + - +
| | | | | | | | | | + - +
| | | | | | | | | | | |
+ - + + - + + - + + - + + - + + - +

Правила:

  • Если число вычитается настолько сильно, что его высота меньше или равна нулю, оно не отображается, но для него оставлено место (я не верю, что это возможно, 6является ли это ближайшим к нулю значением) ,
  • Промежуточные пробелы разрешены.
  • Ширина каждого здания должна быть 2.
  • Ваш ввод может быть из стандартного ввода или закодирован в программу.
  • Ваша программа должна быть полной программой , без функций.
  • Ваша программа должна уметь 4-15 сборок. 0-3 и отрицательные числа не нужны и не предназначены для каких-либо действий, то есть они могут выдавать ошибку, выводить мусор или ничего не делать.

@isaacg Ага! Просто исправил это
фаза

1
1 не простое число. Из примеров видно, что вы вычитаете 1 из высоты, если индекс (на основе 1) является составным, а не простым.
Деннис

Обратите внимание, что стандартное 80-символьное окно консоли будет умещаться только в 16 зданиях, что может сделать требования к 20 зданиям немного уродливыми.
Hand-E-Food

@ Hand-E-Food Спасибо за упоминание этого! Я изменил это, чтобы вы поставили здания на новые линии.
фаза

@ Денис Я не был уверен, делать ли Фибоначчи или простые числа, так что один был от этого. Просто исправил это!
фаза

Ответы:


4

CJam, 68 66 58 55 байтов

Это слишком долго на данный момент. Но начало.

ri:K"!;tK"206b4b<{S5*a*"+--+ "a:I+K)2/)"|  | "e]I+}%zN*

ОБНОВЛЕНИЕ: Теперь жесткое кодирование для входов до 15 вместо расчета смещения. Предложение от Sp3000

Попробуйте онлайн здесь


3

Python 2, 247, 245, 237, 229 байт.

I=input()
R=range
B=[(-~I/2)-(x%3<1)-(x%5<1)-(x%10<1)-(~all([x%a for a in R(2,x)]or[x==2])+2)for x in R(1,I+1)]
E='+--+'
O=['\n']*I
for r in R(I):
 for h in B:O[r]+=['|  |',' '*4,E][(r==h)+(r>=h)]
print ''.join(O[::-1])+'\n'+E*I

3

C #, 223 205 байт

Для этого необходимо использовать только 15 зданий.

class P{
    static void Main(string[]a){
        int w=int.Parse(a[0]),
            h=(w+3)/2,
            b,
            x,
            y=-1;
        for(;++y<=h;)
            for(x=-2;++x<w;)
                System.Console.Write(x<0?"\n":(b=y-("012021101211102"[x]&7))<0?"     ":b>0&y<h?"|  | ":"+--+ ");
    }
}

260 байт

И более общий ответ, который будет работать для любого количества зданий.

class P{
    static void Main(string[]a){
        int w=int.Parse(a[0]),
            h=(w+3)/2,
            b,
            x,
            y=-1;
        for(;++y<=h;)
            for(x=-2;++x<w;){
                if(x<1)
                    b=-1;
                else
                    for(b=1;++b<x;)
                        if((x+1)%b<1)break;
                System.Console.Write(x<0?"\n":(b=y-x%3/2-x%5/4-x%10/9-(b<x?0:1))<0?"     ":b>0&y<h?"|  | ":"+--+ ");
            }
    }
}

2

Python 2, 163 байта

n=input()
k=-~n/2
for i in range(k+2):
 s="";p=j=1
 while~n+j:a=(j%3<1)+(j%5<1)+(j%10<1)+(p%j<1);s+=" |+  -  - |+   "[(i>=a)+(i in{a,k+1})::3];p*=j*j;j+=1
 print s

Часть проверки простоты заимствует здесь алгоритм @ xnor .

Если мы жестко закодируем первые 15 смещений, мы можем получить 137 байтов :

n=input()
k=-~n/2
for i in range(k+2):
 s=""
 for j in range(n):a=881740113>>2*j&3;s+=" |+  -  - |+   "[(i>=a)+(i in{a,k+1})::3]
 print s

Я предполагаю, что конечные пробелы в конце каждой строки в порядке, но если вопрос означал завершающие пробелы после всего вывода, то это +9 байт .rstrip().


2

Groovy, 234 , 225 , 223 219 байт

Злоупотребление 15 предел здания

b=args[0]as int
m={n->(n!=2&(2..n-1).any{n%it==0}?1:0)+([3,5,10].sum{n%it==0?1:0})}
(9..0).each{println((1..b).collect{d=((b/2)as int)+1-m(it);(0..9).collect{it!=d&it!=0?it<d?"|  |":"    ":"+--+"}}*.get(it).join(" "))}

2

Swift, 375 , 350 байт

import Darwin;let(B,u,z,d)=(4.0,1.0,0.0,2.0);let H=ceil(B/d);func p(n:Double)->Double{var D=d;while D<n{if n%D==0{return 1};D++};return n==1 ?1:0};for var h=z;h<H+2;h++ {for var b=u;b<=B;b++ {var m=b%3==0 ?u:z+b%5==0 ?1:0;m=min(2,b%10==0 ?m+1:m);m += p(b);if h<m {print("     ")}else if h==H+1||h==m {print("+--+ ")}else{print("|  | ")}};print("\n")}

Вот код с отступом

import Darwin
let(B,u,z,d)=(4.0,1.0,0.0,2.0)
let H=ceil(B/d)
func p(n:Double)->Double{
     var D=d
    while D<n{
        if n%D==0{
            return 1
        }
        D++
    }
    return n==1 ?1:0
}
for var h=z;h<H+2;h++ {
    for var b=u;b<=B;b++ {
        var m=b%3==0 ?u:z+b%5==0 ?1:0
        m=min(2,b%10==0 ?m+1:m)
        m += p(b)
        if h<m {
            print("     ")
        }
        else if h==H+1||h==m {
            print("+--+ ")
        }
        else{
            print("|  | ")
        }
    }
    print("\n")
}

Bсодержит количество зданий.
pвозвращает 1, когда число не простое.

Мне нужно импортировать Фонд для того, чтобы использовать ceilфункцию.

Мне не удалось оптимизировать код только для пятнадцати случаев, но в конечном итоге я сделаю это позже.

редактировать: Принимая советы @Kametrixom и оптимизировать modчасть (я забыл уменьшить длину имени var).


1
Вы можете заменить Foundationна, Darwinчтобы сохранить несколько байтов
Kametrixom

-1 с import UIKitвместо import Darwin.
Cœur
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.