浮遊大群


28

前書き

雨はやっとおさまった。@ user12345のコードのバグにより、ほとんどの人類がdr死しました。生存者は世界中の群島に散らばっています。無線通信がアップし、人類は再び繁栄する態勢を整えています。理由はまったくありませんが、ゾンビ海賊がプライム子午線に集まり、西に向かって掃引しています。大群はすべてをむさぼり食う。

問題

私たちの終末シナリオは、協力する島のコミュニティのセットを表す1行に5つの整数で記述できます。それらは、西(左端の整数)から東(右端の整数)の順に並べられます。

最東の島から始まり、島民はペアで次の最も近い島に逃げます。奇妙なことに、乗船するペアごとに、そのうち1つだけが旅行を生き延びます。島民はペア旅行するだけです。奇数の人口は、ゾンビの海賊の大群のふざけた行動に関する最新のラジオの更新を提供するために、唯一の住民を選出します。東のすべての島が移住を完了するか、死ぬまで、住民は旅行を拒否します。人口が最終的な最西端の島に到達すると、旅行は中止されます。

世界の終わりの運用管理者には、各村の最終的な人口を出力できるプログラムが必要です。

入力例

3 8 6 0 2

出力例

8 1 0 1 0

仮定

  • 入力は、stdinを介して提供されるか、任意の名前のファイルから読み取られるか、引数として受け入れられます。
  • 島ごとに、0 <=母集団<= 1024
  • 人口は島を決して飛ばさない

最短回答が勝ちます!


引数とは、関数の引数としての意味ですか、それともプログラムのコマンドライン引数としての意味ですか?
アレクシトルハモ14年

@AleksiTorhamoコマンドライン引数。したがって、合計にはカウントされません。
レインボルト14年

29
私が愛するこのマルチ質問にまたがる最後の審判の日の話を。
ミハイルカジ14年

re:「人口が島をスキップすることはありません」-あなたの例は、人口が連続して複数の島を移動することを示しています。私が見逃している別の意味はありますか?
アレングールド14年

1
@AllenGould集団は確かに複数の島を移動しましたが、1つの島をスキップすることはありませんでした。右端の島に32人がいた場合、16、8、4のように死に、最後に2人が左端の島に到着します。
レインボルト14年

回答:


26

APL、16文字

{(1e9,4⍴2)⊤2⊥⍎⍵}

入力は、このブロックへの文字列として提供されます。

{(1e9,4⍴2)⊤2⊥⍵} "3 8 6 0 2"
8 1 0 1 0

または、入力がこのブロックへの引数として提供される場合は1文字少なくなります。

{(1e9,4⍴2)⊤2⊥⍵} 3 8 6 0 2
8 1 0 1 0

これはこのコメントのイルマリカロネンの考えに基づいています。

  • 2⊥⍵ 入力のベース2変換を行います。
  • (1e9,4⍴2)⊤したがって、この数値は、基数2(最後の4桁)および基数1e9に変換されます。これは、上記の入力範囲に十分です。(1e9,4⍴2リストを作成します1e9 2 2 2 2。)

西への逃亡は、このプロセス中にベース変換によって自動的に行われることに注意してください。


これは天才です。
ガレス14年

7
APL違法でなければなりません...
Kiwy

1
@Kiwyあなたのコメントがわかりません。なぜAPLは違法であると宣言されるべきですか?APLソリューションも送信してください。
ハワード14年

4
@Kiwy:これは単にAPLを使用するだけではありません...それはソリューションに対する非常に賢いアプローチでもあり、たまたまAPLプログラムに非常にうまく適合します。これがゴルフのすべてです!
Claudiu 14年

13

GolfScript、23 22文字

~]{{.2/@+\2%}*]}4*' '*

反復アプローチ。配列は数回反復され、そのたびに多くのペアが右から左に転送されます。オンラインの例を試してください。

コードの簡単な説明:

~]       # convert input to an integer
{        # loop 4 times (enough for a 5-elements input)
  {      # inject this block into the array
    .    # duplicate (l r r)
    2/   # determine surviving people (l r r%2)
    @+\  # add to the left (l+r/2 r)
    2%   # determine remaining people (l+r/2 r%2)
  }*
  ]      # make array again of the results
}4*
' '*     # format output

1
+1、これは私が見つけることができるものよりも短い。さて、それはそれだけで厄介なのルール「西端の島の停止」でなかった場合は、~]{2base}2*' '*トリックを行うだろう...
イルマリKaronen

