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 90jest po prostu 88+1+1:
88 sam jest w porządku
11**00jest 11^0, co jest po prostu1
Na szczęście jedno ++i drugie --oznaczałoby addrubin, więc mogę pisać 90jako88++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 -rppflagi i dodasz ppna 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