Machen Sie eine lange Typensignatur


23

Herausforderung

Suchen Sie einen höchstens 100 Byte langen Ausdruck mit der längsten Typensignatur.

Regeln

  • Jede statisch typisierte Sprache mit Typinferenz ist zulässig
  • Der Typ muss nicht mehrdeutig sein, kann aber ansonsten Typen ohne definierte Instanzen enthalten. Zum Beispiel Num [a]und Eq [a]sind erlaubt, auch ohne definierte Instanz
  • Keine anderen Importe als das zum Kompilieren eines Programms mit STDIN / STDOUT erforderliche Minimum
  • Unendliche Typen sind nicht erlaubt
  • Wenn eine Antwort mehr als einen Ausdruck enthält, kann nur einer zur Bewertung beitragen. Obwohl die Typensignatur der Komposition (.) :: (b -> c) -> (a -> b) -> a -> ceine Punktzahl von 20 aufweist, hätte die Antwort mit 25 Kopien von (.)\nbeispielsweise eine Punktzahl von 20 und nicht von 500
  • Der Ausdruck darf höchstens 100 Bytes umfassen
  • Die Punktzahl gibt die Anzahl der Zeichen in der Typensignatur ohne den Namen der Funktion und Leerzeichen an. Zum Beispiel f :: (a -> b) -> a -> bhätte eine Punktzahl von 12
  • Die höchste Punktzahl gewinnt!

Beispiele

Obwohl andere Sprachen zulässig sind, befinden sich die folgenden Beispiele in Haskell:

Score: 112
map.map.map.map.map.map.map.map.map.map.map.map.map.map.map.map.map.map.map.map.map.map.map.map.map
f :: (a -> b)
 -> [[[[[[[[[[[[[[[[[[[[[[[[[a]]]]]]]]]]]]]]]]]]]]]]]]]
 -> [[[[[[[[[[[[[[[[[[[[[[[[[b]]]]]]]]]]]]]]]]]]]]]]]]]    

Score: 240
(.).(.).(.).(.).(.).(.).(.).(.).(.).(.).(.).(.).(.).(.).(.).(.).(.).(.).(.).(.).(.).(.).(.).(.).(.)
f :: (b->c)->(a->a1->a2->a3->a4->a5->a6->a7->a8->a9->a10->a11->a12->a13->a14->a15->a16->a17->a18->a19->a20->a21->a22->a23->a24->b)->a1->a2->a3->a4->a5->a6->a7->a8->a9->a10->a11->a12->a13->a14->a15->a16->a17->a18->a19->a20->a21->a22->a23->a24->c

Score: 313
foldl$foldl$foldl$foldl$foldl$foldl$foldl$foldl$foldl$foldl$foldl$foldl$foldl$foldl$foldl$foldl(.)
f :: (Foldable t, Foldable t1, Foldable t2, Foldable t3, Foldable t4,
  Foldable t5, Foldable t6, Foldable t7, Foldable t8, Foldable t9,
  Foldable t10, Foldable t11, Foldable t12, Foldable t13,
  Foldable t14, Foldable t15) =>
 (b -> c)
 -> t (t1 (t2 (t3 (t4 (t5 (t6 (t7 (t8 (t9 (t10 (t11 (t12 (t13 (t14 (t15 (b
 -> b))))))))))))))))
 -> b
 -> c

Score: 538
lex.show.foldl1.mapM.traverse.sum.mapM.sum.traverse.(.).mapM.scanl.zipWith3((.traverse).(.traverse))
 (Num
    (a -> ([[c]] -> t3 [[a1 -> f b]]) -> [[c]] -> t3 [[a1 -> f b]]),
  Num
    (([[c]] -> t3 [[a1 -> f b]])
     -> t1 (t2 ([[c]] -> t3 [[a1 -> f b]]))
     -> [[c]]
     -> t3 [[a1 -> f b]]),
  Show
    (t (t1 (t2 ([[c]] -> t3 [[a1 -> f b]])))
     -> t1 (t2 ([[c]] -> t3 [[a1 -> f b]]))),
  Applicative f, Foldable t,
  Foldable ((->) (t1 (t2 ([[c]] -> t3 [[a1 -> f b]])) -> a)),
  Foldable
    ((->) (([[c]] -> t3 [[a1 -> f b]]) -> a -> t3 [a1 -> f b])),
  Traversable t1, Traversable t2, Traversable t3, Traversable t4,
  Traversable t5,
  Traversable ((->) (t1 (t2 ([[c]] -> t3 [[a1 -> f b]])))),
  Traversable ((->) ([[c]] -> t3 [[a1 -> f b]]))) =>
 [(t5 (t4 a1) -> f (t5 (t4 b))) -> c -> a1 -> f b]
 -> [(String, String)]