@IlmariKaronen適切な言語を選択すると(APLソリューションを参照)、厄介なルールがうまくなります。
ハワード14年

8

GolfScript(25文字)

~]-1%{\.1&\2/@+}*]-1%' '*

オンラインデモ

非常に簡単な解決策:各島の出力値を入力値の関数として定義するより興味深いアプローチがありますが、質問で説明されている再分配アルゴリズムに実際に従う限り、ゴルフができるとは思いません。


7

Javascript / ES6(69)

ビット演算子で遊ぶ:

  • x&=1 最下位ビットを保持します(奇数の場合は1、偶数の場合は0)
  • x>>1 整数は2で除算されます
f=a=>{a=a.split(' ');for(i=5;--i;a[i]&=1)a[i-1]-=-(a[i]>>1);return a}

ES6なしのバージョン:

function f(a){a=a.split(' ');for(i=5;--i;a[i]&=1)a[i-1]-=-(a[i]>>1);return a}

例:
f("3 8 6 0 2")戻り[8, 1, 0, 1, 0]
f("0 997 998 999 1000")[935, 0, 1, 1, 0]


1
Pythonの回答の1つに関するRusherのコメントを参照してください。入力は、リストではなく、例で指定された形式に従う文字列でなければなりません。
アレクシトルハモ14年

@AleksiTorhamoが正しい。コンマ区切りのリストを許可すると、コードは、例で提供されている形式に従ったコードよりも明らかに有利になります。将来的には、私は一例で提供フォーマットであることをより明確にしようとするでしょう形式。ごめんなさい
レインボルト14年

OK 出力も結合する必要がありますか、配列形式は大丈夫ですか?
マイケルM. 14年

私は多かれ少なかれ同じことを思いついた:f=a=>{a=a.split(' ');for(x=5;--x;a[x]&=1)a[x-1]-=-a[x]/2|0;return a}68文字です。
MT0 14年

6

Python-96文字

初めてのゴルフ!stdinからの入力。

n=map(int,raw_input().split())
x=4
while x:n[x-1]+=n[x]/2;n[x]%=2;x-=1
print' '.join(map(str,n))

1
改行とインデントの代わりにセミコロンを使用してwhileを1行に圧縮し、印刷後にスペースを直接削除すると、100まで下げることができます:)
Aleksi Torhamo 14年

@AleksiTorhamoありがとう。また、使用したPython
のどの

1
ああ、本当!また' '、分割からを省略して96に下げ、他のpython2ソリューションを破ることもできることに気付きました。
アレクシトルハモ14年

5

J(26文字)

Jでの私のソリューションは次のとおりです。 ((<.@-:@}.,0:)+{.,2|}.)^:_

   islands1 =: 3 8 6 0 2
   islands2 =: 3 8 6 3 2
   ((<.@-:@}.,0:)+{.,2|}.)^:_ islands1
8 1 0 1 0
   ((<.@-:@}.,0:)+{.,2|}.)^:_ islands2
9 0 0 0 0

この一般的なソリューションは、任意の数の島で機能するはずです。


5

ルビー、 97 90 74 72

オンライン版

アレイをもう反転させずに、もう少しゴルフをしました...

f=->i{i=i.split.map(&:to_i);(1..4).each{|n|i[-n-1]+=i[-n]/2;i[-n]%=2};i}

分割する前ではなく、文字列を逆にしてはいけません。そうしないと、入力の複数桁の数字に対して間違った結果が得られる可能性があります。
ハワード14年

私も両方の「可能性」を考慮しました-1桁以上の数字に気付いていませんが...:Dありがとう!
デビッドハーマン14年

4

C-121文字

入力は標準入力から取得されます。

a[5];main(i){b(i=0,0);while(i++<5)printf("%i ",a[i-1]);}b(i,j){scanf("%i",&i);return j<5?i+=
b(i,j+1)/2,a[j]=j?i&1:i,i:0;}

これは5つの島だけにハードコードされていますか?
ジオビット14年

4

Python2-98文字

stdinからの入力。

s=[0]
for v in raw_input().split()[::-1]:s=[int(v)+s[0]/2,s[0]%2]+s[1:4]
print' '.join(map(str,s))

Python3-79文字

stdinからの入力。

