Rubinowy - 2100 1428 1032 820 670 bajtów
Zakłada się, że wyjście może być wartością zwracaną z funkcji (nie określono, że wyjście musi być do STDOUT)
Kod:
((((((((((((((((((((((((((((((((((((((((((((((""<<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))
Sztuką jest zbudowanie ciągu z pustego ciągu ""
przy użyciu operacji dołączania <<
i kodów ASCII znaków.
Aby uzyskać liczby dla kodów ASCII, próbuję rozłożyć liczbę na wartości, które mogę łatwo wygenerować. Na przykład ASCII 90
jest po prostu 88+1+1
:
88
sam jest w porządku
11**00
jest 11^0
, co jest po prostu1
Na szczęście jedno ++
i drugie --
oznaczałoby add
rubin, więc mogę pisać 90
jako88++11**00++11**00
Jest kilka sztuczek, aby łatwiej dostać się do niektórych liczb niż dodawanie 1, oto kod, którego używam do wygenerowania powyższego (który obejmuje wszystkie mapowania, których używam):
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
Nadal myślę o innych sztuczkach, aby zmniejszyć liczbę znaków wymaganych do uzyskania liczby.
Pamiętaj, że jeśli użyjesz -rpp
flagi i dodasz pp
na początku kodu w następujący sposób:
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))
następnie dla dodatkowych 2 + 4 bajtów może to działać jako w pełni kompletny program, ale wypisze dodatkowy "
przed i po wymaganym ciągu:
Przykład:
$ ruby -rpp golf.rb
"Do not repeat yourself!"
DDDooo nnnooottt rrreeepppeeeaaattt yyyooouuurrrssseeelllfff!!!
to byłaby poprawna odpowiedź w Trigger