Verwandte . Ich habe gedacht, dass es eine fast exakte Täuschung gibt, aber ich habe es nicht gefunden.
Peter Taylor

2
Ich vermute, dass eine Sprache mit abhängiger Typisierung eine Typensignatur von der Länge einer beliebigen Anzahl von Dosen erstellen kann.
Xnor

@xnor Da sich die Typ-Systeme selbst als vollständig erweisen ( stackoverflow.com/a/4047732/5154287 ), wird es dann wohl eher zu einem Problem für Biber. Soll ich die Tags bearbeiten?
Michael Klein

Antworten:


19

Haskell, ~ 2 ^ (2 ^ 18)

f x=(x,x)
g=f.f.f.f
h=g.g.g.g
i=h.h.h.h
j=i.i.i.i
k=j.j.j.j
l=k.k.k.k
m=l.l.l.l
n=m.m.m.m
n.n.n.n$0

Bei jeder Anwendung wird die fTypensignatur ungefähr verdoppelt, indem die Typensignatur Tin umgewandelt wird (T,T). Zum Beispiel hat die vierfache Zusammensetzung f.f.f.f$0einen Typ

Num a => ((((a, a), (a, a)), ((a, a), (a, a))), (((a, a), (a, a)), ((a, a), (a, a))))

Jede Zeile vervierfacht die Anzahl der Bewerbungen fund gibt 4^9 = 2^18am Ende an. Die Typensignatur hat also eine Größe in der Größenordnung von 2^(2^18).


2
Der klassische Ansatz, aber ich denke, die Parameter können besser abgestimmt werden. Insbesondere denke ich, dass f x=(x,x,x)auf Kosten von einem n.in der letzten Zeile die optimale Punktzahl für diese Gesamtstruktur ergibt.
Peter Taylor

Ich kenne Haskell nicht, also könnte ich hier von der Basis abweichen, aber ich werde darauf hinweisen, dass 4 ^ (4 ^ 4) weniger als 3 ^ (4 ^ 5) ist
Sparr

Ich bin mir ziemlich sicher, dass der vierte n.größer wird. 2^18vs, es 3 * (2^16)sei denn, ich habe einen Fehler bei der Berechnung der ursprünglichen Exponentiation gemacht: 2^(4^9)vs.3^((4^8)*3)
Draco18s

Nein, @PeterTaylor ist richtig: 2 ^ (4 ^ 9) = 16 ^ (4 ^ 8) <27 ^ (4 ^ 8) = 3 ^ (4 ^ 8 ⋅ 3).
Anders Kaseorg

(,)(oder (,,)) kann verwendet werden, um einige Bytes zu speichern und die Punktzahl zu verbessern, indem mehr ns verwendet werden.
8.

11

Java, Punktzahl 17301488

Erfordert die Methode <T>java.util.Map<T,T>f(T t){return null;}, die auf das 100-Byte-Limit angerechnet wurde.

f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(f(1)))))))))))))))))))

Die Signatur dieses Typs zur Kompilierungszeit sollte mit dieser übereinstimmen .


hmm. Da Lambdas erlaubt sind, würde dies wahrscheinlich eine höhere Punktzahl bekommen
ASCII

10

Haskell mit Erweiterungen, EIN(EIN(EIN(EIN(220,0),0),0),0)

Z::Z#Z#Z#Z#Z#Z#Z#Z#Z?Z
data a?b=Z|S(a?b)
type family m#n where Z#n=S n;S m#Z=m#S m;S m#S n=m#(S m#n)

Probieren Sie es online!

Erfordert -XDataKinds, -XPolyKinds, -XTypeOperators, -XUndecidableInstances, und -XTypeFamilies.

Vielen Dank an Ørjan Johansen, der erkannt hat, dass durch das Einfügen des natürlichen Zahlenkonstruktors und das etwas andere Bilden der Argumente zwei Bytes gespart wurden und gerade genug Platz für eine weitere Iteration von #.

Offensichtlich gibt die Typprüfung den Versuch auf, dieses Programm zu prüfen. Um einen allgemeinen Eindruck davon zu bekommen, wie die Signatur aussehen würde (wenn sie klein genug wäre, um in das beobachtbare Universum zu passen), probieren Sie die viel kleinere aus

