Просто повторіть себе


64

Напишіть програму, яка виводить

Do not repeat yourself!

Ваш програмний код повинен відповідати таким обмеженням:

  • його довжина повинна бути парним числом
  • кожен символ, який знаходиться в положенні 2n(де nціле число> 0), повинен дорівнювати символу в позиції 2n-1. Другий символ програми дорівнює першому, четвертий дорівнює третьому тощо.

Нові рядки вважаються символами!

Це код-гольф, тому найкоротший код виграє!

Приклади

HHeellllooWWoorrlldd є дійсною програмою

123або AAABBBабо HHeelloневірні

Перевірка

Ви можете використовувати цей скрипт CJam для підтвердження того, що ваш вихідний код є дійсним. Просто вставте свій код у поле "Введення" та запустіть сценарій.


51
Факт веселощів: Якщо натомість у проблеми були трійки, це DDDooo nnnooottt rrreeepppeeeaaattt yyyooouuurrrssseeelllfff!!!була б коректна відповідь у Trigger
Sp3000

14
Я думав, що це може бути занадто обмежуючим, але шквал відповідей доводить мене неправильно. Приємне запитання!
трихоплакс

Для задоволення цих вимог у Haskell знадобиться досить серйозна розтяжка. Усі форми зв’язування, усі форми умовного вираження, всі способи введення символів і рядків, а також всі способи отримання результату виключаються.
dfeuer

1
Чи може хтось додати фрагмент оцінки? Мені подобається мати такі, і я хочу, щоб у них було запитання.
mbomb007

Усі нинішні відповіді - це езотеричні язики. Цікаво, чи це можливо в звичайному язиці?
DankMemes

Відповіді:


51

Шестикутник , 166 126 124 байт

\\;;;;33rr''22DD..));;;;;;oo;;}}eeoo\\@@nn;;;;ee;;;;aass&&;;uuoo;;;;..\\\\;;ttee..pp;;tt;;;;..rr;;''ll..'';;;;..;;}}ff..}}yy

Вставляючи неявні пробіли та пробіли, це відповідає наступному вихідному коду:

       \ \ ; ; ; ; 3
      3 r r ' ' 2 2 D
     D . . ) ) ; ; ; ;
    ; ; o o ; ; } } e e
   o o \ \ @ @ n n ; ; ;
  ; e e ; ; ; ; a a s s &
 & ; ; u u o o ; ; ; ; . .
  \ \ \ \ ; ; t t e e . .
   p p ; ; t t ; ; ; ; .
    . r r ; ; ' ' l l .
     . ' ' ; ; ; ; . .
      ; ; } } f f . .
       } } y y . . .

Я впевнений, що можна ще більше скоротити це, а можливо, навіть вирішити це в довжину 6, але це стає складніше ...

Як це працює

введіть тут опис зображення

Діаграма, згенерована за допомогою шестигранника Colour Timwi .

Код абсолютно лінійний. \На самому початку перенаправляє IP в діагоналі, так що нам не потрібно турбуватися про здвоєних символів на всіх. Кольорові доріжки виконуються в порядку помаранчевий / червоний, синій / сірий, зелений, фіолетовий (коли є дві доріжки одного кольору, спочатку виконується лівий шлях, перш ніж обернутись правою рукою).

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

D;o;&32;}n;o;t;';}r;e;p;e;a;t;';}y;o;u;r;s;e;l;f;');@

Листи в шестикутнику просто встановлюють значення поточного краю пам'яті на код символу букви. ;друкує поточний край пам'яті як символ. Ми використовуємо &для скидання краю пам'яті до 0та друку пробілу 32;. }переміщується до іншого краю, щоб ми могли запам’ятати 32подальші пробіли. Решта коду просто друкує букви на новому краї і періодично переміщується вперед і назад, ';}щоб надрукувати пробіл. В кінці ми знову переходимо до краю пробілу ', збільшуючи значення до 33, )і друкуємо знак оклику. @припиняє програму.


4
Це дійсно вражає !!!
WizardOfMenlo

Як ви дійшли висновку, що це можливо в розмірі 6 чи навіть 5 ? Я бачу розмір 7 як навіть лише ледве підходить.
Тімві

@Timwi 5, мабуть, трохи надмірно, але, за винятком синглу ;, взагалі немає повторного використання між парними символами в коді. Поточний код - це головне перше, що мені прийшло в голову, тому я думаю, що якщо хтось досить постарався, слід знайти набагато складніше рішення, яке повторно використовувати крапки з комою та, можливо, навіть деякі літери, щоб відповідати цьому в бік довжини 6.
Мартін Ендер

