Создать бинарную линейку


22

Учитывая число n , сгенерируйте первые n столбцов этого шаблона:

                               #
               #               #
       #       #       #       #
   #   #   #   #   #   #   #   #
 # # # # # # # # # # # # # # # #
################################ ...

Высота столбца в (1-индексированном) n - это число конечных 0битов в двоичном представлении n плюс один. В результате нижний слой заполнен каждым столбцом, второй - каждым вторым, третий - каждым четвертым и т. Д.

правила

  • Вы можете вводить и выводить любым стандартным способом.
  • Вы можете предположить, что ввод является целым числом от 1 до 999 включительно.
  • Вывод может содержать любое количество пробелов, если шаблон не поврежден.
  • Шаблон должен быть 1-индексирован и иметь тот же формат, что и здесь.
  • Вы можете использовать любой отдельный непробельный символ вместо #, но вы не можете изменять пробел.

Контрольные примеры

1
#

2
 #
##

3
 # 
###

4
   #
 # #
####

5
   # 
 # # 
#####

7
   #   
 # # # 
#######

32
                               #
               #               #
       #       #       #       #
   #   #   #   #   #   #   #   #
 # # # # # # # # # # # # # # # #
################################

Несколько больших тестовых случаев можно найти здесь .

счет

Это , поэтому выигрывает самый короткий код в байтах на каждом языке.



Теперь я могу измерять расстояние в двоичном виде! Ой, подождите ...
Okx

2
1. Линейка должна быть горизонтальной? 2. Должна ли быть маркировка #?
Джонатан Аллан

1
@JonathanAllan 1. Да и 2. Нет, они могут быть любыми непробельными символами. Я добавил это к правилам.
ETHproductions

Последовательность в OEIS: A001511
Не дерево

Ответы:


11

Python 2 , 54 байта

i=n=input()
while i:i-=1;print((' '*~-2**i+'#')*n)[:n]

Попробуйте онлайн!

Печать с большим количеством пробелов. Каждый ряд с iобратным отсчетом nповторяет последовательность 2**i-1пробелов, за которыми следует символ #. Этот шаблон повторяется до ширины линейки, которая является входной n. Это делается путем умножения строки шаблона на nи взятия первых nсимволов с [:n].

Шаблон может быть создан путем форматирования строки для альтернативы равной длины.

i=n=input()
while i:i-=1;print('%%%ds'%2**i%'#'*n)[:n]

Симпатичный метод нарезки длиннее.

n=input();s=~-2**n*' '+'#'
exec"s=s[1::2]*2;print s[:n];"*n

Это ~ -1 или +1?
Стэн Струм

Не берите в голову, это (-x) - 1
Стэн Струм

10

Python 3 , 74 байта

n=int(input())
a=1
while a<n:a*=2
while a:print(("%%%dd"%a%4*n)[:n]);a//=2

Попробуйте онлайн!


Вау, мне понадобилось время, чтобы понять, как генерируются строки. Отлично сработано.
ETHproductions

2
a=2**len(bin(n))72 байта
OVS

2
Он быстро обнаружит ошибки памяти и напечатает кучу лишних пробелов (разрешено) - но вы можете сделать 54, используя Python 2 .
Джонатан Аллан

9

V , 17 , 16 байтов

é#Àñä}Är {ñÎÀlD

Попробуйте онлайн!

HexDump:

00000000: e923 c0f1 e416 7dc4 7220 7bf1 cec0 6c44  .#....}.r {...lD

Спасибо @KritixiLithos за сохранение одного байта!

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

Он работает, генерируя первые n итераций следующего шаблона:

#

 #
##

   #
 # #
####

       #
   #   #
 # # # #
########

               #
       #       #
   #   #   #   #
 # # # # # # # #
################

                               #
               #               #
       #       #       #       #
   #   #   #   #   #   #   #   #
 # # # # # # # # # # # # # # # #
################################