Z::S(S Z)#Z?Z

Erläuterung

Die #Typfamilie ist eng mit der Ackermann-Péter-Funktion verwandt , die üblicherweise als EIN wird, #wächst jedoch erheblich schneller. Die Ackermann-Péter-Funktion ist definiert

EIN(0,n)=n+1

EIN(m,0)=EIN(m-1,1) wennm>0

A(m,n)=A(m-1,EIN(m,n-1)) wennm,n>0

#Andererseits können wir B aufrufen und schreiben

B(0,n)=n+1

B(m,0)=B(m-1,m) wennm>0

B(m,n)=B(m-1,B(m,n-1)) wennm,n>0

Nur der zweite Fall ist anders. Der Abschlussnachweis ist identisch mit dem Standardnachweis für EIN , und es sollte klar sein, dass B(m,n)EIN(m,n) für alle m und n .

Hier berechnen wir eine unäre Darstellung von

r=B(B(B(B(B(B(B(B(0,0),0),0),0),0),0),0),0)

Durch direkte Berechnung wird B(B(B(B(0,0),0),0),0)=220 , so

r=B(B(B(B(220,0),0),0),0) .

Man beachte , dass EIN(EIN(EIN(EIN(0,0),0),0),0) ist nur5 , so dass wirDinge ein gutes Stück gestoßen haben aus zu starten. Ich habe keine klare Vorstellung davon, wie viel schnellerB wächst alsEIN , aber wenn man bedenkt, wie die Berechnung abläuft, ist es wahrscheinlich, dass esviel schnellerwächst.

Die Anzahl der Stellen in einem geraden EIN(6,0) ist zu groß, um praktisch als Dezimalzahl ausgedrückt zu werden. Das ist also ... ziemlich lächerlich.

Die Definition der natürlichen Zahlen (?)ist etwas ungewöhnlich. Um Platz zu sparen, verwenden wir (?)sowohl einen natürlichen Zahlentyp (auf Typebene) als auch einen Proxy-Typ (auf Begriffsebene).

Ich glaube, dass entweder TypeFamiliesoder (ausführlicher und verschleierter) FunctionalDependenciesnotwendig sind, um die Berechnung auf Typebene zu erhalten, die erforderlich ist, um wirklich große Typen zu erreichen. UndecidableInstanceswird benötigt, um die sehr primitive Terminierungsprüfung von Haskell zu umgehen. Die anderen Erweiterungen werden nur benötigt, um den Code auf den kleinen verfügbaren Platz zu komprimieren.



@ ØrjanJohansen, stapelt sich Z besser s vorne als mit zu beginnen S(S Z)#S Z, oder dasselbe?
15.

In jedem Fall ist das Extra #Zam Ende sehr willkommen.
15.

1
Es ist genau derselbe Wert, speichert jedoch ein Byte und ändert den Datentyp, um ?das andere zu speichern, so dass Platz für zusätzliche Daten bleibt #Z.
Ørjan Johansen

1
Als Sie das erste Mal bearbeiteten, stellte ich fest, dass A(m,1)es nie größer war als A(A(m,0),0)und dass ich mich gerade dazu äußern wollte, aber dann haben Sie nur optimiert, bis die Optionen gleich waren. (Ist auch m+1nie größer als A(m,0).)
Ørjan Johansen

9

Haskell, 9,2 663552-3 (≈ 1,02 · 10 199750 )

Eine kleine Verbesserung gegenüber xnors 5⋅2 262144 + 5 . Das sind 99 Bytes.

f=(:).(:)
g=f.f.f.f
h=g.g.g.g
i=h.h.h.h
j=i.i.i.i
k=j.j.j.j
l=k.k.k.k
m=l.l.l
n=m.m.m
o=n.n.n
o.o.o

Wie es funktioniert

Wir haben

(:)         :: a -> [a] -> [a]
(:).(:)     :: a -> [[a] -> [a]] -> [[a] -> [a]]
(:).(:).(:) :: a -> [[[a] -> [a]] -> [[a] -> [a]]] -> [[[a] -> [a]] -> [[a] -> [a]]]

und so weiter, wobei sich die Länge für jeden ungefähr verdoppelt (:). Der angegebene Ausdruck o.o.ofunktioniert (:).(:).(:).….(:)mit 2 · 4 6 · 3 4 = 663552 Kopien von (:).

Haskell mit FlexibleContextsund NoMonomorphismRestriction(200 · 4 331776 + 75 · 331776 + 16) / 9 · 2,53 · 10 199750

