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!"
DDDooo nnnooottt rrreeepppeeeaaattt yyyooouuurrrssseeelllfff!!!
була б коректна відповідь у Trigger