大きな岩を小さな岩にする


22

グラインダーへようこそ。

あなたの仕事は、大きな岩を粉砕して小さな岩にすることです。

サイズの大きな岩の入力をn > 3 取得し、それを粉砕します。

すべての岩石のサイズがなるまで粉砕機にそれらを捨てて岩石を粉砕し続けます2

岩は常に均等な半分に粉砕されます。研削の結果が奇数の場合、結果を取得します-1。

進行中に各粉砕の出力を印刷します。

入力: 5

出力: 22

結果は、サイズ2の2つの岩です。

入力: 50

出力:

2424 //two rocks of size 24
12121212 //four rocks of size 12
66666666 //8 rocks of size 6
2222222222222222

結果はサイズ2の16の岩です

入力: 30

出力:

1414
6666
22222222

結果は、サイズ2の8つの岩です。

これはので、最短のコードが勝ちます!楽しさと幸運を!


あなたはそれが3の上方にあることを期待することができます
jacksonecac

あなたのフォーマット(すべての数字を連結したもの)を使用する必要がありますか、それともリストのようなものを使用できますか?代わりにいくつかの答えがそれを行うようです。
16

出力が各反復を表示する限り、形式は上記のようである必要はありません。
jacksonecac 16

1
2次元配列はそうで、1次元配列はそうではありませんが、それはあなた次第ですので大丈夫です。
ジョナサンアラン

1
@ user902383は、メタコンセンサスに従ってチャレンジで指定されていない限り、どちらでも構いません。入力と出力については、両方とも問題ありません- この投稿を参照してください。
ジョナサンアラン

回答:



8

COW、297 291バイト

MoOMoOMoOMoOMoOMoOMoOMoOMoOMoOmoOMoOmoOmoOoommOoMoOMOOmoOMMMmoOMMMmoOOOOMoOmOoMOOMOomoOmoO
MOOMOomOoMOomoOmoomOoMMMOOOMoOmoOMMMmOomOomoomoOmoOMOOMOomOomOomOoMOomoOmoOmoOmoomOomOomOo
mOomOoMMMmoOMMMMOOMOomoOOOMmOomOoMoOmoOmoomOomOoMoomoOmoOmoOMOOMOoMOomoOMoOmOomoomoOMMMOOO
mOoMMMMMMmOoMMMMOomoo

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

コードは各行をそれぞれの行に出力し、反復を追加の改行で区切ります。また、最初の反復を単独で出力し、その後に改行を出力します。したがって、5を入力すると5 2 2、スペースではなく改行を使用した場合を除き、出力は次のようになります。のサンプル出力を50以下に示します。

説明ツリー:

MoOMoOMoOMoOMoOMoOMoOMoOMoOMoOmoOMoOmoOmoOoom ;Store 10 in [0], 1 in [1], and integer input in [3]
mOoMoO                                        ;Store 1 in [2]
MOO                                           ;Loop while [2] is non-zero
   moOMMMmoOMMMmoOOOOMoOmOo                   ;   Copy [3] to [4], clear contents of [5], and store 1 in [5]
   MOO                                        ;   Loop while [4] is non-zero
      MOomoOmoO                               ;      Decrement 4 and move to 6
      MOO                                     ;      Loop while [6] is non-zero
         MOomOoMOomoO                         ;         Decrement [5] and [6]
      moo                                     ;      End loop once [6] is empty
      mOoMMMOOOMoOmoOMMMmOomOo                ;      Copy [5] to [6], and reset [5] to 1, then move back to [4]
   moo                                        ;   End loop now that [4] is empty.  [6] now contains the parity of [3]
   moOmoO                                     ;   Navigate to [6]
   MOO                                        ;   Loop while [6] is non-empty
      MOomOomOomOoMOomoOmoOmoO                ;      Decrememnt [3] and [6]
   moo                                        ;   End loop now that [6] is empty.  [3] now contains the largest even number less than the previous iteration.
   mOomOomOomOomOoMMMmoOMMM                   ;   Copy [1] to [2]
   MOO                                        ;   Loop while [2] is non-empty
      MOomoOOOMmOomOoMoOmoO                   ;      Decrement [2], increment [1], and print the number in [3].
   moo                                        ;   End loop now that [2] is empty
   mOomOoMoo                                  ;   Print a new line
   moOmoOmoO                                  ;   Navigate to [3]
   MOO                                        ;   Loop while [3] is non-empty
      MOoMOomoOMoOmOo                         ;      Decrement [3] twice and increment [4] once
   moo                                        ;   [4] now contains half of [3]
   moOMMMOOOmOoMMM                            ;   Copy [4] to [3] and clear [4]
   MMMmOoMMMMOo                               ;   Copy [3] to [2] and decrement once