Eine kleine Verbesserung gegenüber Bubbler's 12 · 2 663552 + 9 · 663552 - 4 · 1,36 · 10 199750 , die ebenfalls auf diesen Erweiterungen beruht. Der Wortlaut der Herausforderung legt nahe, dass es in Ordnung sein könnte, sich auf sie zu verlassen („Zum BeispielNum [a]undEq [a]erlaubt, auch ohne definierte Instanz“). Ich bin mir nicht sicher. Das sind 100 Bytes.

f=(/).(:)
g=f.f.f.f
h=g.g.g.g
i=h.h.h.h
j=i.i.i.i
k=j.j.j.j
l=k.k.k.k
m=l.l.l
n=m.m.m
o=n.n.n
-o.o.o

Wie es funktioniert

Wir haben

-(/).(:) :: (Fractional ([a] -> [a]), Num (a -> ([a] -> [a]) -> [a] -> [a])) => a -> ([a] -> [a]) -> [a] -> [a]
-(/).(:).(/).(:) :: (Fractional ([a] -> [a]), Fractional ([([a] -> [a]) -> [a] -> [a]] -> [([a] -> [a]) -> [a] -> [a]]), Num (a -> ([([a] -> [a]) -> [a] -> [a]] -> [([a] -> [a]) -> [a] -> [a]]) -> [([a] -> [a]) -> [a] -> [a]] -> [([a] -> [a]) -> [a] -> [a]])) => a -> ([([a] -> [a]) -> [a] -> [a]] -> [([a] -> [a]) -> [a] -> [a]]) -> [([a] -> [a]) -> [a] -> [a]] -> [([a] -> [a]) -> [a] -> [a]]
-(/).(:).(/).(:).(/).(:) :: (Fractional ([a] -> [a]), Fractional ([([a] -> [a]) -> [a] -> [a]] -> [([a] -> [a]) -> [a] -> [a]]), Fractional ([([([a] -> [a]) -> [a] -> [a]] -> [([a] -> [a]) -> [a] -> [a]]) -> [([a] -> [a]) -> [a] -> [a]] -> [([a] -> [a]) -> [a] -> [a]]] -> [([([a] -> [a]) -> [a] -> [a]] -> [([a] -> [a]) -> [a] -> [a]]) -> [([a] -> [a]) -> [a] -> [a]] -> [([a] -> [a]) -> [a] -> [a]]]), Num (a -> ([([([a] -> [a]) -> [a] -> [a]] -> [([a] -> [a]) -> [a] -> [a]]) -> [([a] -> [a]) -> [a] -> [a]] -> [([a] -> [a]) -> [a] -> [a]]] -> [([([a] -> [a]) -> [a] -> [a]] -> [([a] -> [a]) -> [a] -> [a]]) -> [([a] -> [a]) -> [a] -> [a]] -> [([a] -> [a]) -> [a] -> [a]]]) -> [([([a] -> [a]) -> [a] -> [a]] -> [([a] -> [a]) -> [a] -> [a]]) -> [([a] -> [a]) -> [a] -> [a]] -> [([a] -> [a]) -> [a] -> [a]]] -> [([([a] -> [a]) -> [a] -> [a]] -> [([a] -> [a]) -> [a] -> [a]]) -> [([a] -> [a]) -> [a] -> [a]] -> [([a] -> [a]) -> [a] -> [a]]])) => a -> ([([([a] -> [a]) -> [a] -> [a]] -> [([a] -> [a]) -> [a] -> [a]]) -> [([a] -> [a]) -> [a] -> [a]] -> [([a] -> [a]) -> [a] -> [a]]] -> [([([a] -> [a]) -> [a] -> [a]] -> [([a] -> [a]) -> [a] -> [a]]) -> [([a] -> [a]) -> [a] -> [a]] -> [([a] -> [a]) -> [a] -> [a]]]) -> [([([a] -> [a]) -> [a] -> [a]] -> [([a] -> [a]) -> [a] -> [a]]) -> [([a] -> [a]) -> [a] -> [a]] -> [([a] -> [a]) -> [a] -> [a]]] -> [([([a] -> [a]) -> [a] -> [a]] -> [([a] -> [a]) -> [a] -> [a]]) -> [([a] -> [a]) -> [a] -> [a]] -> [([a] -> [a]) -> [a] -> [a]]]

