ロングタイプの署名を作成する


23

チャレンジ

最長のタイプシグネチャを持つ最大100バイトの式を見つけます。

ルール

  • 型推論を持つ静的型付け言語はすべて許可されます
  • 型は曖昧でない必要がありますが、定義されたインスタンスのない型を含めることができます。例えばNum [a]Eq [a]も定義されたインスタンスなしに、許可されています
  • STDIN / STDOUTを使用してプログラムをコンパイルするために最低限必要な以外のインポートはありません
  • 無限型は許可されていません
  • 回答に複数の表現がある場合、スコアに貢献できるのは1つだけです。たとえば、作曲のタイプシグネチャは(.) :: (b -> c) -> (a -> b) -> a -> c20のスコアですが、25コピーの回答(.)\nのスコアは500ではなく20です。
  • 式は最大100バイトでなければなりません
  • スコアは、関数の名前と空白を除く、タイプシグネチャの文字数です。たとえばf :: (a -> b) -> a -> b、12のスコアがあります
  • 最高のスコアが勝ちます!

他の言語も使用できますが、次の例は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)]

関連。私はほとんど正確なだましがあったと思いましたが、私はそれを見つけていません。
ピーターテイラー

2
私は、依存型付けを備えた言語が、計算可能な長さの型シグネチャを作成できると疑っています。
xnor

@xnor型システム自体が完全にチューリングされている可能性があるため(stackoverflow.com/a/4047732/5154287)、それはよりビジーなビーバーの問題になると思います。タグを編集する必要がありますか?
マイケルクライン

回答:


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

各アプリケーションf略型シグネチャを形質転換することにより型シグネチャを倍増Tします(T,T)。たとえば、4分割構成のf.f.f.f$0タイプは

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

各行はf、のアプリケーション数を4倍に4^9 = 2^18し、最後に与えます。したがって、型シグネチャのサイズはのオーダーです2^(2^18)


2
古典的なアプローチですが、パラメーターをより良く調整できると思います。具体的には、最後の行のf x=(x,x,x)1つのコストでn.、この全体的な構造に最適なスコアが得られると思います。
ピーターテイラー

Haskellがわからないので、ここから離れることもできますが、4 ^(4 ^ 4)が3 ^(4 ^ 5)より小さいことを指摘します
Sparr

4日目n.はもっと大きくなると確信しています。2^18vs 3 * (2^16)元のべき乗の計算を間違えない限り:2^(4^9)vs.3^((4^8)*3)
Draco18s

いいえ、@ PeterTaylorは正しいです:2 ^(4 ^ 9)= 16 ^(4 ^ 8)<27 ^(4 ^ 8)= 3 ^(4 ^ 8⋅3)。
アンダースカセオルグ

(,)(または(,,))を使用して、いくつかのバイトを保存し、さらにns を使用してスコアを改善できます。
ბიმო

11

Java、スコア17301488

メソッドが必要です<T>java.util.Map<T,T>f(T t){return null;}。これは、100バイトの制限にカウントされています。

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

これのコンパイル時の型シグネチャはこれに一致する必要があります。


うーん。ラムダが許可されているため、これはおそらくより高いスコアを取得します
ASCIIのみ

10

Haskellの拡張子を持つ、AAAA2200000

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)

オンラインでお試しください!

必要です-XDataKinds-XPolyKinds-XTypeOperators-XUndecidableInstances、と-XTypeFamilies

ØrjanJohansenに感謝します。ØrjanJohansenは、自然数コンストラクターを挿入し、引数を構築することで2バイト節約され、2回の繰り返しに十分なスペースを確保できることに気付きました#

明らかに、型チェッカーはこのプログラムをチェックしようとしてあきらめます。署名がどのように見えるかについて一般的な感覚を得るには(観測可能な宇宙に収まるほど小さい場合)、もっと小さいものを試してください

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

説明

#タイプファミリは密接に関連しているアッカーマン・ピーター機能を一般的に記述され、Aが、#かなり速く成長します。Ackermann–Péter関数が定義されています

A0n=n+1

Am0=Am11m>0