moo                                           ;End loop now that [2] is empty

入力50のサンプル出力:

50

24
24

12
12
12
12

6
6
6
6
6
6
6
6

2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2

2
私は言葉を持っていない
jacksonecac

私はまだ言葉を持っていない
jacksonecac

言葉はありません
江枝Ed

私は2年半後のことを愛していますが、これは今でも人々を怖がらせています。
ガブリエルベナミー

7

05AB1E12 11バイト

¸[4÷·€D=¬<#

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

説明

¸             # wrap input in a list
 [            # start infinite loop
  4÷          # elementwise integer divison by 4
    ·         # elementwise multiplication by 2
     €D       # duplicate each element in the list
       =      # print it
        ¬     # get the first element of the list
         <    # decrease it by 1
          #   # if true: exit loop

6

パイソン2、55の、53バイト

n=input()
while n[0]>2:n=len(n)*2*[n[0]/4<<1];print n

4で除算し、1で左シフトして特別な除算を取得します


4

Haskell、75 71 60 50 47バイト

f 0=[]
f n|x<-f$2*div n 4=show n:zipWith(++)x x

オンラインでお試しください!編集:出力が入力を含むリストにできるようになったため、10 13バイトを保存できます。

使用法:

Prelude> f 50
["50","2424","12121212","66666666","2222222222222222"]

オリジナルの60バイトバージョン:

2%x=""
n%x|z<-2*div n 4=([1..x]>>show z)++"\n"++z%(x*2)
(%2)

オンラインでお試しください!短い式を指摘してくれたChristian Sieversに感謝します。

使用法:

Prelude> (%2)50
"2424\n12121212\n66666666\n2222222222222222\n"

あなただけができますz<-2*div n 4
クリスチャンシーバーズ

3

JavaScript(ES6)64 59 57バイト

f=s=>{for(n=1;s>2;)console.log(`${s=s/4<<1}`.repeat(n*=2))}

console.log(f.toString().length); 
f(5);
f(50);
f(30);                                  


コードをmothereff.in/byte-counterに入れると、59バイトになりますか?
Tschallacka

@Tschallacka私は思うf=が、ただのデモのためである
LarsW

あ、そう。それがクリアになり:-)それでもダメGET 2バイトmyne OFF次に
Tschallacka


3

Java、85バイト

n->{String s="";for(int q=2,i;n>2;q*=2,s+="\n")for(i=q,n=n/4*2;i-->0;)s+=n;return s;}

テストと未使用

import java.util.function.*;

class Ideone {
  public static void main(String[] args) throws java.lang.Exception {
    Function<Integer, String> f = number -> {
      String result = "";
      for (int quantity = 2, i; number > 2; quantity *= 2) {
        number = number / 4 * 2; // Make sure that the next is half or half - 1 if odd
        for (i = quantity; i > 0; i--) { // copy "quantity" times.
          result += number;
        }
        result += "\n"; // append new line
      }
      return result;
    };
    System.out.println(f.apply(50));
  }
}

注:理由はわかりませんが、Ideoneは内部エラーを出し続けているため、テストを行うのは問題です。テストするには、標準のJava IDEでコピーして貼り付けて実行するだけです。(そこで動作します、私はそれを確認しました;))


ideoneはコードで問題なく動作します。メンテナンス中に内部エラーが発生することがあります(私は思う)。私の古い答えを振り返ったとき、私はそれを前に持っていました。+1 btw、これ以上ゴルフできるものは見当たりません。ああ、私はあなたのn=n/4*2トリックが好きです。:)
ケビンクルーイッセン16

3

C#、88 86 83バイト

Skormのおかげで3バイト節約