und so weiter, wobei sich die Länge für jedes ungefähr vervierfacht (/).(:). Der angegebene Ausdruck -o.o.ofunktioniert -(/).(:).(/).(:).….(/).(:)mit 4 6 · 3 4 = 331776 Kopien von (/).(:).


7

Haskell, 12,2 663552 + 9 · 663552 - 4

Noch eine kleine Verbesserung gegenüber Anders Kaseorgs Antwort .

f=(/).(/)
g=f.f.f.f
h=g.g.g.g
i=h.h.h.h
j=i.i.i.i
k=j.j.j.j
l=k.k.k.k
m=l.l.l
n=m.m.m
o=n.n.n
o.o.o

Wie es funktioniert

(/) -- score 27
   :: Fractional a => a -> a -> a
(/).(/) -- score 62
   :: (Fractional a, Fractional (a -> a)) => a -> (a -> a) -> a -> a
(/).(/).(/) -- score 119
   :: (Fractional a, Fractional (a -> a), Fractional ((a -> a) -> a -> a)) =>
      a -> ((a -> a) -> a -> a) -> (a -> a) -> a -> a
(/).(/).(/).(/) -- score 224
   :: (Fractional a, Fractional (a -> a),
       Fractional ((a -> a) -> a -> a),
       Fractional (((a -> a) -> a -> a) -> (a -> a) -> a -> a)) =>
      a
      -> (((a -> a) -> a -> a) -> (a -> a) -> a -> a)
      -> ((a -> a) -> a -> a)
      -> (a -> a)
      -> a
      -> a

Gerade geänderte Funktionszusammensetzung (.) in Bruchteilung(/) . Der Fractional xTeil in der Funktionssignatur explodiert zusammen mit dem Hauptteil und ergibt einen etwas höheren konstanten Multiplikator.


6

C 979

#define a int,int,int
#define b a,a,a,a
#define c b,b,b
#define d c,c,c
#define e d,d,d
int(*f)(e);

f hat die Unterschrift:

int(*)(int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int)

1
979 33554438 58640620148060 das sieht aus wie ein lächerlicher OEIS-Eintrag. Vielleicht die größten Änderungen in der Größenordnung, die ich je in einem verfeinerten PPCG-Eintrag gesehen habe.
Sparr


5

C ++ 11, nicht konkurrierend

Ich kaum kann es unter 100 Bytes bringen, aber es ist so nah, dass ich dachte, ich könnte es trotzdem posten, in der Hoffnung, dass jemand eine Optimierung entdeckt.

Dies ist der Prolog, der 93 Bytes kostet:

#define t(a,b,c)template<a>union A b{using T=c(*)(c);};
t(int N,,typename A<N-1>::T)t(,<0>,A)

Und der Ausdruck, 9 Bytes:

A<9>::T()

Um zu veranschaulichen:

Expr       Type
A<0>::T()  A<0> (*)(A<0>)
A<1>::T()  A<0> (*(*)(A<0> (*)(A<0>)))(A<0>)
A<2>::T()  A<0> (*(*(*)(A<0> (*(*)(A<0> (*)(A<0>)))(A<0>)))(A<0> (*)(A<0>)))(A<0>)

Jedes Mal, wenn die Zahl zunimmt, wird sie ungefähr verdoppelt.


Ich scheine mich zu erinnern, dass es einige sehr alte (vorstandardisierte?) Versionen von C ++ gab, die das Schlüsselwort classanstelle von verwendeten typename. Ich frage mich, ob es irgendwo einen Compiler gibt, der diese Phrasierung aus Gründen der Abwärtskompatibilität noch unterstützt.

4

C #, 363

Ausdruck:

new{a=new{a=new{a=new{a=new{a=new{a=new{a=new{a=new{a=new{a=new{a=new{a=new{a=new{a=""}}}}}}}}}}}}}}

Typ Unterschrift:

<>f__AnonymousType0#1`1[<>f__AnonymousType0#1`1[<>f__AnonymousType0#1`1[<>f__AnonymousType0#1`1[<>f__AnonymousType0#1`1[<>f__AnonymousType0#1`1[<>f__AnonymousType0#1`1[<>f__AnonymousType0#1`1[<>f__AnonymousType0#1`1[<>f__AnonymousType0#1`1[<>f__AnonymousType0#1`1[<>f__AnonymousType0#1`1[<>f__AnonymousType0#1`1[<>f__AnonymousType0#1`1[System.String]]]]]]]]]]]]]]

Probieren Sie es online!


1

Gehen Sie 1.0 ohne reflect98