Amn=Am1Amn1mn>0

#B

B0n=n+1

Bm0=Bm1mm>0

Bmn=Bm1Bmn1mn>0

ABmnAmnmn

ここで、単項表現を計算します

r=BBBBBBBB000000000

BBBB00000=220

r=BBBB2200000

AAAA000005BA

A60

自然数の定義(?)は、少し非標準です。スペースを節約するために(?)、自然数タイプ(タイプレベル)とプロキシタイプ(用語レベル)の両方として使用します。

本当に大きな型に到達するために必要な型レベルの計算を得るには、どちらかTypeFamiliesまたは(より詳細かつ難読化された)FunctionalDependenciesが必要だと思います。UndecidableInstancesHaskellの非常に原始的な終了チェックを回避するために必要です。他の拡張機能は、コードを使用可能な小さなスペースに圧縮するためにのみ必要です。



@ØrjanJohansen、Zで始まるよりも前にsを重ねるS(S Z)#S Zのと同じですか?
dfeuer

いずれにしても#Z、最後の追加は大歓迎です。
dfeuer

1
これはまったく同じ値ですが、1バイトを?節約し、データ型を変更してもう1バイトを節約し、余分なスペースを残します#Z
Ørjanヨハンセン

1
あなたが最初に編集している間、私はA(m,1)が決してを超えることはないことを発見しA(A(m,0),0)、それについて言及しようとしていましたが、その後、オプションが等しい点まで最適化されました。(またm+1A(m,0)。より大きくなることはありません。)
ØrjanJohansen

9

ハスケル、9・2 663552 − 3(≈1.02・10 199750

上に小さい(「小」)の改善XNORの5⋅2 262144 + 5。これは99バイトです。

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

使い方

我々は持っています

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

など、それぞれの長さが約2倍になります(:)。与えられた式は、o.o.oにうまくいく(:).(:).(:).….(:)・2と4 6 3・4の= 663552コピー(:)

Haskell FlexibleContextsNoMonomorphismRestriction、(200・4 331776 + 75・331776 + 16)/ 9≈2.53・10 199750

バブラーの12・2 663552 + 9・663552 − 4≈1.36・10 199750よりもわずかに改善されていますが、これもこれらの拡張機能に依存しています。チャレンジ一種の文言は、(「例えば、それらに依存してもいいかもしれない示唆Num [a]し、Eq [a]許可されている、としても定義されているインスタンスなし」); よく分かりません。これは100バイトです。

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

使い方

我々は持っています

-(/).(:) :: (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]]]

など、それぞれの長さが約4倍になります(/).(:)。与えられた式は、-o.o.oにうまくいく-(/).(:).(/).(:).….(/).(:)と4 6・3 4 = 331776コピー(/).(:)


7

ハスケル、12・2 663552 + 9・663552-4

Anders Kaseorgの答えに対するさらに別の小さな改善。

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

使い方

(/) -- 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

関数の構成(.)を分数除算に変更しました(/)Fractional x僅かに高い一定の乗数を与える主要部分と共に機能署名爆発に部分。


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 署名があります:

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これは、とんでもないOEISエントリのように見えます。おそらく、PPCGエントリが洗練されているのを見たとき、大きさの最大の変化です。
スパー


5

C ++ 11、非競合

私はかろうじて 100バイトの下に、これを取得することはできませんが、それは私が、私は誰かが最適化をスポットすることを期待して、とにかくそれを投稿するかもしれない考え出し近いそうです。

これはプロローグで、コストは93バイトです。

#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)

そして、式、9バイト:

A<9>::T()

説明する:

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>)

数が増えるたびにほぼ倍増します。


classなくキーワードを使用したC ++の非常に古い(先行標準?)バージョンがあったことを覚えているようですtypename。後方互換性のためにその表現をまだサポートしているコンパイラがどこかにあるのだろうか?

4

C#、363

式:

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=""}}}}}}}}}}}}}}

タイプ署名:

<>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]]]]]]]]]]]]]]

オンラインでお試しください!


1

Go 1.0なしreflectで98

