Об’єднайте N копій фрагмента, щоб створити N ^ 2 символів


30

Виклик

Напишіть можливий найкоротший фрагмент коду таким чином, що, коли N його копій з'єднані разом, кількість виведених символів становить N 2 . N буде натуральним числом.

Наприклад, якщо фрагмент був soln();, тоді біг soln();надрукував би рівно 1 символ, а біг soln();soln();надрукував би точно 4 символи, а біг soln();soln();soln();надрукував би точно 9 символів тощо.

Будь-які символи можуть бути у висновку, якщо загальна кількість символів є правильною. Щоб уникнути плутанини між ОС, \r\nнові рядки зараховуються як один символ.

Програми можуть не читати власне джерело чи читати їх розмір файлів або використовувати інші подібні лазівки. Ставтесь до цього, як до суворої проблеми з

Вихід може перейти в stdout або файл або подібну альтернативу. Введення немає.

Коментарі в коді прекрасні, як і вихід із середини виконання.

У програмі можуть бути будь-які символи. Виграє найкоротше подання в байтах .


Чи потрібно програму припинити?
Мартін Ендер

@ MartinBüttner Так
захоплення Кальвіна

Відповіді:


24

TECO, 4 байти

V1\V

Vдрукує вміст поточного рядка в текстовому буфері. 1\вставляє рядкове подання числа 1 у поточну позицію.

Так на N- й ітерації програми перший Vвиведе N - 1 копії символу 1, потім додасть ще один 1текст, потім виведе N 1 s.


1
Чи можете ви додати посилання на TECO?
Erik the Outgolfer

22

Brainfuck, 17 16 байт

[>+>-..+<<-]-.>+

Ви можете протестувати його тут . Просто використовуйте той факт, що .n2+2n+1=(n+1)2


16
Не можу повірити, що бачу BF на конкурентному рівні байтів!
agweber

21

Brainfuck, 11

Я побачив першу відповідь Brainfuck і подумав, що це занадто довго :)

[.<]>[.>]+.

Вихід може бути легше зрозуміти, якщо ви заміните плюс набагато більше плюсів.

На N-й ітерації кожен цикл видає N - 1 копії символу зі значенням ASCII 1, а потім ще одну з +..


Вам потрібно надрукувати N ^ 2 символи, а не N символів. Я не можу прочитати BF-код, тому не знаю, чи ваш код неправильний чи ваш опис невірний.
Брайан Дж

@BrianJ Він друкує N ^ 2 символів. Ви можете перевірити його тут: copy.sh/brainfuck Замініть плюс мінусом, якщо ви не бачите вихід.
алефальфа

@alephalpha На жаль, я бачу, що я неправильно прочитав коментар. Код не робить (N - 1) + 1, як я вважав спочатку.
Брайан J

16

Пітон 2, 22

a='';print a;a+='xx';a

Друкує порожній рядок, потім два x's, потім x' чотири тощо. З новим рядком після кожного рядка це виходить для n*nсимволів.

Один примірник: "\n"(1 знак)
Два примірники: "\nxx\n"(4 символи)
Три примірники: "\nxx\nxxxx\n"(9 символів)

Щоб запобігти aповторній ініціалізації початкової змінної , я закінчую код символом a ;a, який є доброякісним самостійно, але поєднується з наступним циклом, щоб створити aaзамість цього козла відпущення . Ця хитрість не моя; Я це бачив у попередній відповіді. Буду вдячний, якщо хтось міг би вказати на мене, щоб я міг дати кредит.


Власне, друкується підсумковий новий рядок?
xnor

ні, я не думаю, що друкується остаточний новий рядок. Але просто видалити ,після цього print aслід. print aдрукує новий рядок після кожного друку.
Джастін

@Quincunx О, звичайно, дякую!
xnor

Ви говорите про цю посаду ?
Sp3000

10

CJam, 6 байт

LLS+:L

Використовує той факт, що .n2 + n + (n+1) = (n+1)2