Go 1.x-Typen sind statisch definiert. Hier ist mein erster Versuch:

[][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][]string{}

Auf dem Go-Spielplatz :

package main;import "fmt"
func main() {

    x := [][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][]string{}

    fmt.Printf("%d %T\n", len(fmt.Sprintf("%T", x)), x)
}

Go 1.9 mit Typ-Aliasnamen, 2389

type(I=interface{f();g()};S=struct{p,q,r,s,t,u,v,w,x,y,z I});map[S]map[S]map[S]map[S]map[S]map[S]S{}

Auf dem Go-Spielplatz :

package main;import("fmt";"strings")
func main() {

    type(I=interface{f();g()};S=struct{p,q,r,s,t,u,v,w,x,y,z I});x:=map[S]map[S]map[S]map[S]map[S]map[S]S{}

    fmt.Printf("%d %T\n", len(strings.Replace(fmt.Sprintf("%T", x), " ", "", -1)), x)
}

Ergebnis:

2389 map[struct { p interface { main.f(); main.g() }; q interface { main.f(); main.g() }; r interface { main.f(); main.g() }; s interface { main.f(); main.g() }; t interface { main.f(); main.g() }; u interface { main.f(); main.g() }; v interface { main.f(); main.g() }; w interface { main.f(); main.g() }; x interface { main.f(); main.g() }; y interface { main.f(); main.g() }; z interface { main.f(); main.g() } }]map[struct { p interface { main.f(); main.g() }; q interface { main.f(); main.g() }; r interface { main.f(); main.g() }; s interface { main.f(); main.g() }; t interface { main.f(); main.g() }; u interface { main.f(); main.g() }; v interface { main.f(); main.g() }; w interface { main.f(); main.g() }; x interface { main.f(); main.g() }; y interface { main.f(); main.g() }; z interface { main.f(); main.g() } }]map[struct { p interface { main.f(); main.g() }; q interface { main.f(); main.g() }; r interface { main.f(); main.g() }; s interface { main.f(); main.g() }; t interface { main.f(); main.g() }; u interface { main.f(); main.g() }; v interface { main.f(); main.g() }; w interface { main.f(); main.g() }; x interface { main.f(); main.g() }; y interface { main.f(); main.g() }; z interface { main.f(); main.g() } }]map[struct { p interface { main.f(); main.g() }; q interface { main.f(); main.g() }; r interface { main.f(); main.g() }; s interface { main.f(); main.g() }; t interface { main.f(); main.g() }; u interface { main.f(); main.g() }; v interface { main.f(); main.g() }; w interface { main.f(); main.g() }; x interface { main.f(); main.g() }; y interface { main.f(); main.g() }; z interface { main.f(); main.g() } }]map[struct { p interface { main.f(); main.g() }; q interface { main.f(); main.g() }; r interface { main.f(); main.g() }; s interface { main.f(); main.g() }; t interface { main.f(); main.g() }; u interface { main.f(); main.g() }; v interface { main.f(); main.g() }; w interface { main.f(); main.g() }; x interface { main.f(); main.g() }; y interface { main.f(); main.g() }; z interface { main.f(); main.g() } }]map[struct { p interface { main.f(); main.g() }; q interface { main.f(); main.g() }; r interface { main.f(); main.g() }; s interface { main.f(); main.g() }; t interface { main.f(); main.g() }; u interface { main.f(); main.g() }; v interface { main.f(); main.g() }; w interface { main.f(); main.g() }; x interface { main.f(); main.g() }; y interface { main.f(); main.g() }; z interface { main.f(); main.g() } }]struct { p interface { main.f(); main.g() }; q interface { main.f(); main.g() }; r interface { main.f(); main.g() }; s interface { main.f(); main.g() }; t interface { main.f(); main.g() }; u interface { main.f(); main.g() }; v interface { main.f(); main.g() }; w interface { main.f(); main.g() }; x interface { main.f(); main.g() }; y interface { main.f(); main.g() }; z interface { main.f(); main.g() } }

Gehe 1 mit reflect , 65532

Es gibt eine Grenze im Paketreflect von der Länge der Typennamen:len(name) <= 1<<16-1

Bisher konnte ich mit diesem Block einen Typnamen von 65532 Bytes erreichen:

t:=reflect.TypeOf(0);u:=t;for i:=0;i<8191;i++{t=reflect.MapOf(u,t)};reflect.New(t).Interface()

Vollständiger Code auf dem Go-Spielplatz :