変数宣言を含むループに変更することにより、別のバイトを保存しwhileましたfor

Yodleのおかげで1バイト節約

n=>{var r="";for(int i,c=2;n>2;c*=2,r+="\n")for(i=0,n=n/4*2;i++<c;)r+=n;return r;};

各粉砕の結果で構成される文字列を返す無名関数。

ungolfedメソッドとテストケースを含む完全なプログラム[最後の編集の前に!]:

using System;

public class Program
{
    public static void Main()
    {
        Func<int, string> f =
        n =>
        {
            var r = "";
            for (int i, c = 1; n > 2; )  // iterator and counter variable
            {
                    n = n/4 * 2;    // make sure the result if even
                    c *= 2;         // keep track of the number of rocks
                    for (i = 0; i++ < c; )  // store the current line made of [c] rocks of size [n]
                        r += n;
                    r += "\n";      // add a trailing newline to the string resulted from this step
            }
            return r;       // return the entire history
        };

        //test cases:
        Console.WriteLine(f(5));
        Console.WriteLine(f(50));
        Console.WriteLine(f(30));
    }
}

2
あなたが実行してループの中で1つのバイトを保存することができると思うfor(i=0;i++<c;)
Yodle

yoddleをするためには、あなたの第二を変更することにより、前述のようにして、1バイトの保存まだすることができfor (i = 0; i++ < c;)
MX D

投稿を更新するのを忘れました。今すぐ更新:)
adrianmp

1
カウンタを更新して、各反復で2から開始し、各反復で* = 2を使用して1バイトを保存し、新しい行を追加します。次に、n = n / 4 * 2を2番目のループに移動し、ブレースを削除してさらに2つ節約できます。 n=>{var r="";for(int i,c=2;n>2;c*=2,r+="\n")for(i=0,n=n/4*2;i++<c;)r+=n;return r;}
スコーム16

2

CJam、21バイト

l~]{{2/-2&_}%_n_2-}g;

オンラインでお試しください!(テストスイートとして。)

説明

l~]      e# Read input, evaluate and wrap it in a singleton list.
{        e# Do while...
  {      e#   Map this block over the list of rocks.
    2/   e#   Halve the rock.
    -2&  e#   Bitwise AND with -2, clearing the least-significant bit and
         e#   rounding down to an even integer.
    _    e#   Duplicate.
  }%
  _n     e# Print a copy of the current list of rocks.
  _2-    e# Continue if the current list of rocks contains values that aren't 2.
}g
;        e# Discard the final result to prevent printing it again.

2

Pyth、18 16 13バイト

WhQ=Q*2my/d4\n

* \nは改行です
説明:

W              # While
 hQ            # first element of Q - 0 is falsy
   =Q          # assign to Q
     *2        # the double of the (list) that is returned
       m       # form this \/ map
         /d4   # divide every element by 4
        y      # and double
            \n # print Q

ここで試してみてください


2

MATL、13バイト

`K/kEthttH>]x

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

`       % Do...while
  K/k   %   Divide by 4 and round down. Takes input implicitly in the first iteration
  E     %   Multiply by 2
  th    %   Attach a copy of itself (creates a longer array)
  t     %   Duplicate. This copy will be used for further grinding, keeping the original
  tH>   %   Duplicate. True if the values exceed 2. Used as loop condition
]       % End. The loop exits if the latest array contains 2
x       % Delete last copy. Implicitly display the entire stack

2

PHP、72 67 64バイト

for($n=$argv[$k=1];$n>2;)echo str_repeat($n=$n/2&~1,$k*=2),"\n";

コマンドラインから引数を取ります。で実行し-rます。


2

ゼリー13 12 11 バイト

:4Ḥx2µȦпṖY

TryItOnline!

注:OPは、入力が出力にもある可能性があると述べました。

どうやって?

:4Ḥx2µȦпṖY - Main link: rockSize
     µ      - monadic separation
       п   - loop collect intermediate results while
      Ȧ     - any
:4          -     integer division (vectorises) by 4
  Ḥ         -     double (vectorises)
   x2       -     repeat the elements 2 times
         Ṗ  - pop (remove the trailing list of zeros)
          Y - join with line feeds

