Відбудова міста ASCII


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

Люди ASCIIville відновлюють своє місто і накреслюють нові креслення. Ваше завдання - намалювати їх нове місто, виходячи з того, скільки будівель вони хочуть.

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

Наведемо основний приклад 4

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

Як ви бачите тут, |у кожній будівлі є два s, оскільки вхід був чотири. Але є улов! (тобто приклад, наведений вище, невірний, а приклад вгорі цієї публікації - це реальний вихід для 4)

Для кожної будівлі, яка не є простим числом, її висота зменшується на одиницю. Якщо число ділиться на 3 , 5 або 10 , воно знижується ще на одне. Якщо воно ділиться на два або більше з цих чисел, сума, що віднімається, складає ( 10 ділиться на 10 і 5, і це не є простим, тому вона вилучається на 3 ).

Давайте розглянемо приклад із введенням 5.

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

Ось приклад 7

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

І приклад 10

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

І повернутися до 6

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

Правила:

  • Якщо число вилучається настільки, що його висота менша або дорівнює нулю, воно не відображається, але для нього залишився пробіл (я не вірю, що це можливо, 6це найближче до мене значення, яке я знайшов) .
  • Додаткові місця доступні.
  • Ширина кожної будівлі повинна бути 2.
  • Ваш вклад може бути від stdin або закодований в програму.
  • Ваша програма повинна бути повноцінною програмою , ніяких функцій.
  • Ваша програма повинна вміти 4-15 версій. 0-3 і мінусові цифри не потрібні і не вказані, щоб нічого робити, тобто вони можуть викинути помилку, надрукувати сміття або нічого не робити.

@isaacg Yup! Щойно це зафіксували
фаза

1
1 не є простим числом. З прикладів виглядає, що ви віднімаєте 1 з висоти, якщо індекс (на основі 1) складений, а не непростий.
Денніс

Зауважте, що стандартне вікно на 80 символів консолі вмістить лише 16 будівель, що може зробити вимогу до 20 будівель трохи потворною.
Hand-E-Food

@ Hand-E-Food Дякую, що згадуєте про це! Я змінив це, щоб ви розмістили будівлі на нових лініях.
фаза

@ Денніс Я не був впевнений, чи потрібно робити Фібоначчі чи прості числа, тому один був утриманий від цього. Просто виправили!
фаза

Відповіді:



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

Пітон 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

Свіфт, 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.