L      "Push L. Initially this is an empty string, but its length increases by 1 with each copy
        of the snippet.";
 L     "Push another L.";
  S+   "Add a space to the second copy.";
    :L "Store the lengthened string in L for the next copy of the snippet.";

:L..1+така ж ідея в GolfScript.
Пітер Тейлор

@PeterTaylor Я думав ..n+у GolfScript, але цей прискіпливий трейлінг нового рядка ... :(
Мартін Ендер

Га, ти маєш рацію. Немає потреби, :Lтому що не використовується.
Пітер Тейлор

10

/// , 21 байт

Я впевнений, що існує справді короткий і кручений спосіб вирішити це в ///, але я нічого не міг знайти, окрім "прямого" шляху:

1/1\//112\///2\//1\//

Це засновано на підході до друку послідовних непарних чисел. Фрагмент складається з 1початку, який друкується, та двох замін, які додають ще дві 1s до першої частини кожної послідовної копії фрагмента. Перейдемо до цього N = 3. У групах з 3 або більше рядків слід прочитати: 1. поточний код, 2. оброблені маркери, 3. (і наступний) коментар, що робить вищевказаний маркер.

1/1\//112\///2\//1\//1/1\//112\///2\//1\//1/1\//112\///2\//1\//
1
is printed
/1\//112\///2\//1\//1/1\//112\///2\//1\//1/1\//112\///2\//1\//
/1\//112\//
replaces all occurrences of 1/ with 112/. This affects the starts of all further snippets
but not the substitution commands, because the slashes in those are always escaped.
It is necessary to put a 2 in there, because otherwise the interpreter goes into an infinite
loop replacing the resulting 1/ again and again.
/2\//1\//112/1\//112\///2\//1\//112/1\//112\///2\//1\//
/2\//1\//
Replace all occurrences of 2/ with 1/, so the the next snippets substitution works again.
111/1\//112\///2\//1\//111/1\//112\///2\//1\//
111
is printed
/1\//112\///2\//1\//111/1\//112\///2\//1\//
/1\//112\//
add two 1s again
/2\//1\//11112/1\//112\///2\//1\//
/2\//1\//
turn the 2 into a 1 again
11111/1\//112\///2\//1\//
11111
print 11111
/1\//112\///2\//1\//
the last two substitutions have nothing to substitute so they do nothing

Цікаво, що він працює так само добре, якщо рухатись 1до кінця:

/1\//112\///2\//1\//1

7

> <> , 14 байт

1:na*a*';'10p!

Використовує ідею "сума послідовних непарних цілих чисел, починаючи з 1". Він починається з 1 і помножує його на 100 щоразу, збільшуючи поступово довжину виходу з кроком по 2.

Наприклад, додавання 5 примірників дає

1100100001000000100000000

Я перевірив, запираючи вихід у файл, і не побачив зворотного нового рядка.

Зламатися

1                   Push 1, skipped by ! every time except the first
 :n                 Copy top of stack and output as num                  
   a*a*             Multiply by 10 twice
       ';'10p       Modify the source code so that the first : becomes a ; for termination
             !      Skip the next 1

5

CJam, 10 9 байт

],)_S*a*~

Це друкує пробіли N 2, де Nкількість копій коду.

Розширення коду :

],            "Wrap everything on stack and take length";
  )_          "Increment and take copy";
    S*        "Get that length space string";
      a*      "Wrap that space string in an array and create that many copies";
        ~     "Unwrap so that next code can use to get length";

Спробуйте його онлайн тут



5

Java - 91 байт

{String s=System.getProperty("a","");System.out.println(s);System.setProperty("a","xx"+s);}

Це рішення еквівалентне іншому в Python. Це точно не виграє, але це було весело :)


Вам не потрібен клас, щоб щось запустити?

Ні, оскільки ОП просила фрагменти коду. Можна припустити, що це працює, наприклад, у магістралі.
cygnusv

Тоді у мене є 59 або навіть 44 байт рішення.