package main;import("fmt";"reflect")
func main() {

    t:=reflect.TypeOf(0);u:=t;for i:=0;i<8191;i++{t=reflect.MapOf(u,t)};x:=reflect.New(t).Interface()

    fmt.Printf("%d %T\n", len(fmt.Sprintf("%T", x)), x)
}


Anmerkungen: x:=wird nie gezählt.


ungültig, reflectImport müsste gezählt werden
ASCII




1

Idris,> hyper (hyper (hyper (hyper (999999999, 99, 99), 99,99), 99,99), 99,99)

f:Nat->Type
f Z=()
f(S n)=hyper n n n~=~f n
the$f$hyper(hyper(hyper(hyper 999999999 9 9) 9 9)9 9)9 9

Erläuterung:

Wir definieren eine Funktion f, wobei die Berechnung eines Typs f (0) nur der Einheitentyp ist, während f (S (n)) den Gleichheitstyp berechnet, der auf das Funktionsargument angewendet wird, das von sich aus "hypered" ist, und auf f, das auf n angewendet wird . Die letzte Zeile ist im Grunde eine Funktion, die einen Wert eines Typs wie (27 = (4 = (2 = (1 = ())))) (für n = 4) erwartet.

Einfaches Beispiel

f 3 = (27 = (4 = (2 = (1 = ()))))

1
Ich kenne Idris nicht wirklich , aber ich denke, dies kann aus technischen Gründen scheitern: Sie sollten die Länge der Typensignatur eines Ausdrucks maximieren, nicht die Länge seines Werts. Ist die Typensignatur Ihres endgültigen Ausdrucks nicht gerechtfertigt :Type?
Ørjan Johansen

Was meinst du mit einer nicht berechenbaren Zahl ? Ich bin nicht vertraut mit hyper; könntest du erklären?
25.

@ ØrjanJohansen Oh ja, habe das gerade behoben und noch ein paar Änderungen vorgenommen
Mega Man

1
(0) Die Erklärung scheint etwas nachzulaufen. (1) Das sind jetzt nur noch 98 Bytes. (2) Da das erste Argument von hyperenorm mehr als der Rest verstärkt wird, denke ich, dass Sie wollen, dass alle / die meisten von denen 99s 9s sind. (3) Angenommen, Idris $arbeitet wie Haskell, ist die äußere Klammer nach f$überflüssig. (4) Könnten Sie abkürzen hyperoder würde dies eine Typensignatur selbst erfordern?
Ørjan Johansen

1
@dfeuer en.wikipedia.org/wiki/Hyperoperation ( Die Idris Definition ist eine direkte Übersetzung.)
Ørjan Johansen

0

Haskell, 782

Ausdruck:

sum.sum.sum.sum.sum.sum.sum.sum.sum.sum.sum.sum.sum.sum.sum.sum.sum.sum.sum.sum.sum.sum.sum.sum.sum

Typ Unterschrift:

:: (Num [[[[[[[[[[[[[[[[[[[[[[[[c]]]]]]]]]]]]]]]]]]]]]]]], Num [[[[[[[[[[[[[[[[[[[[[[[c]]]]]]]]]]]]]]]]]]]]]]], Num [[[[[[[[[[[[[[[[[[[[[[c]]]]]]]]]]]]]]]]]]]]]], Num [[[[[[[[[[[[[[[[[[[[[c]]]]]]]]]]]]]]]]]]]]], Num [[[[[[[[[[[[[[[[[[[[c]]]]]]]]]]]]]]]]]]]], Num [[[[[[[[[[[[[[[[[[[c]]]]]]]]]]]]]]]]]]], Num [[[[[[[[[[[[[[[[[[c]]]]]]]]]]]]]]]]]], Num [[[[[[[[[[[[[[[[[c]]]]]]]]]]]]]]]]], Num [[[[[[[[[[[[[[[[c]]]]]]]]]]]]]]]], Num [[[[[[[[[[[[[[[c]]]]]]]]]]]]]]], Num [[[[[[[[[[[[[[c]]]]]]]]]]]]]], Num [[[[[[[[[[[[[c]]]]]]]]]]]]], Num [[[[[[[[[[[[c]]]]]]]]]]]], Num [[[[[[[[[[[c]]]]]]]]]]], Num [[[[[[[[[[c]]]]]]]]]], Num [[[[[[[[[c]]]]]]]]], Num [[[[[[[[c]]]]]]]], Num [[[[[[[c]]]]]]], Num [[[[[[c]]]]]], Num [[[[[c]]]]], Num [[[[c]]]], Num [[[c]]], Num [[c]], Num [c], Num c) => [[[[[[[[[[[[[[[[[[[[[[[[[c]]]]]]]]]]]]]]]]]]]]]]]]] -> c

