Ruby - 2100 1428 1032 820 670 Bytes
Dies setzt voraus, dass die Ausgabe ein Rückgabewert einer Funktion sein kann (es wurde nicht angegeben, dass die Ausgabe STDOUT sein muss).
Code:
((((((((((((((((((((((((((((((((((((((((((((((""<<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))
Der Trick besteht darin, die Zeichenfolge aus einer leeren Zeichenfolge unter ""
Verwendung der Anhängeoperation <<
und der ASCII-Codes der Zeichen zu erstellen .
Um die Zahlen für die ASCII-Codes zu erhalten, versuche ich, die Zahl in Werte zu zerlegen, die ich leicht erzeugen kann. Zum Beispiel ist ASCII 90
einfach 88+1+1
:
88
ist okay für sich
11**00
ist 11^0
, was einfach ist1
Zum Glück beide ++
und --
würde bedeuten , add
in Rubin, so kann ich schreiben 90
als88++11**00++11**00
Es gibt einige Tricks, um zu einigen Zahlen zu gelangen, die einfacher sind als nur das Hinzufügen von Einsen. Hier ist der Code, mit dem ich das oben Genannte generiere (einschließlich aller von mir verwendeten Zuordnungen):
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
Ich denke immer noch über andere Tricks nach, um die Zeichen zu verringern, die erforderlich sind, um zu einer Zahl zu gelangen.
Beachten Sie Folgendes, wenn Sie das -rpp
Flag verwenden und wie folgt pp
am Anfang des Codes einfügen:
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))
dann kann dies für zusätzliche 2 + 4 Bytes als ein vollständiges Programm funktionieren, aber es wird ein Extra "
vor und nach der erforderlichen Zeichenfolge gedruckt :
Beispiel:
$ ruby -rpp golf.rb
"Do not repeat yourself!"
DDDooo nnnooottt rrreeepppeeeaaattt yyyooouuurrrssseeelllfff!!!
wäre dies eine gültige Antwort in Trigger