乱れた再配置


14

あなたの仕事は、行に分割される(改行文字で分割される)ときに、行のすべての配置が1からnの間の異なる数を出力するようにコンピュータープログラムを書くことですnは行の総数です)。2つの異なる配置で数値を出力することはできません。すべての配置でこの範囲の数値を出力する必要があります。nがあるのでプログラムの行を配置する方法。これは、各番号が1回の再配置で出力されることを意味します。

たとえば、Pythonプログラム

print 1;"""
print 2;"""

2つの取り決めがあります

print 1;"""
print 2;"""

そして

print 2;"""
print 1;"""

最初の出力1と2番目の出力2

使用している言語の標準である出力形式を使用できます。なんらかのボイラープレートを想定してはいけません。言語が主張している形式を回避する必要がある場合、この課題はより興味深いと思います。

得点

スコアはプログラムの行数になり、スコアが高いほど良くなります。あなたは、出力番号に選択することが0n個!-1あなたが好きならば。


3
何かに役立つ構造を提示する答えはどうnですか?それらはすべて∞のスコアで結ばれていますか?
マーティンエンダー

@MartinEnderはい。∞は良いスコアです。そのような構造を見つけたら、勝ちます。
ポストロックガーフハンター

@AdmBorkBorkはい、各アレンジメントは1つの数値を出力する必要があります。それはより明確ですか?
ポストロックガーフハンター

1
@totallyhuman使用しているすべての言語の標準出力ルール。これについて完全に明確になるように質問を更新します。
ポストロックガーフハンター

1
@EriktheOutgolferタイブレーカーなし。MartinはCJamで無限大を獲得する方法を見つけたかもしれませんが、試してみる他の言語がたくさんあります。
ポストロックガーフハンター

回答:


7

CJam、スコア:∞

各行は次の形式です

];Lx+:L{__(f<0+:+\,,(;1+:**\(;}h]:+

どこxから番号である0とはn-1。結果は以下の範囲0にありますn!-1です。

オンラインでお試しください!n=3。の場合)

クレジットjimmy23013実際の順列インデックスを計算コードのため。];Lx+:L前の行からの結果を破棄する入力を読み取るビットのみを置き換え、現在の行のインデックスを変数L(最初は空の配列)に追加します。


ああ、私はそれを書きました。しかし、それはゴルフのようには見えません...(例えば0+:+)を使用してはるかに短いバージョンを取得できると思います,m!#
jimmy23013

4

Perl:∞

$z.="-1,";$_.=A;END{$m.=!!s/./{${z}B}/g,map(/B/||s/\d+\K/,/g*/(-\d*,).*\1/||($n{$_}||=$m++),sort glob),print$n{$z}if/A/}
$z.="-2,";$_.=A;END{$m.=!!s/./{${z}B}/g,map(/B/||s/\d+\K/,/g*/(-\d*,).*\1/||($n{$_}||=$m++),sort glob),print$n{$z}if/A/}
$z.="-3,";$_.=A;END{$m.=!!s/./{${z}B}/g,map(/B/||s/\d+\K/,/g*/(-\d*,).*\1/||($n{$_}||=$m++),sort glob),print$n{$z}if/A/}

好きな長さに延長

メモリ使用量はO(n ^ n)に似ているため、メモリがすぐに不足します。ただし、置換インデクサーをO(n)コードに置き換えるのは簡単です。END{}perlでこのタスクに使用できる方法を示しています。すべてのEND{}ブロックは終了時に実行されますが、呼び出される最初のブロック(コードの最後のブロック)のみが、1 /A/回だけtrueであるテストのために出力します

$mカウンターは文字列としてカウントする必要があることに注意してください。これは、数字としてオーバーフローするためです(宇宙の終わりよりも後でありますが、カウントする原則です)。同じ理由でA、実際のカウンタを使用する代わりにsの文字列を作成して行数を「カウント」しますが、このオーバーフローは後で発生します。

perlでこれを行う別の方法:

@{$b.=A; if($a eq $b) {use bigint; $n=0;$n++for@F;$c=0;$c=$c*$n--+map{$z=$_;$a=grep$_&&$_>$z,@F;$_=0;}@F;print$c}}=()x push@F,"1".!($a.=A),
@{$b.=A; if($a eq $b) {use bigint; $n=0;$n++for@F;$c=0;$c=$c*$n--+map{$z=$_;$a=grep$_&&$_>$z,@F;$_=0;}@F;print$c}}=()x push@F,"2".!($a.=A),
@{$b.=A; if($a eq $b) {use bigint; $n=0;$n++for@F;$c=0;$c=$c*$n--+map{$z=$_;$a=grep$_&&$_>$z,@F;$_=0;}@F;print$c}}=()x push@F,"3".!($a.=A),

これは、in foo = bar barがの後に実行されるという事実を使用していfooます。ちなみに、このバージョンは時間と空間に夢中になりませんが、コードが長くなります

さらに別のアイデアはDESTROY、そのうちの1つだけが実行されるという利点があるものを使用することです。既に2つの例を挙げた順列索引付けコードを繰り返すつもりはありません。

push@F,"1";bless\@F;DESTROY{print"Work out permutation index of @{$_[0]}\n" }
push@F,"2";bless\@F;DESTROY{print"Work out permutation index of @{$_[0]}\n" }
push@F,"3";bless\@F;DESTROY{print"Work out permutation index of @{$_[0]}\n" }

または使用BEGIN

BEGIN{push@F,"1"} print"Work out permutation index of @F\n"; exit;
BEGIN{push@F,"2"} print"Work out permutation index of @F\n"; exit;
BEGIN{push@F,"3"} print"Work out permutation index of @F\n"; exit;