Щоб дістатися до розміру 6, вам доведеться зберегти 36 символів порівняно з розміром 7. Навіть якщо ви використовуєте 6 невикористаних слотів, які ви маєте на даний момент, вам все одно доведеться зберігати 30. Ви можете повторно використовувати кожен ;раз, оскільки ви не може пройти їх по горизонталі. У ;вашому коді всього 23 с, і лише 6 повторень символів (2 × o, 1 × t, 1 × r, 2 × e), що дає лише 29. Особисто це більше ніж переконує мене, що розмір 6 неможливий .. .
Тімві

44

GolfScript, 130 84 76 байт

22..!!..00)){{DDoo  nnoott  rreeppeeaatt  yyoouurrsseellff}}``%%>><<[[33]]++

Спробуйте його в Інтернеті в Web GolfScript .

Як це працює

Інтерпретатор GolfScript починається з розміщення порожнього рядка на стеку.

22 # Push 22.
.. # Push two copies.
!! # Negate the last copy twice. Pushes 1.
.. # Push two copies.
00 # Push 0.
)) # Increment twice. Pushes 2.

   # STACK: "" 22 22 1 1 1 2

{{DDoo  nnoott  rreeppeeaatt  yyoouurrsseellff}}

`` # Push a string representation of the string representation of the block.

   # This pushes "{{DDoo  nnoott  rreeppeeaatt  yyoouurrsseellff}}" (with quotes).

%% # Take every second element of that string, then every element of the result.
>> # Discard the first element of the result. Repeat.
<< # Truncate the result to length 22. Repeat.
[[ # Begin a two-dimensional array.
33 # Push 33, the character code of '!'.
]] # End the two-dimensional array.
++ # Concatenate the empty string, the 22-character string and the array [[33]].

Об'єднання масиву з рядком згладжується, тому результатом є бажаний вихід.


38

Унарний , ~ 1,86 × 10 222

Простий епізод -> одинарна відповідь. Дуже неоптимально;).

Програма складається з парного числа 0; конкретно:

1859184544332157890058930014286871430407663071311497107104094967305277041316183368068453689248902193437218996388375178680482526116349347828767066983174362041491257725282304432256118059236484741485455046352611468332836658716

їх.

Оригінальний код для епізодів:

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

3
Жоден із кодових блоків, які ви надали, не задовольняє правилу подвоєння. Що я пропускаю?
doppelgreener

26
@doppelgreener: Перший блок "коду" - просто велика кількість. Зокрема, кількість 1s в програмі Unary, яка виводить запитуваний рядок. Другий блок коду - це програма BF, яка використовувалася для її створення. Оскільки програма Unary повністю складається з 1s, вона тривіально задовольняє вимогу повторення.
El'endia Starman

8
Також кількість нулів є (на щастя?) Парним числом :-)
Арно

1
Я взяв на себе можливість відредагувати відповідь, щоб число не виглядало так, як це повинно бути кодом.
Тімві

2
@Kametrixom - це Голунарський опис програми Unary. Програма Голунар, написана не відповідає умовам.
Paŭlo Ebermann

34

Ruby - 2100 1428 1032 820 670 байт

Це передбачає, що вихід може бути зворотним значенням функції (не було вказано, що вихід повинен бути STDOUT)

Код:

((((((((((((((((((((((((((((((((((((((((((((((""<<66++11**00++11**00))<<99++11++11**00))<<((55>>11**00))++((11>>11**00))))<<99++11))<<99++11++11**00))<<99++((33>>11**00))++11**00))<<((55>>11**00))++((11>>11**00))))<<99++11++((11**00<<11**00<<11**00))))<<99++11**00++11**00))<<99++11++11**00++11**00))<<99++11**00++11**00))<<88++((11>>11**00))++((11**00<<11**00<<11**00))))<<99++((33>>11**00))++11**00))<<((55>>11**00))++((11>>11**00))))<<99++22))<<99++11++11**00))<<99++((33>>11**00))++11**00++11**00))<<99++11++((11**00<<11**00<<11**00))))<<99++((33>>11**00))))<<99++11**00++11**00))<<99++((11>>11**00))++((11**00<<11**00<<11**00))))<<99++11**00++11**00++11**00))<<33))

Трюк полягає в тому, щоб побудувати рядок із порожнього рядка, ""використовуючи операцію додавання <<та коди ASCII символів.

Для отримання чисел для ASCII-кодів я намагаюся розкласти число на значення, які я можу легко генерувати. Наприклад, ASCII 90є справедливим 88+1+1, а саме:

  • 88 все добре
  • 11**00є 11^0, що просто1