s=[0]
for v in input().split()[::-1]:s=[int(v)+s[0]//2,s[0]%2]+s[1:4]
print(*s)

4

Python 2、85 80バイト

b=1
for x in raw_input().split():b=2*b+int(x)
print b/16-2,' '.join(bin(b)[-4:])

任意の島で始まるX人は、右に1つの島を始めるX * 2人に相当します。このコードは、開始構成の全員を極右島の同等の人に変換し、結果のバイナリ表現を使用して、各島に何人の人がいるかを判断します。

編集:b0ではなく1に初期化することでコードを短縮しbin、フォーマット文字列の代わりに使用できるようにしました。


バイナリ表現の使用は天才です!Lettercount.comはあなたに85を与えました。あなたは過大評価しましたか、それとも使用するのに悪いツールですか?
レインボルト14年

@Rusher:私のツールはCRLF行末を使用していました。Unixの行末でそれを数える、それは85だ
user2357112サポートモニカ

3

パイソン(101)

l=map(int,raw_input().split())
for i in range(4):l[3-i]+=l[4-i]/2;l[4-i]%=2
print' '.join(map(str,l))

リストを後ろから前にループし、仕様に従って母集団を移動し、リストを印刷します。簡単なテストを次に示します。

>>> l=map(int,raw_input().split())
3 8 6 0 2
>>> for i in range(4):l[3-i]+=l[4-i]/2;l[4-i]%=2
... 
>>> print' '.join(map(str,l))
8 1 0 1 0

例で提供されている形式に従う入力を提供するとクラッシュしました。
レインボルト14年

@Rusher質問で使用された正確な形式で動作するように回答を更新しました。
アルシャジー14年

Pythonコーダーに特別な例外が許可されている場合、他の人は不利になる可能性があります。申し訳ありませんが、回答を更新していただきありがとうございます。将来、入力例が必要な形式であることをより明確にしようとします。
レインボルト14年

2

Mathematica 105

これは、任意の数の島で機能するはずです。

f[w_,n_:1]:=
If[n==Length@w,w,
f[w~ReplacePart~{-n-> Mod[z=w[[-n]],2],-(n+1)->(w[[-(n+1)]]+ z~Quotient~2)},n+1]]

5つの島

f[{3, 8, 6, 0, 2}]

{8、1、0、1、0}


25の島

f[{145, 144, 144, 59, 35, 129, 109, 99, 200, 24, 219, 96, 12, 121, 75,20, 153, 124, 131, 178, 228, 120, 63, 207, 228}]

{270、0、0、1、0、1、1、1、1、1、0、1、1、1、1、1、1、1、0、1、1、1、1、1、1、1、0 }


私のソリューションは270, 1, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0、長いテストデータを生成します。私が正しいことを確認したと思います。
OldCurmudgeon

奇妙なことに、その仕組みを考えると 明日、ケースを見てみましょう。
DavidC 14年

2

Java- 647 533しかし、Java 8ストリームのブラウニーポイントを期待しています。

class I{int p;I e;I(int p,I e){this.p=p;this.e=e;}void x(){if(e!=null){int r=p&1;e.p+=(p-r)/2;p=r;}}public String toString(){return ""+p;}}Deque<I>B(String d){H<I>e=new H<>();return Arrays.stream(d.split(" ")).map(s->Integer.valueOf(s)).map(p->e.hold(new I(p,e.held()))).collect(Collectors.toCollection(LinkedList::new));}void x(Deque<I>is){is.descendingIterator().forEachRemaining((I i)->{i.x();});}void t(String s){Deque<I> a=B(s);x(a);System.out.println(a);}class H<T>{T h=null;H(){}T hold(T t){return (h=t);}T held(){return h;}}

非圧縮形式:

private static class Island {
  int population;
  final Island eastwardIsland;

  Island(int population, Island eastwardIsland) {
    this.population = population;
    this.eastwardIsland = eastwardIsland;
  }

  private void exodus() {
    if (eastwardIsland != null) {
      // How many remain.
      int remain = population & 1;
      // How many leave.
      int leave = population - remain;
      // Account for 50% death rate.
      int arrive = leave / 2;
      // Modify the eastward island population.
      eastwardIsland.population += arrive;
      // Change my population.
      population = remain;
    }
  }

  @Override
  public String toString() {
    return String.valueOf(population);
  }

}

private Deque<Island> buildIslands(String data) {
  // Holds the island to the east as we traverse.
  final Holder<Island> eastward = new Holder<>();
  // Build my list of islands - assumes order is retained.
  return Arrays.stream(data.split(" "))
          // Convert to int.
          .map(s -> Integer.valueOf(s))
          // Build the island in a chain.
          .map(p -> eastward.hold(new Island(p, eastward.held())))
          // Roll them into a linked list.
          .collect(Collectors.toCollection(LinkedList::new));
}

private void exodus(Deque<Island> islands) {
  // Walk backwards.
  islands.descendingIterator()
          // Perform all exodus.
          .forEachRemaining((Island i) -> {
            i.exodus();
          });
}

private void test(String data) {
  Deque<Island> archipelago = buildIslands(data);
  // Initiate the exodus.
  exodus(archipelago);
  // Print them.
  System.out.println(archipelago);
}

の助けを借りて:

// Mutable final.
private static class Holder<T> {
  private T held = null;

  public Holder() {
  }

  public Holder(T it) {
    held = it;
  }

  public T hold(T it) {
    return (held = it);
  }

  public T held() {
    return held;
  }

  @Override
  public String toString() {
    return held == null ? "null" : held.toString();
  }

}

@DavidCarraherのテストについて少し懸念しています。

145 144 144 59 35 129 109 99 200 24 219 96 12 121 7520 153 124 131 178 228 120 63 207 228

生成する

270, 1, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0

2

Java- 196 195

200未満にできない場合は投稿しないと自分に言い聞かせました。正直なところ、私は他の何かを取り除くことができるとは思いません。Javaにはかなりスリムです。

class H{public static void main(String[]a){int l=a.length,p[]=new int[l],i=l;for(;i-->0;){p[i]=Integer.valueOf(a[i]);if(l-i>1){p[i]+=p[i+1]/2;p[i+1]%=2;}}for(;++i<l;System.out.print(p[i]+" "));}}

改行:

class H{
    public static void main(String[]a){
        int l=a.length,p[]=new int[l],i=l;
        for(;i-->0;){
            p[i]=Integer.valueOf(a[i]);
            if(l-i>1){
                p[i]+=p[i+1]/2;
                p[i+1]%=2;
            }
        }
        for(;++i<l;System.out.print(p[i]+" "));
    }
}

サンプル入力出力:

$ java H 3 8 6 0 2
8 1 0 1 0

$ java H 0 1 2 3 4 5 6 7 8 9 10
1 1 1 1 1 1 1 0 1 0 0

$java H 235 897 158 693
809 1 0 1

2

Java-179文字

圧縮された:

class F{public static void main(String[] a){int l=0,x,s,i=a.length-1;String z="";for(;0<=i;i--){x=Integer.valueOf(a[i])+l;s=i>0?x%2:x;l=(x-x%2)/2;z=s+" "+z;}System.out.print(z);}}

通常:

public class FloatingHorde {

    public static void main(String[] a) {
        int leave = 0;
        String outputStr = "";
        for (int i = a.length - 1; 0 <= i ; i--) {
            int x = Integer.valueOf(a[i]) + leave;
            int stays = i > 0 ? x % 2 : x;
            leave = (x - x % 2) / 2;
            outputStr = stays + " " + outputStr;
        }
        System.out.print(outputStr);
    }
}

サンプル出力:

$ java F 3 8 6 0 2
8 1 0 1 0

$ java F 7 6 5 4 3
11 1 1 1 1

0

Emacs Lisp 144文字

小さくはないが、うまくいく

(lambda (d)
   (setq x d)(while(cdr x)
           (setcar(cdr x)(+(/(-(car x)(%(car x)2))2)(cadr x)))
           (setcar x (-(car x)(*(/(car x)2)2)))
       (pop x))
   (reverse d))

あなたは#Javaのようなヘッダを追加することができます- 123個の文字を
Rainbolt


-2

Java-116文字

たとえばint[] i = {2, 33, 16, 5};(各数値は異なる可能性があるため、これらはカウントに追加されないと思います)出力します23 0 0 1

for(int j = i.length-1; j > 0; j--) {       
    while(i[j] > 1) {
        i[j] -= 2;
        i[j-1]++;
    }       
}
for(int j = 0; j < i.length; j++) {     
    System.out.print(i[j] + " ");
}

4
このコードを実行するコンパイラを提供できますか?また、入力の形式と可能なソースは質問で提供されました。入力をJava配列に成形すると、他の配列よりも不公平な利点が得られます。
レインボルト14年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.