文字列と数字を楽しもう


13

プログラミングパズルは次のとおりです。

たとえば、文字列と対応する番号のペアのリストが与えられた場合、[[A,37],[B,27],[C,21],[D,11],[E,10],[F,9],[G,3],[H,2]]次の方法で文字列のみを持つ別のリストを出力します。

  1. 文字列の総数は、入力データの対応する数と正確に等しくなければなりません。

  2. シーケンス内で文字列が隣接して繰り返されてはならず、すべての文字列が出力リストに表示される必要があります。

  3. 次の文字列の選択は、2つのルールを超えない限り、ランダムに実行する必要があります。各ソリューションには、選択されるゼロ以外の確率が必要です。

  4. 組み合わせが不可能な場合、出力はになります0

入力リストは任意の順序(ソート済みまたは未ソート)で指定でき、リスト内のストリングの長さは任意です。


上記のサンプル入力1のサンプル出力

[A,B,A,B,A,B,A,B,A,B,A,B,A,B,A,B,A,B,A,B,A,B,A,B,A,B,A,B,A,B,A,B,A,B,A,B,A,B,A,B,A,B,A,B,A,B,A,B,A,B,A,B,A,B,A,C,A,C,A,C,A,C,A,C,A,C,A,C,A,C,A,C,A,C,D,C,D,C,D,C,D,C,D,C,D,C,D,C,D,C,D,C,D,C,D,C,E,F,E,F,E,F,E,F,E,F,E,F,E,F,E,F,E,F,E,G,H,G,H,G]


入力サンプル2:

[[A,6],[B,1],[C,1]]

2番目の入力の出力:

0

ルールに基づいて可能なリストがないため


サンプル入力3:

[[AC,3],[BD,2]]

有効な出力: [AC,BD,AC,BD,AC]

無効な出力: [AC,BD,AC,AC,BD]


さらに説明が必要な場合は、コメントで私に伝えることをheしないでください、私はすぐにそれに応じて行動します。

これはなので、各言語のバイト単位の最短コードが勝ちです!


ナイスチャレンジ!私たちの基準では少し不十分に指定されていると思います。The Sandboxを使用して、チャレンジを投稿する前に多くのフィードバックを取得することを強く推奨します。:-)私はあなたからのより良い挑戦を見るのを楽しみにしています!
ジュゼッペ

@ジュゼッペ、ありがとうございます。これを見逃した場合、詳細を追加する必要があるかどうかを教えてください。
Stupid_Intern

1
文字列と数字だけの2つの入力を取得できますか?
FrownyFrog

「ランダム」というフレーズの使用にはあいまいさがあるかもしれません。これらのソリューションのいくつかは、実際には擬似ランダムのみである「ランダム」ライブラリを使用しています。
明るい

回答:


6

ゼリー、11バイト

Œṙ'Œ!⁻ƝẠ$ƇX

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

Œṙ'Œ!⁻ƝẠ$ƇX Arguments: z
  '         Flat: Apply link directly to x, ignoring its left and right depth properties
Œṙ            Run-length decode
   Œ!       Permutations of x
         Ƈ  Filter; keep elements of x for which the link returns a truthy result
        $     ≥2-link monadic chain
      Ɲ         Apply link on overlapping pairs (non-wrapping)
     ⁻            x != y
       Ạ        Check if all elements of x have a truthy value (+vacuous truth)
          X Pick a random element of x; return 0 if the list is empty.

Œṙベクトル化しなかった場合は、それなしで動作します'
ダイナン

5

ゼリー、17バイト

Wẋ¥Ɲ€ẎẎŒ!Œɠ’SƊÐḟX

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


私が試し["A", 100], ["B", 3]てみると、何も出力されず、スタックしていると思います。
Stupid_Intern

1
@newguy 103個のアイテムのすべての順列を生成することは、その速度で有名ではありません。参考のため、後の結果にŒ!は99029007164861804075467152545817733490901658221144924830052805546998766658416222832141441073883538492653516385977292093222882134415149891584000000000000000000000000要素が含まれます。
エリックアウトゴルファー

@newguyこのソリューションはO(n!)短いですが、速度は問題ではありません。数字が約6〜8以上になるようなものでは試さないでください。P
HyperNeutrino

Œṙ助けてもらえますか?
アーナルド

1
私はそれが私が試した文字列のために働いているとは思わない@dylnan ["AT", 3], ["B", 3]となっTBATATBAB間違っている出力として
Stupid_Intern

5

Pythonの2114の 189 185 174バイト

from random import*
a=input()
s=u=[]
while a:x,y=a.pop(a.index(next((w for w in a if w[1]>sum(v[1]for v in a+u)/2),choice(a))));s=s+[x];a+=u;u=[[x,y-1]]*(y>1)
print[s,0][y>1]

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

痛い!ルール3ではさらに難しくなります... :)。まだO(n!)アプローチを避けようとしているので、宇宙の熱死の前にいつでもすべてのテストケースを処理できます...