3

ゼリー、∞

;3ÇQŒ¿$⁼Q$?
;2ÇQŒ¿$⁼Q$?
;1ÇQŒ¿$⁼Q$?

n=3。の例)

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

23 13 11行あたり11バイト。

n行のあるプログラムの場合、行の形式は

; <i> ÇQŒ¿$⁼Q$?

ここでは、<i>数値リテラルを表しi、各行はごとに異なる値を有するi範囲1にしますn。(i実際の値は、これらの特定の数値である必要はありません。一意の正の値を持っている必要があります。)このプログラムでは、nは行構造でしました。

どうやって?

  • 議論なしでゼリーは 0ます。
  • ;1アクティブリストに追加10ます。
  • ⁼Q$?リストの要素が一意かどうかをチェックするifステートメント()の条件付きモナドです。存在する場合、上記のリンクが呼び出され(Ç)、リストに別の番号が追加されます。それらが一意でない場合、それは最初のリンクにラップアラウンドしたことを意味します。繰り返された要素はリストから削除され(Q)、順列のインデックスが見つかります(Œ¿)。そこにあることに注意して0、リストの先頭にŒ¿の値があるため取られますが、出力には影響を与えませんiすべて正です。

新しいゼリー機能

新しく追加されたとのƑ迅速な、我々は減らすことができます⁼Q$バイトを保存し、。

10バイト/行(1桁の場合)

;1ÇQŒ¿$QƑ?

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


2

Brain-Flak、3

(({}){})
({}())
(()(){([()()]{})()(){[()()](<{}>)}}{})

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

私は以前チャットでこれを投稿しましたが、うまくいけばここに投稿することで、人々がそれを構築できるようになります。

説明

基本プログラムから始めます

(({}){})
({}())

これはそれ自体で2点です。次のレベルにステップアップするために、新しい行を追加します。私の最初の推測は

(()(){[()()]{}(<()>)}{})

これは、TOS 2がゼロの場合にTOSを設定し、それ以外の場合は何もしません。これは実際には良いスタートです。他の2行では、16除くすべての数値を取得できます。出力4する2方法があるため2です。

({}())
(({}){})
(()(){[()()]{}(<()>)}{})

そして

({}())
(()(){[()()]{}(<()>)}{})
(({}){})

これを改善するために、私たちのラインを同じくセットに2します4。これは

(()(){([()()]{})()(){[()()](<{}>)}}{})

明確にするために、これは基本的にHaskell関数を実装します

f 0 = 2
f 2 = 4
f x = x

これにより、以前に出力していたプログラムの1つが他のプログラムを変更せずに出力する2ようになったため、問題が修正されます4


2

Java 7、スコア:∞

public class DerangedRearrangements implements B{public void a(){System.out.println("0");}public static void main(String[]a)throws Exception{java.util.regex.Pattern p=java.util.regex.Pattern.compile("^(?:public )?class ([\\w]+).*");java.io.BufferedReader r=new java.io.BufferedReader(new java.io.FileReader("./DerangedRearrangements.java"));String line; while((line=r.readLine())!=null){java.util.regex.Matcher m=p.matcher(line);if(m.matches()){((B)Class.forName(m.group(1)).getDeclaredConstructor().newInstance()).a();}}}}interface B{void a();}
class b1 implements B{public void a(){System.out.println(getClass().getName().substring(1));}}

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

これは、プリントアウトすることができている0をするのn!-1。追加の行は、次の形式のものである(INDEXは数字である1N-1! )。

class b<INDEX> implements B{public void a(){System.out.println(getClass().getName().substring(1));}}

このメソッドは、クラスがリストされている順序を決定するために、独自のソースを読み取ることによって機能します。残念ながら、コンパイルされたファイルを解析したり、JavaがJITコンパイルを行う方法のおかげでカスタムClassLoaderを作成したりすることで見つけられるクールな方法はありませんでした。追加の各クラスに静的に定義された数値を出力するだけでよいと思いますが、これはもっと面白そうです。また、Bインターフェイスを削除できるようになりますが、スコアはバイトに基づいていないため、楽しみのために残しておきます。

仕組み(高レベル):

行ごとに独自のソースコードを読み取ります。各行は新しいクラスを宣言するため、リフレクションを使用して新しいクラスのインスタンスを作成しaBインターフェイスを実装するために必要なメソッドを呼び出します。


1

ルビー、スコア:∞

(a||=[])<<2;a.size<3?0:(p 1+a.sort.permutation.to_a.index(a))
(a||=[])<<1;a.size<3?0:(p 1+a.sort.permutation.to_a.index(a))
(a||=[])<<3;a.size<3?0:(p 1+a.sort.permutation.to_a.index(a))

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

このプログラムには、1行あたり61バイトがあります(n <10の場合)。これは、dylnanのソリューションと同じ基本形式を持ちます。各行の最初の数値は1との間で異なる値になりn、各行の2番目の数値はになりますn

nプログラムに含まれないようにする方法を探していましたが、見つけられませんでした。



0

05AB1E、スコア:1,114,112

0ˆ¯JD{œsk
1ˆ¯JD{œsk
2ˆ¯JD{œsk

オンラインでお試しください!0インデックス付き。各行の先頭のˆは、個別の文字をグローバル配列にプッシュします。最後の行を除いて、コードの残りの部分は無意味に実行されます。最後の行では、値を文字列に連結し、順列インデックスを見つけます。1,114,112は、執筆時点で使用可能なUnicode文字の数です(もちろん、コードポイント48〜57を示すのが最も簡単です)。

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