И затем отрубая все кроме первых n столбцов. Таким образом, это приведет к появлению тонны пробелов, но ОП сказал:

Вывод может содержать любое количество пробелов, если шаблон не поврежден

Объяснение:

é#                      " Insert an '#'
  Àñ           ñ        " 'N' times:
    ä<C-v>}             "   Duplicate every line blockwise (duplicating horizontally instead of vertically)
           Ä            "   Duplicate the top line. This conveniently puts us on the first non-whitespace character (that is, '#')
            r           "   Replace this character with a space
              {         "   Move to the beginning of the buffer
                Î       " On every line:
                 Àl     "   Move 'N' characters to the right ('l' for right, makes sense, right?)
                   D    "   And delete everything after the cursor

Я не совсем уверен, но я думаю, что вы можете удалить |.
Kritixi Lithos

@KritixiLithos Ага! Оглядываясь назад, это так очевидно! Спасибо за совет. :)
DJMcMayhem

5

JavaScript (ES6), 61 58 байт

f=(n,c=n,s='')=>c?f(n,c>>1,s+s+' ')+`
`+(s+1).repeat(c):''

Благодаря @ETHProductions сохранено 1 байт, затем еще 2 байта, когда я увидел, что можно использовать любой символ.

Рекурсивное решение.

Тестовые случаи:

Анимация:


1
Отлично сработано. Вы можете изменить , c/2|0чтобы c>>1сохранить байты.
ETHproductions

Хорошо, мне нужно освежить свои побитовые операторы.
Рик Хичкок

4

APL (Дьялог) , 21 байт

'# '[1+⊖0⍪∨⍀⊖2⊥⍣¯1⍳⎕]

Попробуйте онлайн!