12バイトの入力が表示されていないバージョン: :4Ḥḟ0x2µÐĿḊG


2

Perl、40 35 30 + 1 = 31バイト

-nフラグで実行

@Dadaのおかげで-4バイト

say$_ x($.*=2)while$_=$_>>1&~1

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

Perlは自動的に変数に入力を読み込む設定されています。 は、インタープリターによってプログラムの先頭に設定される特別な変数なので、倍増のベースとして使用できます。ループが繰り返されるたびに、ビットシフトダウンし、1のビットをキャンセルするために自身のマイナス1に対して論理ANDを実行します。$_-n$.1while$_


あなたはそれを31バイトまでゴルフすることができます:(perl -nE 'say$_ x($.*=2)while$_=$_>>1&~1'おそらくこれはさらにゴルフすることができます、私はそれに多くの時間を費やしていませんでした)
ダダ

2

PowerShell 3 +、58 54バイト

for($s=$input;$s;$s=($s-shr2)*2){"$s"*(2-shl($i++)-1)}

私を4バイト節約してくれたTimmyDに感謝します!

ややアンゴルフ(フォーマット)

for ( $s = $input ; $s ; $s = ( $s -shr 2 ) * 2 ) {
    "$s" * (2 -shl ($i++)-1)
}

説明

私は他の多くの答えと同じ4除算と2倍のトリックを使用していますが、問題に遭遇しました。PowerShellは、除算中に必要に応じて数値を浮動小数点に変換します。ゴルフの場合は、の$v/4*2ような気まずいものになるので面倒[int]($v/4)*2です。除算にビットシフトを使用してそれを回避しました-shr

何回繰り返しを印刷するかを計算するために、私はちょうど(2^$i)-1うまくいき、入力値を省くという追加の効果があります。0から開始するだけでは値を増やすのが難しく$i*=2、1から開始するには数値を正しくするには修正が多すぎるため、2だけを掛けようとすると問題が発生します。

PowerShellにはPowerShellの演算子がなく、回避したいので、[Math]::Pow()2のべき乗を再びビットシフトに頼りました。


@TimmyD whoopsはバージョンについて言及するのを忘れていました。ありがとう!
briantist

1

Python 2、47バイト

OPが入力を含む1D配列は大丈夫だと言ったので、残念ながら現在のPythonの勝者としか関係のないこの再帰関数を思いつきました。

f=lambda s,n=1:[s]*n+(f(s/4*2,n*2)if s>3else[])

f=lambda r,n=1:[r]*n+(r>3and f(r/4*2,n*2)or[]) 46
ジョナサンアラン

1

Perl、47バイト

$a=<>>>1;say 2*(($a>>=1)||die)x(1<<$_)for 1..$a

コマンドラインオプションはありませんが、今回は(通常はPerlの場合)。基本的な考え方は、任意のステップの岩はすべて同じサイズなので、リスト全体を記録するのではなく、サイズ(in $a)と数(in $_)を記録するだけです。+後にスペース(または)を取り除く方法が見つかりませんでしたsay。移動することはできますが、2*その後に開き括弧が続くと、正しく解析されません。

これは改善可能であるという気持ちを揺さぶるしかありませんが、どうすればよいかわかりません。


私はそれをたくさんゴルフしようとすると、毎回ガブリエル・ベナミーの答えになります。いくつかの手順を示しますが、die明らかに最適とは言えません。しかし、停止する必要があるかどうかを確認する方法が必要です->解決策は、for:ではなくwhileを使用することですwhile$a>1。しかし、次のものの置換を見つける必要があります$_:ユニタライズ変数はそれを行うことができます:replace 1<<$_by 1<<++$x。これ$_で自由に使用できる-nよう$aになった$_ので、すべてを使用し、a に置き換えることができ$_>>=1ます。最初の命令はになります。我々は持っているので-n$.我々は交換することができるように、設定されている1<<++$l$.*=2
ダダ