Go 1.xタイプは静的に定義されています。これが私の最初の試みです。

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

Goの遊び場で

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

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

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

型のエイリアスを使用してGo 1.9、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{}

Goの遊び場で

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)
}

結果:

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() } }

reflect65532 を使用してGo 1

パッケージreflectには、型名の長さに制限があります。len(name) <= 1<<16-1

これまで、このブロックで65532バイトの型名に到達できました。

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

Goプレイグラウンドの完全なコード

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)
}


注:x:=カウントされません。


無効、reflectインポートをカウントする必要があります
ASCIIのみ




1

イドリス、> hyper(hyper(hyper(hyper(hy9999(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

説明:

関数fを定義しています。型f(0)の計算は単なる単位型ですが、f(S(n))は関数引数に「ハイパー」で適用され、nに適用されたfに等しい型を計算します。最後の行は、基本的に(27 =(4 =(2 =(1 =())))))(n = 4のような)型の値を期待する関数です。

簡単な例

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

1
イドリスはあまり知りません、技術的には失敗する可能性があります。値の長さではなく、式の型シグネチャの長さを最大化することになっています。最終式の型シグネチャだけではありません:Typeか?
Ørjanヨハンセン

計算できない数値とはどういう意味ですか?私はよく知らないhyper。説明してもらえますか?
dfeuer

@ØrjanJohansenそうそう、それを修正して、さらにいくつかの変更を適用しました
Mega Man

1
(0)説明が少し遅れているようです。(1)これは現在98バイトです。(2)の最初の引数は他の引数hyperよりも非常に大きく増幅99されるため、これらのすべて/ほとんどをsにしたいと思います9。(3)$HaskellのようなIdrisの作品を仮定すると、その後の括弧の外側のセットf$は冗長です。(4)短縮できますhyperか、それとも型署名自体が必要ですか?
Ørjanヨハンセン


0

ハスケル、782

式:

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

タイプ署名:

:: (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

ghc 8.0.2で1814文字になります。そのタイプsum(Num a, Foldable t) => t a -> a
Mathieu CAROFF

0

セイロン、38843546786070481(〜4・10 16

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

これは、49個のネストされた1タプルで、最も内側に空のタプルがあります。このタイプの短縮名は実際にはこの場合の値と同じですが、完全に展開された名前ははるかに長くなります。

これをコンパイルしようとすると、Ceylonコンパイラーは永久に動作します(コンパイラーは180分後に実行されていました)–理論的な型の長さを計算する必要があります。

ここでの問題は、1要素タプル型[X]が実際にCeylonの型システムで表されることですTuple<X, X, []>(最初のパラメーターはすべての要素型のスーパータイプ、2番目は最初の要素の型、3番目は最初の要素以外のすべての型、ここでは空のタプル(emptyオブジェクト、インターフェイスを満たす単一のインスタンスEmpty)です)。

そう[]ですempty[[]]であるTuple<[], [], []>= Tuple<empty, empty, empty>[[[]]]ですTuple<[[]], [[]], []>= Tuple<Tuple<[], [], []>, Tuple<[], [], []>, []>。また、フルネームにはパッケージ名が含まれているため、実際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>には3つのレベルのみがあります。そして、私たちは50に行きたいです。

ceylon.language::empty22文字の長さ、そしてそれぞれがceylon.language::Tuple<?,?,ceylon.language::empty>前のステップから2回の結果に47を追加し、我々が得るf(1) = 22、とf(n) = 2 · f(n-1) + 47。これはを単純化しf(n) = 69 · 2^(n - 1) - 47、50を入力すると38843546786070481になります。もちろん、これはコンピューターのメモリに収まるサイズ(8・10 9バイト)よりもはるかに大きくなります。

もちろん、コンパイラは賢く、名前が要求されるまでメモリ内に型名全体を保持しようとはしません。

タイプを印刷しようとする完全なプログラムは次のとおりです。

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バイト、スコア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))))))))))))))))))))))))

オンラインでお試しください!

出力

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]]]]]]]]]]]]]]]]]]]]]]]]
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.