'# '[… `] Индексировать строку с

 получить вход

 что я много

2⊥⍣¯1 преобразовать в двоичный файл, используя столько цифр, сколько необходимо (одно число в каждом столбце )

 перевернуть с ног на голову

∨⍀ вертикальное кумулятивное уменьшение ИЛИ

0⍪ конкатенировать нули сверху

 перевернуть вверх дном (то есть вернуться снова)

1+ добавить один (для индексации на основе 1)





2

Джапт , 20 17 байт

Сохранено 3 байта благодаря @Shaggy и @ETHproductions

õ_¤q1 o Ä ço÷z w

Попробуйте онлайн!

Объяснение:

Вход: 5

õ_¤q1 o Ä ço÷z w
õ           Ã       // Create a range [1...Input] [1,2,3,4,5]
 _                  // Map; At each item:
  ¤                 //   Convert to binary        ["1","10","11","100","101"]
   q1               //   Split on "1"             [["",""],["","0"],["","",""],["","00"],["","0",""]]
      o             //   Get the last item        ["","0","","00",""]
        Ä           //   Add 1                    [["1","01","1","001","1"]]
          ço        //   Fill with "o"            ["o","oo","o","ooo","o"]
             ·      // Join with new-lines        ["o\noo\no\nooo\no"]
              z     // Rotate 90 degrees          ["ooooo\n o o \n o   "]
                w   // Reverse                    ["   o \n o o \nooooo"]


@ Shaggy На самом деле, вам даже не нужныl
ETHproductions

@ETHproductions: да, только что понял это. 18 байт
Мохнатые


Крутой трюк с побитовыми операторами состоит в том, n&-nчтобы захватить только последние 1и все конечные 0s n. Не уверен, что это поможет, но стоит
попробовать

2

C 84 74 байта

f(i,l,m){putchar(32+3*!(i&m));i<l?f(i+1,l,m):m?putchar(10),f(1,l,m>>1):1;}

Ungolfed:

void f(int counter, int length, int mask) {
    putchar((counter&mask) ? ' ' : '#');
    if(counter<length) {
        f(counter+1, length, mask);
    } else if(mask) {
        putchar('\n');
        f(1, length, mask>>1);
    }
}

Тест с:

int main() {
    f(1, 32, 1023);
    putchar('\n');
    f(1, 1, 1023);
    putchar('\n');
    f(1, 999, 1023);
    putchar('\n');
}

объяснение

Еще раз, рекурсия требует меньше символов в C, чем итерация, поэтому два цикла выражаются как два рекурсивных вызова.

Кроме того, C является отличным языком для трюков с булевыми выражениями, позволяя #решить, ставить ли пробел или a в выражении 32+3*!(i&m). Пробел имеет значение ASCII 32, то #есть ASCII 35, поэтому мы получаем пробел, если какой-либо из битов в маске установлен i.


Вам вообще нужно int i,l,m?
Захари

@ ZacharyT Нет, оказывается, я не сделал. Спасибо за сохранение этих 10 байтов :-)
cmaster - восстановить

2

Pyth , 15 байт

j_.tm*Nhx_.Bd1S

Попытайся!

объяснение

j_.tm*Nhx_.Bd1S
    m         SQ   # map over the numbers from 0 to the implicit input (lambda variable: d)
          .Bd      # Convert d to a binary string: (12 -> 1100)
         _         # reverse: (1100 -> 0011)
        x    1     # get the location of the first 1 ( 2 )
     *Nh           # make one more than that " quotation marks (""")
 _.t               # transpose the list of quotation mark strings and reverse it
j                  # join on newline

@JasonS Это язык для гольфа, основанный на Python! Я сейчас связал Python с GitHub . Я думал, попробуйте! Ссылка на онлайн-исполнителя будет достаточно.
КарлКастор


1

JavaScript (ES8), 71 байт

Функция padStart () была введена в ECMAScript 2017!

N=>eval(`for(s='',n=1;n<=N;n*=2)s='\\n'+'#'.padStart(n).repeat(N/n)+s`)


JavaScript (ES6), 77 байт

N=>eval(`for(s='',n=1;n<=N;n*=2)s='\\n'+(' '.repeat(n-1)+'#').repeat(N/n)+s`)


1
@RickHitchcock Исправлено.
darrylyeo


1

( WESRRICICSE ): 237 байтов

IF(ROW()<=FLOOR(LOG(COUNTA(R1C:R[-1]C,R[1]C:R[1024]C)+1,2),1)+2,LEFT(REPT(REPT(" ",FLOOR(POWER(2,LOG(COUNTA(R1C:R[-1]C,R[1]C:R[1024]C)+1,2)-ROW()+2),1)-1) &"#",COUNTA(R1C:R[-1]C,R[1]C:R[1024]C)+1),COUNTA(R1C:R[-1]C,R[1]C:R[1024]C)+1),"")

Хорошо. 'время плевать

Прежде всего, замените каждый COUNTA(R1C:R[-1]C,R[1]C:R[1024]C)+1на просто [i], для ввода. токен подсчитывает количество ячеек, не включая себя, которые содержат формулу, а затем добавляет одну, чтобы включить себя. Поскольку WESRRMICGSE перетаскивает формулу в соответствии с введенным вами вводом, этот токен всегда приводит к вводу.

у нас есть:

IF(ROW()<=FLOOR(LOG([i],2),1)+3,LEFT(REPT(REPT(" ",FLOOR(POWER(2,LOG([i],2)-ROW()+2),1)-1) &"#",[i]),[i]),"")

Это гораздо более читабельно. Вы будете часто видеть FLOOR(LOG([i],2),1)токен, что означает просто взять ближайшую степень 2, которая меньше, чем число input ( [i]). например: 4->4, 5->4, 6->4, 7->4, 8->8 ...etc. Я заменю этоGS[[i]]

IF(ROW()<=GS[[i]]+3,LEFT(REPT(REPT(" ",,FLOOR(POWER(2,LOG([i],2)-ROW()+2),1),1)-1) &"#",[i]),[i]),"")

лучше. Разбивая условие if, мы проверяем, меньше ли строка или равна ей GS[[i]]+3, потому что высота всех линейок равна GS [[i]] + 1, при этом выбираются строки, равные высоте правитель. +1для строк с 1 индексированием и +1снова для смещения WESRRMICGSE.

FALSEРезультат дает пустую ячейку ( «»), и истинные выходы результатаLEFT(REPT(REPT(" ",,FLOOR(POWER(2,LOG([i],2)-ROW()+2),1),1)-1) &"#",[i]),[i])

в настоящее время все еще редактирую, следите за обновлениями



1

к, 33 байта

`0:|" #"{(1+!x){~y!x}/:(x>)(2*)\1}

Кажется, это работает только в интерпретаторе AW .

Пример этого работает в интерпретаторе AW.

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

`0:|" #"{(1+!x){~y!x}/:{x>y}[x](2*)\1}

1

C #, 174 байта

Этот метод имеет два параметра: вход для длины линейки и вывод, который является линейкой в ​​виде строки.

Golfed:

void R(int n,out string s){var l=new int[++n];int i,x=n,y=0;for(s="";x-->1;)for(i=0;0==(l[x]=(x>>i++&1)*i);y=y<i?i:y);for(y++;y-->0;s+='\n')for(x=0;++x<n;s+=y<l[x]?'#':' ');}

Отступ:

void R(int n,out string s){                       // Return the result in an out parameter.
    var l=new int[++n];                           // Use a 1-based array.
    int i,x=n,y=0;                                //
    for(s="";x-->1;)                              // For each number x on the ruler
        for(i=0;0==(l[x]=(x>>i++&1)*i);y=y<i?i:y) // ... find lowest set bit of x, counting the maximum value.
            ;                                     //
    for(y++;y-->0;s+='\n')                        // Count down each line.
        for(x=0;++x<n;s+=y<l[x]?'#':' ')          // Output # for numbers that are tall enough.
            ;                                     //
}

Попробуйте онлайн!


Будет ли преобразование Func<int, string>сэкономить вам несколько байтов?
TheLethalCoder

1

Древесный уголь , 27 23 байта

↶F…·¹N«Jι⁰#W¬﹪鲫A÷ι²ι#

Попробуйте онлайн! Ссылка на подробную версию кода. Изменить: 4 байта сохранены путем переключения на JumpTo.


Это все еще абсолютно, только теперь это называется JumpTo(извините)
только ASCII

@ ASCII-only Ах, вики может сделать с обновлением. (Или я полагаю, что смогу сделать это, если вы захотите дать мне разрешение на редактирование ...)
Нил

@ Только для ASCII Да, я должен был вспомнить это с codegolf.stackexchange.com/a/119904 ...
Нил

У вас есть аккаунт на GitHub?
Только для ASCII

@ ASCII-только у меня есть два ... Я не могу решить, какой из них является более подходящим ...
Нил

1

J, 38 байт

3 :'|.|:''#''#~,.(1+|.i.1:)@#:"0>:i.y'

Не хорошо. Lmk, если счетчик байтов выключен - я на своем телефоне.


Похоже, 38 для меня, если только 3в начале не
вводится

@ETHproductions спасибо, переключение стыда с молчаливого определения не спасло ни одного байта ...
Коул

1
28 байтов с0|.@|:'#'#"0~1#.2~:/\i.#:@,]
милями

0

Java (OpenJDK 8) , 91 байт

n->{int i=10,j;String s="";for(;i-->0;s+="\n")for(j=0;j++<n;)s+=j>>i<<i<j?' ':35;return s;}

Попробуйте онлайн!

Ungolfed:

n->{
    int i=10,j; // Since we are allowed extra whitespace, set columns always to 10
    String s = "";
    for(;i-->0;s+="\n")      // Every iteration add a newline, i=9..0
        for(j=0;j++<n;)      // j=1..n+1
            s+= j>>i<<i<j    // if j has less than i trailing 0s in binary form
                ?' '         // add a space else
                :35          // # (java handles ternary return types weirdly)
}



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