Класно :) Я віддаю перевагу однолінійним, але ваш справді коротший!
cygnusv

4

Perl, 14 байт

print;s//__/;

Це потрібно виконувати з Perl -l командного перемикача , який призводить printдо додавання нових рядків.

Він друкує змінну за замовчуванням $_, а потім попереджує дві підкреслення за допомогою підстановки.

Приклад:

$ perl -le 'print;s//__/;print;s//__/;print;s//__/;print;s//__/;'

__
____
______

прапори рахуються як ще 1 байт на прапор
Оптимізатор

Про що say?
hmatt1

@chilemagic Я спробував це, але мені не вдалося змусити його працювати над моїми версіями Perl.
гр.ч.

@grc, це версія 5.10 і новіша, і вам потрібно -E.
hmatt1

@chilemagic хм, це, здається, не працювало для мене 5.16.
grc

4

Brainfuck, 10 символів

Обидва попередніх рішень Brainfuck були waaay занадто довго (16 і 11 символів) , тому тут коротший:

+[.->+<]>+

У n-м блоці він виводить 2*n-1символи (з кодовими точками від 2*n-1до 1)


2
Це не працюватиме в стандартному обміні можливостей, лише якщо клітини необмеженого розміру. Насправді, це теж не мало б сенсу. Як виводити код символу 1 трлн?
feersum

3

Прелюдія , 18 12 байт

^1+(9!1-)#2+

Це друкує N 2 вкладки. Вона передбачає стандартний сумісний інтерпретатор , який друкує символи замість цифр, так що якщо ви використовуєте в Python інтерпретатор вам потрібно встановити NUMERIC_OUTPUTна False.

Ідея полягає у тому, щоб просто використовувати верхню частину стека (що спочатку становить 0) як 2(N-1)та друкувати 2N-1вкладки, потім збільшити верхню частину стека на 2. Отже, кожне повторення друкує наступну непарну кількість вкладок.


3

Java - 59/44 (залежно від вимог)

static String n="1";
static{System.out.print(n);n+="11";}//

Мабуть, нам дозволяється припускати, що код працює в класі.

Якщо він може входити до основного методу:

String n="1";
System.out.print(n);n+="11";//

3

C, 87 байт

#if!__COUNTER__
#include __FILE__
main(a){a=__COUNTER__-1;printf("%*d",a*a,0);}
#endif

Для цього використовуються два магічні макроси. __COUNTER__це макрос, який розширюється 0в перший раз, коли він використовується, 1другий і т. д. Це розширення компілятора, але він доступний як принаймні в gcc, clang та Visual Studio.__FILE__- це ім'я вихідного файлу. Включення файлу в C / C ++ буквально те саме, що вставити його безпосередньо у свій вихідний код, тому використовувати його було трохи складно.

Ще можна було б без цієї методики використовувати __COUNTER__. У цьому випадку для #ifоператора __LINE__може використовуватися стандартний захист від використання коду двічі і може використовуватися для підрахунку кількості необхідних символів.


Це рішення пишеться не на мові С, а на діалекті С. Будь ласка, виправте назву мови.
FUZxxl

2
@FUZxxl Більшість відповідей на код-гольф розроблені лише для роботи в gcc, тому я не впевнений, чому це буде проблемою.
feersum

Це не так, але вам слід справді заявити про це.
FUZxxl

Я збентежений. Навіщо заявляти про невипуск? O_o
corsiKa

@corsiKa Це лише питання, якщо ви це заявляєте. C gcc говорить не стандартно C.
FUZxxl

2

Діалог APL, 20 19 байт

Рішення на основі матриці.

{⍺≢⍵:⍵⍪⍵,⍺⋄∊⍺}⍨⍪'a'

Спробуйте тут . Повертає рядок повторів . Пояснення вибухом для :N2aN = 2