アルゴリズム:文字列カウントの合計がであると仮定しますt。任意の文字列は、カウントされている場合nとを2*n>t+1、制約を満足させることはできません。したがって、文字列(以前に選択されたものを除く)がでカウントされnている2*n=t+1場合、次にその文字列を選択する必要があります。それ以外の場合は、以前に選択した文字列ではない任意の文字列をランダムに選択できます。


1
@Arnauld:それを見逃しました!現在修正済み。
チャスブラウン

4

R148 141バイト

function(x,y,p=combinatXXpermn(rep(seq(y),y)),q=which(sapply(lapply(p,diff),all)))"if"(n<-sum(q|1),"if"(n-1,x[p[[sample(q,1)]]],x[p[[q]]]),0)

オンラインでお試しください!(私はそこにコピーcombinat::permnして呼び出しましcombinatXXpermnた。)

ブルートフォースO(n!)ソリューション。

パッケージから使用permnして、combinat可能なすべての順序を生成します。次に、ルールに従っているかどうかを確認し、そのうちの1つをランダムに選択します。


n<-sum(n|1)私は信じているより短いバイトです。しかし、sample長さ1の入力の癖は、ここではかなりイライラします。
ジュゼッペ

それを少しゴルフダウンして、ここ試してみてください -リンクを十分に小さくするためにヘッダーからcombinatXXpermnを削除する必要がありました
ジュゼッペ

入力をデータフレームとして取得するのに非常に似ものがありました。ブルートフォースの問題は、大きすぎる入力を処理できないことです
...-JayCe

@JayCeは、このチャレンジのルール3を考えれば、非ブルートフォースアルゴリズムでも可能ですか?
-ngm

そうではないことに同意します。ルール3がなければもっと面白かったでしょう
。– JayCe

3

JavaScript、112バイト

これに最初に合格し、さらにゴルフを(できれば)続けます。

f=([i,...a],o=[])=>a.sort((x,y)=>(y[1]-x[1])*Math.random()-n*.5,n=--i[1],o.push(i[0]))+a?f(n?[...a,i]:a,o):n?0:o

オンラインで試す


1
ありがとう、@ Arnauld、私はそれを見逃していました。Chasのリードを盲目的にたどるのではなく、スペックを再確認する必要がありました。簡単な修正を実装しました。後でゴルフに戻れるかどうかを確認するために、後で戻ってくる必要があります。
シャギー

うん、第三のルールは、とにかく簡単に強引すべてのソリューションをすることができますesolangsためOKですが、それはそれは非常に難しい他の言語で短いアルゴリズムを実装することができます...ところで:これは今返すように思わ0時から有効なエントリ上を。
アーナルド

別の簡単な修正、@ Arnauldを実装しました。それでソートされない場合は、それを調べる時間ができるまで再び削除する必要があります。注:次の文字列はランダムに選択する必要があるという言葉で、最初の選択がランダムである必要はないことを暗示しています。
シャギー

1
@Shaggy-私は同意します、あなたは私がやることに盲目的に決して従うべきではありません!:)
チャスブラウン

3

J、60 53バイト

-7 FrownyFrogに感謝