На щастя і те, ++і в рубіні --означало б add, так що я можу писати 90як88++11**00++11**00

Існує декілька хитрощів, як дістатися до деяких цифр простіше, ніж просто додавати 1, ось код, який я використовую для створення вищевказаного (який включає всі відображення, які я використовую):

d = "Do not repeat yourself!"

d.each_char do |c|
  print "(("
end

print '""'

VALUES = [
  [0,'00'],
  [1,'11**00'],
  [4,'((11**00<<11**00<<11**00))'],
  [5,'((11>>11**00))'],
  [11,'11'],
  [16,'((33>>11**00))'],
  [22,'22'],
  [27,'((55>>11**00))'],
  [33,'33'],
  [38,'((77>>11**00))'],
  [44,'44'],
  [49,'((99>>11**00))'],
  [55,'55'],
  [66,'66'],
  [77,'77'],
  [88,'88'],
  [99,'99']
].reverse

d.each_char do |c|
  print "<<"
  num = c.ord
  while num != 0
    convert = VALUES.find{|val|val.first<=num}
    print convert.last
    num -= convert.first
    print "++" unless num == 0
  end
  print "))"
end

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

Зауважте, що якщо ви використовуєте -rppпрапор, і додайте ppдо початку коду так:

pp((((((((((((((((((((((((((((((((((((((((((((((""<<66++11**00++11**00))<<99++11++11**00))<<((55>>11**00))++((11>>11**00))))<<99++11))<<99++11++11**00))<<99++((33>>11**00))++11**00))<<((55>>11**00))++((11>>11**00))))<<99++11++((11**00<<11**00<<11**00))))<<99++11**00++11**00))<<99++11++11**00++11**00))<<99++11**00++11**00))<<88++((11>>11**00))++((11**00<<11**00<<11**00))))<<99++((33>>11**00))++11**00))<<((55>>11**00))++((11>>11**00))))<<99++22))<<99++11++11**00))<<99++((33>>11**00))++11**00++11**00))<<99++11++((11**00<<11**00<<11**00))))<<99++((33>>11**00))))<<99++11**00++11**00))<<99++((11>>11**00))++((11**00<<11**00<<11**00))))<<99++11**00++11**00++11**00))<<33))

то для додаткових 2 + 4 байтів це може функціонувати як повністю повна програма, але він надрукує додатковий "до і після потрібного рядка:

Приклад:

$ ruby -rpp golf.rb
"Do not repeat yourself!"

Чи можете ви пояснити, чому це не повністю відповідає? Мені це ідеально виглядає, і навіть ppдорогоцінний камінь - це подвійний лист ...
trichoplax

3
@trichoplax: це в дописі: 1. додаткові "символи у виході та 2. потреба -rppпрапора (що не подобається --rrpp)
SztupY

1
Ця відповідь класна, але відповіді, які не відповідають специфікаціям, можуть бути видалені.
Пшеничний майстер

1
@SztupY Щоб бути абсолютно чітким, це політика сайту видаляти відповіді, які не відповідають правилам виклику.
Майк Буфардечі


23

> <> , 174 байти

vv

77

99

**

00

77

bb

**

pp

""

!!

ff

ll

ee

ss

rr

uu

oo

yy



tt

aa

ee

pp

ee

rr



tt

oo

nn



oo

DD

""

~~

oo

ll

11

==

;;

00

66

bb

**

..

На щастя, в певному сенсі обмеження не застосовується вертикально. Однак найбільша проблема полягає в тому, що нам потрібно подвоїти кожен новий рядок.

Код, який працює приблизно, виглядає так:

v            Redirect instruction pointer to move downwards
79*07b*p     Place a ? on row 77 before the first ;
"..."        Push "Do not repeat yourself!" backwards, riffled between spaces

[main loop]
~o           Pop a space and output a char
l1=?;        If there is only the final space left, halt
06b*.        Jump back to the start of the loop

Зауважте, що програма не має подвійних пробілів - у режимі рядка> <> просуває пробіли для порожніх комірок. Однак навпаки, це означає, що рішення, що використовує g(читати одну клітинку з вихідного коду), було б складнішим, оскільки пробіли в програмі при читанні стають NUL.

(Примітка. Це може бути на 50 байт коротше, якщо воно закінчується помилкою , але мені це подобається.)


1
Правильний інструмент для роботи ...
Erik the Outgolfer

20

Сліптінг , 186 146 байт

끄끄 닶닶 긂긂 닦닦 닶닶 덇덇 긂긂 댧댧 뉖뉖 댇댇 뉖뉖 덇덇 긂긂 뎗뎗 닶닶 덗덗 댧댧 댷댷 뉖뉖 뉦뉦 뉦뉦