{⍺≢⍵:⍵⍪⍵,⍺⋄∊⍺}⍨⍪'a'{⍺≢⍵:⍵⍪⍵,⍺⋄∊⍺}⍨⍪'a'
                                  ⍪'a'  Wrap 'a' into a 1x1 matrix.
                'a'{            }⍨      Binary function: bind 'a' to ⍵ and the matrix to ⍺.
                    ⍺≢⍵:                The arguments are not identical,
                        ⍵⍪⍵,⍺           so add to the matrix 1 column and 1 row of 'a's.
               ⍪                        Identity function for a matrix.
{            }⍨                         Unary function: bind the matrix to both ⍵ and ⍺.
 ⍺≢⍵:                                   The arguments are identical,
           ∊⍺                           so flatten the matrix into the string 'aaaa'.

2

СТАТА 20

di _n($a)
gl a=$a+2

Існує новий трейлінг, щоб переконатися, що оператор display (di) працює. Спочатку відобразіть поточне число у $ a нових рядках (та ще одне додаткове від показника за замовчуванням). Потім додайте 2 до $ a.

Кожен раз використовує підхід парних чисел (тобто наближення непарних чисел до мінус 1).


2

T-SQL 117

IF OBJECT_ID('tempdb..#')IS NULL CREATE TABLE #(A INT)INSERT INTO # VALUES(1)SELECT REPLICATE('a',COUNT(*)*2-1)FROM #

Зверніть увагу на пробіл, щоб переконатися, що умова if щоразу перевіряється.

Використовується підхід непарних чисел. Не впевнений, чи є новий рядок для вибраних операторів.

Не впевнений, чи існує коротший спосіб створити таблицю, якщо її не існує.


2
Кудо вам для незвичайного вибору мови.
Xynariz

2

PostScript, 35 символів

count dup 2 mul 1 add string print

Кожен прохід "витікає" одну штуку на стеку, так count щоразу піднімається на 1. Тоді він використовує суму хитрості нечетних чисел.

Вихід байтів - це все, \000тому що це початкове значення рядків.


2

Хаскелл, 72

putStr$let a="1";aputStr=(\n->take(n^2)$show n++cycle" ").(+1).read in a

Пояснення

Оператор застосувань $діє так, ніби ви розміщуєте навколишні дужки навколо решти рядка (є винятки з цього, але він працює в цьому випадку). aputStr- це функція, яка приймає рядок у форматі "abc ...", де "abc" - квадратний корінь довжини рядка, включаючи abc. Він буде розбирати рядок як ціле число, а також повертати рядок, починаючи з abc + 1 і маючи цю довжину у квадраті. Через $оператора це буде викликано рекурсивно в "1" N разів.


1

Pyth, 8 байт

*d*2Z~Z1

Це спирається на те, що N 2 дорівнює сумі Nнепарних чисел. Тепер Pyth автоматично друкує новий рядок, так що я повинен просто надрукувати Z * 2символи в кожному коді , де Zйде від 0до N - 1.

Розширення коду :

*d               "Print d whose value is a space character"
  *2Z            "2 * Z times where Z's initial value is 0"
     ~Z1         "Increment the value of Z";

Спробуйте його онлайн тут


1

Гольфлуа, 23 байти

X=2+(X|-2)w(S.t("&",X))

виводить комбінацію символів &та \nсимволів.

Еквівалентний код Lua

X = 2 + (X or -2)          -- initialize X to 0 the first time, add 2 ever other time

print(string.rep("&", X))

Щоразу, коли фрагмент коду запускається, він видає на 2 більше символів виводу, ніж останній раз, починаючи з 1 символу. printФункція додає символ нового рядка, так що я ініціалізувати X до 0 замість 1.


0

ActionScript - 27/26 байт

var n=""
trace(n);n+="11"//

або

var n=1
trace(n);n+="11"//

Як це працює:

var n=""
trace(n);n+="11"//var n=""
trace(n);n+="11"//

Він просто коментує перший рядок. Примітка: traceдодає новий рядок. Або, можливо, всі IDE, які я використовую, роблять це автоматично.


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.