Wird 1814 Zeichen mit ghc 8.0.2, wie der Typ sumdann ist(Num a, Foldable t) => t a -> a
Mathieu CAROFF

0

Ceylon, 38843546786070481 (~ 4 · 10 16 )

[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]

Dies sind 49 verschachtelte Ein-Tupel mit einem leeren Tupel im Innersten. Der Kurzname dieses Typs entspricht in diesem Fall dem Wert, der vollständig erweiterte Name ist jedoch viel länger.

Der Ceylon-Compiler arbeitet ununterbrochen, wenn er versucht, dies zu kompilieren (der Compiler lief noch nach 180 Minuten). Ich muss versuchen, die theoretische Typlänge zu berechnen.

Das Problem hierbei ist, dass ein Ein-Element-Tupel-Typ [X]in Ceylons Typsystem tatsächlich dargestellt wird als Tuple<X, X, []>(der erste Parameter ist ein Supertyp für alle Elementtypen, der zweite ist der Typ des ersten Elements und der dritte der Typ aller mit Ausnahme der ersten Elemente Dies ist hier ein leeres Tupel (das emptyObjekt, die einzelne Instanz, die die Schnittstelle erfüllt Empty).

So []ist empty, [[]]ist Tuple<[], [], []>= Tuple<empty, empty, empty>, [[[]]]ist Tuple<[[]], [[]], []>= Tuple<Tuple<[], [], []>, Tuple<[], [], []>, []>. Und der vollständige Name enthält die Paketnamen, so dass wir eigentlich ceylon.language::Tuple<ceylon.language::Tuple<ceylon.language::empty, ceylon.language::empty, ceylon.language::empty>, ceylon.language::Tuple<ceylon.language::empty, ceylon.language::empty, ceylon.language::empty>, ceylon.language::empty>nur für drei Ebenen haben. Und wir wollen zu 50 gehen.

Da ceylon.language::empty22 Zeichen lang sind und jedes ceylon.language::Tuple<?,?,ceylon.language::empty>47 zu dem doppelten Ergebnis des vorherigen Schritts addiert, erhalten wir f(1) = 22und f(n) = 2 · f(n-1) + 47. Dies vereinfacht sich f(n) = 69 · 2^(n - 1) - 47, und die Eingabe von 50 ergibt 38843546786070481. Natürlich ist dies viel größer als das, was in den Speicher meines Computers passen würde (8 · 10 9 Bytes).

Natürlich könnte der Compiler klug sein und nicht versuchen, den gesamten Typnamen im Speicher zu haben, bis sein Name angefordert wird.

Hier ist das vollständige Programm, das versucht, den Typ zu drucken:

import ceylon.language.meta {
    type
}
"Run the module `codegolf.signature71797`."
shared void run() {
    value x = [[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]];
    print(type(x));
}

0

C # (Visual C # Interactive Compiler) , 99 Byte, Score 841

(1,(1,(1,(1,(1,(1,(1,(1,(1,(1,(1,(1,(1,(1,(1,(1,(1,(1,(1,(1,(1,(1,(1,(1,1,1))))))))))))))))))))))))

Probieren Sie es online!

Ausgänge

System.ValueTuple`2[System.Int32,System.ValueTuple`2[System.Int32,System.ValueTuple`2[System.Int32,System.ValueTuple`2[System.Int32,System.ValueTuple`2[System.Int32,System.ValueTuple`2[System.Int32,System.ValueTuple`2[System.Int32,System.ValueTuple`2[System.Int32,System.ValueTuple`2[System.Int32,System.ValueTuple`2[System.Int32,System.ValueTuple`2[System.Int32,System.ValueTuple`2[System.Int32,System.ValueTuple`2[System.Int32,System.ValueTuple`2[System.Int32,System.ValueTuple`2[System.Int32,System.ValueTuple`2[System.Int32,System.ValueTuple`2[System.Int32,System.ValueTuple`2[System.Int32,System.ValueTuple`2[System.Int32,System.ValueTuple`2[System.Int32,System.ValueTuple`2[System.Int32,System.ValueTuple`2[System.Int32,System.ValueTuple`2[System.Int32,System.ValueTuple`3[System.Int32,System.Int32,System.Int32]]]]]]]]]]]]]]]]]]]]]]]]
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.