껢껢 鎵 鎵 ❶❶ 合 合 虛虛 替 替 標 標 現 現 併 一一 終

Щоб було зрозуміло, є три рядки коду, середина яких порожня, оскільки новий рядок потрібно дублювати. Кількість байтів базується на кодуванні UTF-16.

Пояснення

Блок корейських символів на початку висуває рядок "DDDof� \"\u0002nf�of�twG \"\u0002rw'efVpw\aefVaf\u0016twG \"\u0002yw�of�uwWrw'sw7efVlf�fff!\"\u0012". Ви помітите, що кожен третій персонаж - це персонаж, якого ми хочемо; решта - хитрість. Ось чому:

У програмі Sclipting два корейські символи кодують три байти. Таким чином, кожен корейський символ ефективно кодує 12 біт. Щоб отримати рядок, починаючи з D, перші 8 біт повинні бути 0x44; решта не має значення, але оскільки нам доведеться повторювати кожен символ, 12-й та 20-й біти також будуть 0x44. Таким чином, у нас буде значення форми 0x44n44nдля деякої n , яка розкладається на три байти 0x44 0xn4 0x4n.

Для того o, що є 0x6F, ми отримуємо байти 0x6F 0xn6 0xFn.

Оскільки я лінивий, я почав з кодування, "DDDooo nnnooottt (etc.)"а потім замінив кожен інший символ попереднім, через що я отримую 0x444444= "DDD"для Dі 0x6F66F6= "of�"для o. Це є тому 0xF6, що саме по собі недійсне кодування UTF-8.

Тепер повернемося до програми. Решта програми триває наступним чином:

껢껢 - штовхає струну ".\"�"

鎵 鎵 - двічі видаляє останній символ, залишаючи нас "."

❶❶ - два дублікати. Складіть зараз:[".", ".", "."]

合 合 - з’єднувати двічі. Складіть зараз:["..."]

Тепер, що я хочу зробити далі, це використовувати "..."як регулярний вираз, щоб я міг одночасно порівнювати три символи з початкового рядка, використовуючи контурну конструкцію 替 ... 終. Однак, оскільки кожна інструкція дублюється, мені потрібно мати дві такі петлі регулярного вираження, які вкладені одна в одну, і якщо стек підриває, я отримую помилку виконання. Тому

虛虛 - двічі натисніть порожню рядок

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

標 標 - натисніть дві позначки на стек. Складіть зараз:[mark mark]

現 現 - натисніть на дві копії поточного збігу регулярних виразів. Складіть зараз:[mark mark "DDD" "DDD"]

併 併 - з'єднати до першої позначки. Складіть зараз:["DDDDDD"]

一一 - візьміть спочатку символ цього рядка, а потім (надлишково) перший символ цього рядка. Тепер стек має характер, якого ми хочемо.

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

Потім зовнішня петля закінчується, після чого потрібна рядок знімається з стека, і єдине збіг ""рядка ""замінюється на неї, залишаючи бажану рядок ще раз у стеці.


3
Гм ... чому ти тут не використовував формат коду? Це китайські символи?
Ерік Атголфер

@EriktheOutgolfer Мені було цікаво те саме (а вони корейські символи, а не китайці).
Кевін Круїссен

@KevinCruijssen Я думаю, що там є і деякі китайські символи. Насправді, spec говорить, що він використовує Hangul для даних, а китайський - для інструкцій.
Ерік Аутгольфер

@EriktheOutgolfer Ах, ти справді правий. Я мав би мати rtfm .. :)
Кевін Круїссен

12

Лабіринт , 528 байт