これらの変更をすべて実行すると、perl -nE '$_>>=1;say 2*($_>>=1)x($.*=2)while$_>1'39バイトが生成されます。その後$_>>=1、2回行われることに注意してください。1つ(最初の1つ)を削除しようとすることができます。それを取り除くことを試みて、私は得たsay$_ x($.*=2)while($_>>=1)/2>1(それらの両方をwhile条件の中に置く)。しかし、結果は間違っています($_奇妙な場合があります)。それが偶数であることを確認しようとすると、になりwhile$_=$_>>1&~1ます。だから、コードは今say$_ x($.*=2)while($_=$_>>1&~1)です。
ダダ

すでにPerlの答えがあることを逃しました。これを下にゴルフすることでそれが複製に変わる場合、それを編集する意味はあまりないと思います。一方、実際には間違っていないので、削除してもあまり意味がありません。おそらく、劣ったPerlゴルフ力の証として残しておくのがベストでしょう。

私は同意します、それは他のPerlソリューションとは十分に異なるものであり、以前のコメントで、ゴルフをする唯一の方法がそれを他のソリューションに変えることを示しようとしました。そのままにしておくことは、適切なソリューションのように感じます。
ダダ

1

Vim 61 54バイト

qqYpPJ0yw:s;\d*;="/2
;g
:let @t=(">7)+1
@tkjjG@qq@q

TryItOnline!

印刷できないもの:

qqYpPJ0yw:s;\d*;^R=^R"/2
;g
:let @t=(^R">7)+1
@tkjjG@qq@q

幸い、vimはx / 2で自動的に切り捨てられます。


1

JavaScript、71 63 59 58バイト

さて、私はこのjavascriptソリューションを思いつきました。ゴルフはまったく新しいですが、これは楽しいチャレンジです

forループを使用したTitusの提案のおかげで、4バイト節約されました。

基盤なし:

for(o = i = 30; i > 1; i= i/4<<1) {
   console.log(`${i}`.repeat(o / i));
}

ゴルフバージョン

for(o=i=30;i>1;i=i/4<<1){console.log(`${i}`.repeat(o/i));}

私はそれを改善する/ゴルフを学ぶ方法を提案します

入力テスター


1
forループで2バイトを保存できますfor(o=i=30;i>2;console.log(...)){...}。そして、2つの研削部品を1つに組み合わせることで、ブレースを削除できますi=i/4<<1;(-5)。i=i/4*2;同じことをするかどうかわからない。
タイタス

1
あなたはそれをテストしていないに違いない。
タイタス

まだ、私の子供をキャッチするために、PCから実行しなければならなかった
Tschallacka


1

Swift、84バイト

func g(n:Int){var n=n,i=2;while n>2{n=n/4*2;print(Array(repeating:n,count:i));i*=2}}

非ゴルフ

func grind(rockSize: Int) {
    var rockSize = rockSize
    var rockCount = 1

    while rockSize > 2 {
        rockSize = rockSize / 4 * 2
        rockCount *= 2

        let output = Array(repeating: rockSize, count: rockCount)
        print(output)
    }
}

1

Befunge、45バイト

&1vg0_\:.\v
:\<  ^!:-1<p00:*2\.:*2/4,+55_@#`2

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

説明

&           read the rock size
1           initialise the count
<           start of main loop going right to left

  \         swap the size to the top of the stack
  :2`#@_    if size is not > 2 then exit
  55+,      output a line break
  4/2*      size = size/4*2, i.e. split into even halves
  :.        output the size
  \         swap the count to the top of the stack
  2*        count = count*2
  :00p      save count for later

  <         start of inner loop
    1-      decrement the count
    :!^_    break out of the loop if the count is zero
    \       swap the size to the top of the stack
    :.      output the size
    \       swap the count to the top of the stack
    v       back to the start of the inner loop    

  0g        restore the saved count
  v         back to the start of the main loop

1

Javascript、106バイト

最初のコードゴルフ、私はやってみると思いました。(あまり良くありません)。

for(;i[i.length-1]>3;){for(var x=0;x<i.length;x++)i[x]/=2,i[x]%2===1&&i[x]--;i=i.concat(i),console.log(i)}

未縮小:

while (input[input.length - 1] > 3) {
    for (var x = 0; x < input.length; x++) {
        input[x] /= 2;
        if (input[x] % 2 === 1) input[x]--;
    }
    input = input.concat(input);
    console.log(input);
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.