(?@#{])@(#~*/@(2~:/\])"1)@(]i.@!@#@;A.;) ::0(#~>)/&.>

元の

(?@#{])@(#~2&([:*/~:/\)"1)@(A.~i.@!@#)@;@:(([#~>@])/&.>) ::0

食べない

(?@# { ])@(#~ 2&([: */ ~:/\)"1)@(A.~ i.@!@#)@;@:(([ #~ >@])/&.>) ::0

改善のための提案を歓迎します。

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



素晴らしいtyvm @FrownyFrog、私は後で投稿を更新します
ジョナ

おっと、[:*/2~:/\|:2つ短い
-FrownyFrog


2

チャコール、38バイト

WΦθ§κ¹«≔‽Φ∨Φι›⊗§κ¹ΣEι§μ¹ι¬⁼κυυ§υ⁰⊞υ⊖⊟υ

オンラインでお試しください!リンクは、コードの詳細バージョンです。説明:

WΦθ§κ¹«

ゼロ以外のカウントが少なくとも1つある間、繰り返します。

Φι›⊗§κ¹ΣEι§μ¹

残りの半分以上を占めるカウントを見つけます。

∨...ι

存在しなかった場合は、以前にフィルタリングされたゼロ以外のカウントを取得します。

Φ...¬⁼κυ

前回出力された文字列を除外します。

≔‽∨...υ

上記の2つのリストの最初の空でないものから最後の出力文字列にランダム要素を割り当てます。不可能な組み合わせを入力すると、この時点でプログラムがクラッシュすることに注意してください。

§υ⁰

文字列を印刷します。

⊞υ⊖⊟υ

そのカウントを減らします。


これにより["h4x0r", 1337]、文字列としてインクルードされている例のような無効な出力が生成されます。
ngm

@ngmコードを再配置しましたが、それを行うとクラッシュするようになりました...残念ながら、適切な検証にはより多くのバイトがかかります。
ニール

2

ルビー、85バイト

強引なアプローチ(アイデアについてはJonahに感謝します)。

->l{l.flat_map{|a,b|[a]*b}.permutation.select{|p|r=0;p.all?{|a|a!=r&&r=a}}.sample||0}

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

ルビー108100 96バイト

以前は、Bogosortアプローチ

->l{w=[];l.map{|a,b|w+=[a]*b;b}.max*2>w.size+1?0:(w.shuffle!until(r='';w.all?{|a|a!=r&&r=a});w)}

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



2

Rust 633バイト

これが他と少し違うのは、物理システムをシミュレートすることで文字列を再配置するというアイデアから始まったということです。各文字列は、最初に適切な回数だけ複製されます。次に、個々の文字列はスペース内のパーティクルとして扱われます。同じ文字列値を持つ2つのパーティクルは互いに「反発」しますが、異なる値を持つ2つのパーティクルは互いに引き合います。たとえば、AAAAAAABBBBCCで始まる場合、Asは相互に離れ、相互に離れて移動し、Bがそれらの間を移動できるようにします。時間が経つにつれて、これは粒子の素晴らしい混合物に達します。「粒子の動き」を繰り返すたびに、プログラムは同じ粒子が隣接していないことを確認し、システムの状態を停止して出力します。

さて、実際にその物理システムを実装することになると、古い形式のPCデモ/ゲームテクニックを使用して、各粒子の位置と速度を数値として保存し、位置と速度を更新するために反復を繰り返します。各反復で、位置に速度を追加し(移動)、速度に加速度を追加し(移動速度の変化)、加速度を計算します(粒子にかかる力を見つけます)。簡単にするために、システムは他のすべての粒子に基づいて各粒子の力を計算しません-すぐ隣接する粒子のみをチェックします。また、パーティクルが過度に加速せずに無限に飛ばないように「減衰」効果もありました(たとえば、速度は各ステップでxパーセント減少します)。

しかし、ゴルフのプロセスを通じて、このすべてが削減され、劇的に簡素化されました。今では、2つの似た粒子が互いに反発するのではなく、単に「テレポート」します。異なる粒子は、システム内の停滞を防ぐために、ほんの少し「スクート」します。たとえば、AがAの隣にある場合、テレポートします。AがBの隣にある場合、わずかにシフトします。次に、条件が満たされているか(隣接するパーティクルとは異なる)をチェックし、1次元空間での位置に基づいて文字列を順番に出力します。これは、シミュレーションというよりもソートアルゴリズムに似ています。この場合も、ソートアルゴリズムは「質量」に基づいてシミュレートされた「ドリフト」の一形態と見なすことができます。私は脱線します。

とにかく、これは私の最初のRustプログラムの1つであるため、数時間のゴルフの後はgaveめましたが、まだ機会があるかもしれません。解析ビットは私にとって難しいです。標準入力から入力文字列を読み取ります。必要に応じて、「let mut s = "[[A、3]、[B、2]]」に置き換えることもできますが、今は「[[A、3]、[B、2]] |コマンドラインで「cargo run」。

停止の計算には少し問題があります。システムの有効な状態に到達しないかどうかを検出する方法は?最初の計画は、「現在の」状態が古い状態を繰り返したかどうかを検出することでした。たとえば、ACCCがCACCに変更され、その後ACCCに戻ると、プログラムは擬似ランダムであるため終了しません。その場合、あきらめて0を出力します。しかし、これは膨大な量のRustコードのように見えたので、代わりに、反復回数が多い場合はおそらくスタックして定常状態に到達しないため、0を出力して停止することにしました。幾つ?平方される粒子の数。

コード:

extern crate regex;
struct P {s:String,x:i32,v:i32}
fn main() {
    let (mut i,mut j,mut p,mut s)=(0,0,Vec::new(),String::new());
    std::io::stdin().read_line(&mut s);
    for c in regex::Regex::new(r"([A-Z]+),(\d+)").unwrap().captures_iter(&s) {
        for _j in 0..c[2].parse().unwrap() {p.push(P{s:c[1].to_string(),x:i,v:0});i+=1;}
    }
    let l=p.len(); while i>1 {
        j+=1;i=1;p.sort_by_key(|k| k.x);
        for m in 0..l {
            let n=(m+1)%l;
            if p[m].s==p[n].s {p[m].v=p[m].x;if n!=0 {i=2}} else {p[m].v=1}
            p[m].x=(p[m].x+p[m].v)%l as i32;
        }
        if j>l*l{p.truncate(1);p[0].s="0".to_string();i=1}
    }
    for k in &p{print!("{}",k.s)};println!();
}

それはこの問題について興味深い考え方です、私はそれが好きです。実際にはどれくらいうまくいきますか?のように感じるl2制限が低すぎる可能性があり、有効な出力がないとアルゴリズムが判断する偽陰性が多すぎる可能性がありますが、TIOにはregex木枠がないため、その理論をテストできませんでした。
スンダ-復活モニカ

私はそれをファジングしませんでしたが、私はそれを与えた例を渡しました。TIOで動作するように変更しました。'lets = [( "A"、3)、( "B"、2)、( "ZZ"、4)];を変更する必要があります。line、bit.ly/2LubonO
明るい


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