66))__vv          ..33::00&&__vv          ..44__99||__vv          ..33::00&&__vv            ..99))__vv            ..99))__vv      ..44__88$$__vv          ..22__99++__vv          ..22__99$$__vv            ..22__99))$$__vv      ..33__77$$__vv            ..33__vv

      ..44__99||__^^          ..11__99++__^^          ..44__88$$__^^          ..44((__88$$__^^      ..11))__99++__^^      ..99((__^^          ..33::00&&__^^          ..44__99||__^^          ..44((__88$$__^^            ..99))__^^          ..11__99$$((__^^    ..@@

xx

Подвійний новий рядок болить, але, принаймні, це доводить, що це можливо!

Кожен символ друкується по одному, спочатку формуючи кодову точку, а потім друкуючи єдину таблицю. Кодові точки формуються:

D 68  66))
o 111 44__99||
  32  33::00&&
n 110 11__99++
t 116 44__88$$
r 114 44((__88$$
e 101 99))
p 112 11))__99++
a 97  99((
y 121 22__99++
u 117 22__99$$
s 115 22__99))$$
l 108 33__77$$
f 102 11__99$$((
! 33  33

де

)(        Increment/decrement by 1 respectively
&|$       Bitwise AND/OR/XOR respectively
+         Add
:         Duplicate
_         Push zero
0-9       Pop n and push n*10+<digit>

Незвична поведінка цифр Лабіринту експлуатується в 33::00&&, що є насправді

[33] -> [33 33] -> [33 33 33] -> [33 33 330] -> [33 33 3300] -> [33 32] -> [32]
     :          :             0              0               &          &

Кожен окремий знак друкується за допомогою механізму

__vv

  ..

xx

xxІснує тільки для прокладки сітки , так що це 5 високих. Спочатку __натисніть два нулі, потім ми потрапили в оператор обертання сітки v. Скидаємо нуль і обертаємо:

__ v
  v
   .
  .
xx

і знову:

__ v

  v.

xx.

Потім переходимо вправо до .третього ряду, таким чином виконуючи команду друку лише один раз.


Мені подобається хитрість, яку ви використовували для виконання команди друку лише один раз. Це надзвичайно розумно.
Тімві

11

CJam - 176 136 байт

66))HH77++GG00++BB88++HH77++EE88++GG00++DD88++99))CC88++99))AA77++EE88++GG00++BB99++HH77++KK77++DD88++JJ77++99))AA88++II66++33]]{{cc}}//

Завдяки Sp3000, що розділила розмір програми на два :-)

Пояснення

  • Коди HH77++, GG00++... обчислити число ASCII код символів шляхом додавання номера (наприклад: `HH77 ++» виштовхує 17, 17 і 77 в стек, а потім додати ці 3 номери)
  • частина коду в кінці ]]{{cc}}//проходить через коди ascii та перетворює їх у символи.

Спробуйте тут


1
Ви генерували це за допомогою програми? Принаймні, сам кінець може бути 33cc, але я впевнений, що є кращі шляхи для деяких інших
Sp3000

@ Sp3000 так, я просто запустив програму, яка пробувала різні комбінації з ++. Я не пробував інших операторів ...
Арно,

3
Ще одна примітка: замість ccскрізь зробіть ]]{{cc}}//наприкінці
Sp3000

11

Модифікуючий Brainf *** , 72 байти

Зверніть увагу, що \x00представляє буквальний NULшістнадцятковий байт (порожня комірка). Вихідний код розміщується на стрічці, зліва від вихідної комірки.

!!fflleessrruuooyy  ttaaeeppeerr  ttoonn  ooDD\0\0<<<<<<++[[<<]]<<[[..<<]]

Пояснення

!!fflleessrruuooyy  ttaaeeppeerr  ttoonn  ooDD  The string on the tape for easy printing
\x00\x00                                        A separator to make printing shorter
<<<<<<++                                        Change first '.' to '0' (comment)
[[<<]]<<                                        Move to separator, then left to string
[[0.<<]]                                        Print string

Також перед створенням цієї програми я робив один, використовуючи лише символи BF у джерелі. Це можливо! Це також набагато довше, оскільки для непарного значення ASCII я збирався створити подвійне значення, а потім розділити на два. Дещо коротше буде модифікація всього джерела, щоб генерувати непарні значення для початку.


Не буде це вихід DDoo nnoott rreeppeeaatt yyoouurrsseellff!!(подвійні пробіли)? Я бачу два .с.
Ерік Аутгольфер

@EriktheGolfer Час, коли ти прочитаєш мою відповідь. Change first '.' to '0'. Я змінив пояснення, щоб показати (знову), що перший .змінюється на нуль.
mbomb007

7

Желе , 66 байт (неконкуренто)

““DDoo  nn““oott  rreepp““eeaatt  yyoouurrss““eellff!!””ṛṛḷḷWWQQ€€

Спробуйте в Інтернеті!

Фактоїдний

Програма все ще працює, якщо ви видалите кожен другий символ.

Спробуйте в Інтернеті!

Як це працює

““DDoo  nn““oott  rreepp““eeaatt  yyoouurrss““eellff!!”

повертає масив рядків. Буквальне починається з a , закінчується a , а рядки розмежовані внутрішньо . Результат -

["", "DDoo  nn", "", "oott  rreepp", "", "eeaatt  yyoouurrss", "", "eellff!!"]

Аргумент посилання та значення, що повертаються, встановлюються для цього масиву рядків, потім виконується залишок вихідного коду.

<literal>”ṛṛḷḷWWQQ€€  Argument/return value: A (string array)

         ”ṛ           Yield the character 'ṛ'.
           ṛ          Select the right argument of 'ṛ' and A: A.
            ḷ         Select the left argument of A and A: A.
              W       Wrap; yield [A].
             ḷ        Select the left argument of A and [A]: A.
               W      Wrap; yield [A].
                Q     Unique; deduplicate [A]. Yields [A].
                 Q€€  Unique each each; for each string s in A, deduplicate s.

Чому не змагаються?
justhalf

1
Оскільки Jelly був створений у грудні 2015 року, тому він вирішує цей виклик на три місяці.
Денніс

На жаль, не зрозуміли, що це давнє завдання
justhalf

5

Гаммаплекс , 66 байт

\\

XX""!!fflleessrruuooyy  ttaaeeppeerr  ttoonn  ooDD""XXXXrrRREE

Gammaplex - це двовимірна мова, яка використовує позицію першого нового рядка як довжину рядка та ігнорує всі інші нові рядки.


5

МСМ , 270 160 байт

!!'',,ff'',,ll'',,ee'',,ss'',,rr'',,uu'',,oo'',,yy'',,  '',,tt'',,aa'',,ee'',,pp'',,ee'',,rr'',,  '',,tt'',,oo'',,nn'',,  '',,oo'',,DD'',,......................

Моя перша програма MSM!

Виведення рядків у MSM відбувається шляхом виштовхування окремих символів на стек та з'єднання їх в одну рядок через ., наприклад,

!olleH.....

Кількість одиниць .менше, ніж кількість символів. Для цього Do not repeat yourself!нам потрібно 22 .с. На щастя, це парне число, тому у нас 11 пар

......................

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

cc'',,

робить трюк для кожного персонажа c. Він оцінюється наступним чином

cc'',,            push c (remember: commands are taken from the left and operate on the right)
c'',,c            push c
'',,cc            quote ' and push
,,cc'             pop
,cc               pop
c                 voilà!

Нам потрібно 23 таких шаблони, починаючи з !!'',,і закінчуючи, за якими DD'',,слід 22 команди приєднання ..


5

Befunge 98, 70 66 байт

Спробуйте в Інтернеті!

Після моєї неправдивої відповіді ось краща, яка насправді відповідає виклику!

2200**xx""!!fflleessrruuooyy  ttaaeeppeerr  ttoonn  ooDD��""kk,,@@

(Дякуємо Мартіну Ендеру за те, що він запропонував використовувати ��символ 0x17 замість 88ff++)

Пояснення:

2200          Push 2, 2, 0, and 0 onto the stack
*             Multiply 0 and 0, yielding 0
*             Multiply 2 and 0, yielding 0
              The stack is now [2, 0]
x             Pop a vector off the stack and set the instruction pointer delta to that
              The instruction pointer is now skipping over every other character, since the delta is (2, 0)
"!f ... oD�" Push the string onto the stack, with the number 23 (number of characters in the string) at the top
k,            Pop characters off the stack and print them, 23 times
@             End the program

Можна зберегти чотири байти, скориставшись недрукуваним символом (код 23) всередині рядка замість 8f+: tio.run/nexus/…
Мартін Ендер

4

DC , 348 346 342 306 290 278 байт

Файл dnr6.short.dc(без закінчення нового рядка):

AAzz--22222222vvPPAAAAAAAAvvPP88vvFFFFFFFFvv00++AAzz--PP11vvFFFFFFFFvv00++AAAAAAvvPP11vvEEEEEEEEvv00++OOOO//44999999vv++PP77II++OOOO//44999999vv++PPAAAAAAvv88vvFFFFFFFFvv00++PPAAzz--BBPP11vvFFFFFFFFvv00++77OOOO++++PPOOOO//44999999vv++66vvFFFFFFFFvv00++PP99zz++OO88++PPAAAAvv33PP

Виконати:

$ dc < dnr6.short.dc 
Do not repeat yourself!



2

ретикулярна, неконкурентна, 62 байти

2200**UU""DDoo  nnoott  rreeppeeaatt  yyoouurrsseellff!!""oo;;

Спробуйте в Інтернеті!

Пояснення частинами:

2200**
2200    the stack looks like [2 2 0 0]
    *   [2 2 0*0]
     *  [2 2*0*0]
        [2 0]

Uвстановлює напрямок вказівника на (2, 0), тобто переміщення 2x-одиниць та 0y-одиниць, тому він пропускає кожен інший символ, починаючи з Uпропускання наступного . Потім кожен інший символ записується, і він еквівалентний:

"Do not repeat yourself!"o;

яка є простою програмою виводу.

Інший

Це змагається за вигідність JavaScript від WallyWest:

Я можу довести, що хоча числа можуть бути побудовані під цим обмеженням, рядки не можуть. Оскільки жодні літерали не можуть використовуватися, оскільки розміщення будь-якого символу, що будує буквально, створює порожній рядок:

""
''
``

Тоді можна використовувати лише деякий оператор; єдині використовувані "парні" оператори:

++ -- << >> ** ~~ || && !! ==

І жодне з них не може закидати числа / інші до рядків. Таким чином, жодні рядки не можуть бути виведені.


Баунті закінчується через 5 днів, @ConorOBrien, сподіваюся, ви не проти чекати! Але щедрість твоя.
WallyWest

2

Аліса , 74 байти

aa00tt,,JJ""DDoo  nnoott  rreeppeeaatt  yyoouurrsseellff!!//@@""ooYY;;tt


Спробуйте в Інтернеті!

Пояснення

Перша увага полягає в тому, що нам потрібно вміти вводити рядок, тому ми хочемо пропустити лише перший ". Ми робимо це, перестрибуючи на першу, "оскільки тоді IP перемістить одну клітинку, перш ніж знову подивитися на поточну комірку, так що це друга, "яка переходить у рядовий режим. Але щоб мати можливість стрибнути туди, нам потрібно 10, 0зверху стека, в такому порядку (другий, верхній). Це робиться за допомогою aa00tt,,:

                          Stack:
aa   Push two 10s.        [... 10 10]
00   Push two 0s.         [... 10 10 0 0]
tt   Decrement twice.     [... 10 10 0 -2]
,    Rotate(-2).          [... 0 10 10]
,    Rotate(10).          [... 0 10 0]

Ця функція обертання спливає аргумент. Якщо цей аргумент негативний, він висуває значення вгорі стека вниз на стільки позицій. Якщо аргумент позитивний, він шукає елемент, який займає багато позицій під вершиною, і підтягує його до верху. Зауважте, що у випадку Rotate(10)на стеку недостатньо елементів, але внизу є неявна нескінченна кількість нулів, тому нуль закінчується вгорі.

Тепер ми можемо Jперейти до першого, "використовуючи ці два аргументи. Другий "переходить у рядовий режим і записує все це DDoo nnoott.... Коли він потрапляє на /, IP перенаправляється на південний схід, і ми переходимо до звичайного режиму. На даний момент IP відскакує вгору і вниз по трьох рядках (два з яких порожні), тож спочатку записується ще три пробіли на рядках два та три, а потім ми залишаємо рядовий режим, коли він потрапляє на ". Оскільки в цей час ми перебуваємо в звичайному режимі, всі записані символи висуваються як один рядок до стеку (навіть якщо ми записали більшість із них у режимі Кардинала), тож ми закінчуємо цю строку (зверніть увагу на пробіли) :

DDoo  nnoott  rreeppeeaatt  yyoouurrsseellff!!   

Тепер IP продовжує підстрибувати вгору і вниз, що означає, що він виконує одну команду кожної другої пари, тобто Yі t. Тоді IP потрапить на кінець сітки на другому рядку і почне відскакувати назад через сітку. Це також призводить до переключенню , в якому пара символів , IP потрапляє в перший рядок, так що при переході назад тепер виконує ;, oі @. Отже, ігноруючи всі пробіли та неявні перенаправлення IP, виконаний код знаходиться Yt;o@в звичайному режимі.

Команда Y"unzip", яка розділяє рядок на символи в чергуванні позицій. Оскільки кожен символ повторюється, це насправді дає лише дві копії рядка, по якому ми йдемо, хоча перша копія має два пробіли, а друга - один пробіл. tрозщеплює цей простір і ;відкидає його. Нарешті, oдрукується рядок і @припиняється програма.


2

05AB1E , 100 58 52 байт

-6 байт завдяки Кевіну Крейсейну

„„€€··™™……€€––  ……¹¹‚‚  ……––‚‚))εε##θθáá}}»»……!!θθJJ

Спробуйте в Інтернеті!

„„€€·              # dictionary string "g do"
     ·             # double (no effect on strings)
      ™            # title case: "G Do"
       ™           # title case again (no effect)
……€€––             # dictionary string "tools not–"
                   # spaces necessary so "–…" isn't parsed as a dictionary word
……¹¹‚‚             # dictionary string "team repeat‚"
                   # spaces necessary again
……––‚‚             # dictionary string "j yourself‚"
)                  # wrap the entire stack in an array
 )                 # and again: [["G Do", "tools not–", "team repeat‚", "j yourself‚"]]
  ε        }       # for each:
   ε      }        #  for each:
    #              #   split on spaces: ["tools", "not–"]
     #             #   and again: [["tools", "not–"]]
      θ            #   get the last element: ["tools", "not–"]
       θ           #   and again: "not–"
        á          #   keep only letters: "not"
         á         #   and again (no effect)
            »      # join the list by newlines, joining sublists by spaces:
                   # "Do not repeat yourself"
             »     # join the stack by newlines, joining lists by spaces (no effect)
……!!               # literal string "…!!"
    θ              # get the last character: "!"
     θ             # and again (no effect)
      J            # join the stack without separators: "Do not repeat yourself!"
       J           # and again (no effect)
                   # implicit output

Правила ідентифікації.


1
Приємна відповідь, я вражений, що ти зміг утиснути такі словарні рядки! На жаль, áце не векторизується на внутрішніх рядках, інакше його можна буде використовувати після )).. Видалення всіх áта використання εεáá}}після ))робіт як альтернатива, але, на жаль, це не економить жодних байтів (але, можливо, ви можете знайти натхнення від цього? ) .. І „„!!замість ……!!роботи також, оскільки !вбудований залишає рядки такі ж, мабуть. Ну добре, я спробував. xD
Кевін Круїссен

1
@KevinCruijssen Я намагався змінити повторення тих, хто повторився ##θθááдеякий час, і я чомусь не розглядав εε}}... Я намагався €€, що не зовсім працює ... Це зараз найкоротша відповідь, дякую!
Грим

1

Стакс , 70 байт

GG11hh::zzaapp..}}..""DDoo  nnoott  rreeppeeaatt  yyoouurrsseellff!!""

Запустіть і налагоджуйте його на staxlang.xyz!

Stax дуже щасливо має вбудований ::для кожного nth. Все, що мені потрібно - це натиснути рядок вдвічі, натиснути 2 і запустити ::. Легко, правда?

Неправильно.

Натискання на цю струну є складним. Перший лапок можна подвоїти на .."", що є літералом довжиною-2, ."після якого слід змістовим лапкою. Проблема полягає в тому, що я не бачу способу припинити рядок (що необхідно, інакше подвійна версія буде надрукована) без запуску нової.

Кінець програми закінчує літеральні рядки. Якщо я можу помістити туди подвійний літерал, можливо, буде хороший спосіб вирішення. Однак, щоб стрибати кудись із кінця програми, потрібно G}, тож, як мінімум, я дивлюся на це:

GG [deduplicate] }}""DDoo  nnoott  rreeppeeaatt  yyoouurrsseellff!!""

Це робить ... нічого. Gне починає блок, тому ні на один не перестрибне }. Знову ж , мені потрібно ігнорувати один символ: ..}}. Виконання стрибає з першого Gна другий }, продовжується до кінця, стрибає назад до другого, Gа звідти до другого }, і продовжується ще раз до кінця, перш ніж відновитись на початку [deduplicate]розділу з подвоєним рядком на вершині стека.

Дедуплікація проста. 11hhнатиснув одинадцять і наполовину вдвічі, округлюючи обидва рази і даючи два, і ::тоді ми отримаємо необхідний нам результат.

GG11hh::..}}..""DDoo  nnoott  rreeppeeaatt  yyoouurrsseellff!!""

Ой-ой. Це нічого не друкує. Тут є дві проблеми: по-перше, це ..}означає, що рядок .}буде над стеком в кінці програми, а по-друге, звичайний неявний вихід Стакса тепер відключений!

Гірше питання - вихід. Коли програма Stax граціозно закінчується, не надрукуючи нічого, верхня частина стека буде неявно надрукована. Але ми нічого не друкували ...? Ах, але у нас є. Невстановлені літеральні рядки друкуються, а не висуваються, і навіть цих двох порожніх рядків (з незрівнянним "в кінці), незважаючи на те, що вони порожні, достатньо, щоб відключити цей чек. Будь-яку друк потрібно робити вручну.

Нам знадобиться або ppабо PP, і в цьому випадку ігнорування першого через ..ppнеприйнятне, оскільки воно буде друкувати рядок .p. Це означає, що нам потрібен бажаний вихід або один на стеці, або у двох верхніх місцях, а також порожній рядок. Останнє виконується натисканням двох порожніх рядків ( zz) та обертанням трьох верхніх елементів двічі ( aa) перед друком.

Після цього у нас є стек у чотири струни у висоту. Потім п'ята, .}натискається до того, як програма виходить граціозно; в цей момент відсутність неявного виходу стає благом і прокляттям, оскільки нічого зайвого тепер не буде надруковано!

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