安野ゲームのすべての可能なタイトルを一覧表示する


37

では安野ビデオゲームシリーズ彼らのタイトルが常に特定のパターンで今年特色早い2019年のために発表された第七1と6つのゲームがあります。

Anno 1602, Anno 1503, Anno 1701, Anno 1404, Anno 2070, Anno 2205, Anno 1800

  • デジタル合計は常に9です。
  • 年は4桁の長さです。
  • 少なくとも1つのゼロが含まれています。

これらの制約内には、109の可能なタイトルが存在します。

[1008,1017,1026,1035,1044,1053,1062,1071,1080,1107,1170,1206,1260,1305,1350,1404,1440,1503,1530,1602,1620,1701,1710,1800,2007,2016,2025,2034,2043,2052,2061,2070,2106,2160,2205,2250,2304,2340,2403,2430,2502,2520,2601,2610,2700,3006,3015,3024,3033,3042,3051,3060,3105,3150,3204,3240,3303,3330,3402,3420,3501,3510,3600,4005,4014,4023,4032,4041,4050,4104,4140,4203,4230,4302,4320,4401,4410,4500,5004,5013,5022,5031,5040,5103,5130,5202,5220,5301,5310,5400,6003,6012,6021,6030,6102,6120,6201,6210,6300,7002,7011,7020,7101,7110,7200,8001,8010,8100,9000]

あなたの目的は、それらをすべて最小のバイト数で適切な形式でリストすることです。


出力形式の柔軟性は?で、これは許容できますか?
ルイスメンドー

1
@LuisMendoはい、大丈夫です。
ライコニ

されている数字のリストが許可されていますか?
エリックアウトゴルファー

1
@aslum 1つだけでなく、多くのスペースを意味すると思いますか?コメントのマークダウンでは、それをうまく表現できません。上記のLuisの形式が許可されていることを考えると、それは許可されていると仮定します。;-)
エリック・ザ・アウトゴルファー

1
@EriktheOutgolfer数字のリストはもう何年も見えないので、数字のリストにはノーと言います。
ライコニ

回答:


20

R59 51バイト

201のリストの名前として有効な数値を出力します。なぜ201?ASCII 0は48で、4 * 48 + 9は...ええ。にエイリアス^Map使用し1:9e3て6バイトを保存し、範囲として使用して別の2 バイトを保存しました。

"^"=Map;x=sum^utf8ToInt^grep(0,1:9e3,,,T);x[x==201]

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

説明

# Create list of sums of ASCII char values of numbers,
# with the original numbers as the names of the list
x <- Map(sum,
  # Create a list from the strings where each element is the string split 
  # into ASCII char values
  Map(utf8ToInt,
      # Find all numbers between 1 and 9e3 that contain a zero
      # Return the matched values as a vector of strings (6th T arg)
      grep(pattern=0,x=1:9000,value=TRUE)
  )
)
# Pick out elements with value 201 (i.e. 4-digits that sum to 9)
# This implicitly only picks out elements with 4 digits, since 3-digit 
# sums to 9 won't have this ASCII sum, letting us use the 1:9e3 range
x[x==201] 

3
ああ、grepなぜ私はそれがにキャストすることを覚えたことがないんcharacter...
ジュゼッペ



9

ゼリー、11バイト

9ȷṢ€æ.ẹ9ṫ19

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

使い方

9ȷṢ€æ.ẹ9ṫ19  Main link. No arguments.

9ȷ           Set the left argument and the return value to 9000.
  Ṣ€         Sort the digits of each integer in [1, ..., 9000].
    æ.       Perform the dot product of each digit list and the left argument,
             which gets promoted from 9000 to [9000].
             Overflowing digits get summed without multiplying, so we essentially
             map the digit list [a, b, c, d] to (9000a + b + c + d).
      ẹ9     Find all 1-based indices of 9.
             Note that 9000a + b + c + d == 9 iff a == 0 and b + c + d == 9.
        ṫ19  Tail 19; discard the first 18 indices.

7

PowerShell50 49バイト

999..1e4-match0|?{([char[]]"$_"-join'+'|iex)-eq9}

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

から999までの範囲を構築し、正規表現が一致するエントリを引き出すフィルタとして10000インライン-matchを使用し0ます。これにより、現在の数値を文字列として受け取り、-array としてキャストし、それらの文字をnvoke-pression (evalに類似)して節の合計を算出1000, 1001, 1002, etc.するWhere-Object句にパイプします。これがに該当するかどうかを確認し、該当する場合はパイプラインに渡されます。プログラムの完了時に、これらの数値はパイプラインから取得され、暗黙的に出力されます。"$_"char-join+IEx-eq9


5

JavaScript(ES6)、78 73バイト

@KevinCruijssenのおかげで2バイト節約

スペースで区切られた文字列を返します。

f=(n=9e3)=>n>999?f(n-9)+(eval([...n+''].join`+`)&/0/.test(n)?n+' ':''):''

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

どうやって?

0を持たない数字を無視して、9の増分で範囲[1008..9000]を反復処理します。90

これらの数値はすべて9倍数であるため、数字の合計も9倍数になることが保証されています。

有効な数字には少なくとも1つの0があるため、2を超える9はありません。これは、残りの数字の合計が最大18であることを意味します。したがって、数字の合計が奇数かどうかをテストするだけで十分です。

したがって、テスト:

(eval([...n + ''].join`+`) & /0/.test(n)

とにかく0が含まれていないため、1008toを変更してバイトを保存できます。999999+9 = 1008
ケビンクルーイッセン

またはそれを変更しても、2バイトf=(n=9e3)=>n<1e3?'':(eval([...n+''].join`+`)<10&/0/.test(n)?[n,,]:'')+f(n-9)(そう、けれども末尾にカンマが含まれていないf=(n=9e3)=>n<1e3?'':(eval([...n+''].join`+`)<10&/0/.test(n)?n+' ':'')+f(n-9)末尾のスペースを含む、区切りスペースではきれいに見えるかもしれません)
ケビンCruijssen

@KevinCruijssenありがとう!私は実際にしばらくこれを更新しようとしていますが、今夜は500B / sのインターネット帯域幅があります。:/
アーナウルド

最近、自宅のインターネットはなんらかの理由でがらくたになっています。10MBを超えるものはダウンロードできず、10枚以上の画像を含むビデオやページを完全にロードする前に数回更新する必要がある場合があります。 。私は月曜日/火曜日に自宅から働いていたときに..>>明日の誰かがそれを修正しています(そしてそれはxDで固定されるまで、私は彼を残していないよ)
ケビンCruijssen

5

JavaScript(Node.js)、89バイト

[...Array(9e3)].map(_=>i++,i=1e3).filter(a=>(s=[...a+""]).sort()[0]<1&eval(s.join`+`)==9)

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

  • @ETHproductionsのおかげで-4バイト

JavaScript(Node.js)、129 127 126 124 115 114 111 110 105 97 93 92 90バイト

[...Array(9e3)].map(f=(_,i)=>eval(s=[...(i+=1e3)+""].sort().join`+`)-9|s[0]?0:i).filter(f)

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

説明

[...Array(9e3)].map(f=(_,i)=>eval(s=[...(i+=1e3)+""].sort().join`+`)-9|s[0]?0:i).filter(f)
[...Array(9e3)].map(f=(_,i)=>                                                  )           // Create a 9000-length array and loop over it; store the loop body
                                    [...(i+=1e3)+""]                                       // Add 1000 to the index and split it into an array of characters (17 -> ["1", "0", "1", "7"])
                                                    .sort()                                // Sort the array of characters in ascending order by their code points ("0" will always be first) (["1", "0", "1", "7"] -> ["0", "1", "1", "7"])
                                  s=                       .join`+`                        // Join them together with "+" as the separator (["0", "1", "1", "7"] -> "0+0+2+9"); store the result
                             eval(                                 )-9                     // Evaluate and test if it's different than 9
                                                                       s[0]                // Take the first character of the string and implicitly test if it's different than "0"
                                                                      |    ?0              // If either of those tests succeeded, then the number doesn't meet challenge criteria - return a falsey value
                                                                             :i            // Otherwise, return the index
                                                                                .filter(f) // Filter out falsey values by reusing the loop body

JavaScriptで初めてコードゴルフを行う。言う必要はないと思いますが、何か間違ったことをしている場合は、下のコメント欄で私に知らせてください。

  • @Luis felipe De jesus Munozのおかげで-3バイト

  • @Kevin Cruijssenのおかげで-6バイト


1
[...Array(9e3)]代わりにArray(9e3).fill()2バイトを保存します
ルイスフェリペデジェススムニョス

1
.map(a=>+a)代わりに.map(Number)別のバイトを保存します
ルイスフェリペデジェススムニョス

1
でスペースを削除して(_, i)1バイトを保存し、さらに4バイトを保存するs[0]+s[1]+s[2]+s[3]ことができeval(s.join`+`)ます。
ケビンクルーイッセン

1
また、私はあなたの答えにある||と確信|しています。
ケビンクルーイッセン

1
.map()範囲の生成のみに使用し、フィルタリングを個別に維持する場合、8バイトを節約できます。オンラインで試してください!
ETHproductions

5

Python 2、57バイト

n=999
exec"n+=9\nif'0'in`n`>int(`n`,11)%10>8:print n\n"*n

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

デニスのおかげで2バイト

execループを使用して、n9のステップで1008、1017、...、9981、9990としてカウントアップし、条件を満たすものを出力します。

9の倍数だけが数字の合計9を持つことができますが、この範囲の9の倍数も18と27の数字の合計を持つことができますint(`n`,11)%10>8。これらを条件で除外します。n基数11で解釈すると、その桁合計は10を法とする数に等しく、基数10で数字が9を法とする数合計に等しい。(9、18、27)の桁和は(9、8、7) 10を法とするため、これらの>8作業を行って9を除外します。

ゼロを含む数値は、文字列メンバーシップでチェックされます。'0'in`n`。この条件は、Python 2が文字列を数値よりも大きいものとして扱うことを使用して、連鎖不等式で他の条件と結合されます。


私は、ゴルフをしているPythonが非常に長い自動生成された実行可能ファイルをしばしば持っているように見えるのが好きです
...-J.Doe

4

sedおよびgrep(およびseq)、72 64 63バイト

seq 9e3|sed s/\\B/+/g|bc|grep -wn 9|sed s/:9//|grep 0|grep ....

これらのいくつかは、4桁の長さではありません(しかし、私は確信してどのような最終的じゃないgrep、ので、多分私はそれが間違って実行しているのですか?)
Sparhawk

@Sparhawk:番号は4桁の数字であることを最後のgrep性を保証
トール

@Thor Ah right。何らかの理由で、私はそれを省略記号として解析しました。
スパロウク

4

Haskell、55バイト

[i|i<-show<$>[1..5^6],201==sum(fromEnum<$>i),elem '0'i]

@Laikoniのおかげで、コメントをご覧ください。

読みやすい:

import Data.Char (digitToInt)

[i | i <- show <$> [1000..9999]
   , sum (digitToInt <$> i) == 9
   , '0' `elem` i
   ]

2
特にPPCGとHaskellゴルフへようこそ!(-48+)合計をの201代わりに削除して比較することで、数バイトを節約できます9。ちなみに、これにより、範囲の1代わりに使用することもできます1000
ライコニ

また、メタに関するこのコンセンサスmain=printに従って、以前のバージョンは問題ありませんでした。
ライコニ

99995^6代わりにできます。
ライコニ

1
ハ、もう1バイト削る必要があります!ありがとう:
mb21

3

R、82バイト

write((x=t(expand.grid(1:9,0:9,0:9,0:9)))[,colSums(x)==9&!apply(x,2,all)],1,4,,"")

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

x先行ゼロを除き、列を下るすべての可能な4桁の数値のマトリックスを生成します。次に、9のゼロ(ゼロでallはない)の列(デジタル)合計をフィルターします。write列の下、私たちは印刷物writestdoutの幅4との区切り""

J.ドゥーによるアウトゴルフ


いい答えだ!別のルートを思いついた
...-J.Doe

3

Japt20 18バイト。

@Shaggyおよび@ETHproductionsのおかげで-2バイト

A³òL² f_=ì)x ¥9«Z×

A³òL² f_=ì)x ¥9«Z×  Full program
A³òL²               Range [1000, 10000]
      f_            Filter by : 
        =ì)         Convert to array 
           x ¥9     Sum equal to 9?
               «    And 
                Z×  Product not 0

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


これは実際には28バイトです。代わりにリテラル整数を使用すると22バイトですがA³ò9000 f_ìx ¥9©ZsøT、20に戻ります
シャギー

1
andのì代わりに1バイトを保存できます。これは、フィルターで行う必要があります。その後、Zの積がゼロであるかどうかをチェックすることにより、別のものを保存することができます:オンラインそれをお試しください!s¬f_=ì)x ¥9...«Z×
ETHproductions

3

Java 8、128 117 115バイト

v->{int i=109,r[]=new int[i],n=i;for(;i>0;n++)if((n+"").chars().sum()==201&(n+"").contains("0"))r[--i]=n;return r;}

@nwellnhofのおかげで-11バイト。

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

説明:

v->{                              // Method with empty unused parameter & int-array return
  int i=109,                      //  Index-integer, starting at 109
      r[]=new int[i],             //  Result-array of size 109
      n=i;                        //  Number integer, starting at 109
   for(;i>0;                      //  Loop as long as `i` is not 0 yet:
       n++)                       //    After every iteration, increase `n` by 1
     if((n+"").chars().sum()==201 //   If the sum of the unicode values of `n` is 201,
                                  //   this means there are four digits, with digit-sum = 9
        &(n+"").contains("0"))    //   and `n` contains a 0:
       r[--i                      //    Decrease `i` by 1 first
            ]=n;                  //    And put `n` in the array at index `i`
  return r;}                      //  Return the array as result

1
どうchars().sum()==201
nwellnhof

@nwellnhofああ、もちろん。ありがとう!
ケビンクルーイッセン


3

05AB1E15 13 12 10 バイト

₄4°ŸεW°ö9Q

-2のおかげバイト@Emigna
-3おかげバイト@Grimyを

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

説明:

4°Ÿ        # Create a list in the range [1000,10000]
    ʒ       # Filter this list by:
     W      #  Get the smallest digit in the number (without popping the number itself)
      °     #  Take 10 to the power this digit
       ö    #  Convert the number from this base to an integer (in base-10)
        9Q  #  Check if it's equal to 9
  • d=0110d°ö)の数字の合計のように機能します。
  • d=11010d°ö
  • d=210010d°ö023452030405
  • d=3100010d°ö0034563004005006
  • d=[49]d=2d=3d10

>0[100010000]°ö[11119000000009000000009000000009]999Qd=0°ö9


1
₄4°Ÿʒ0å}ʒSO9Q。分割フィルターは通常短くなります
Emigna

@エミグナああ、私は範囲のためのより短い方法を探していましたが、完全に忘れていました 。ありがとう。そして、あなたは確かに(最後に)複数のルーズフィルターが短いことは正しいです。また、私のヒントの回答の1つに追加します。両方のバイトをありがとう!
ケビンクルーイッセン

1
そして、他の13バイト(ord sum == 201トリックに触発された)は4°Lʒ0å}ʒÇOт·-です。これをここに置いておくと、誰かがさらにゴルフをすることができます
氏Xcoder

1
₄4°ŸʒD0åôO9Q。通常、単一のフィルターを使用する方が短くなります。
グリムミー

1
ネヴァーマインド、ここでは10です:₄4°ŸʒW°ö9Q
Grimmy

2

ピップ、18バイト

{0Na&$+a=9}FIm,t*m

次のような出力形式のフラグを使用します -p出力読み取り可能な出力を取得します。オンラインでお試しください!

{0Na&$+a=9}FIm,t*m
             m,t*m  Range from 1000 to 10*1000
{         }FI       Filter on this function:
 0Na                 There is at least one 0 in the argument
    &                and
     $+a             The sum of the argument
        =9           equals 9

2

Wolfram言語(Mathematica) 56 55バイト

Select[9!!~Range~9999,Tr@#==Times@@#+9&@*IntegerDigits]

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

9からの範囲をテストします!! = 945から9999。これは、945から999の間に結果がないためです。おそらく、9000から10007の間に数字を書き込むより短い方法があるかもしれません。

Tr@#==Times@@#+9&{a,b,c,d}ifのテストに適用されますa+b+c+d == a*b*c*d+9。これは、The Anno Conditionと同等になります。


振り返ってみると、9 !! 任意の999か何かより短くはありませんが、それは1000打つ
ミーシャラブロフ

9とは ?推測では、階乗とは関係ありません。
ロバートフレイザー

@RobertFraser二重階乗:9*7*5*3*1
ミシャラブロフ

2

ルビー46 42 41バイト

?9.upto(?9*4){|x|x.sum==201&&x[?0]&&p(x)}

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

使い方:

  • 「9」から「9999」までの範囲の文字列で反復
  • ASCII値の合計が201であることを確認します
  • 文字列にゼロが含まれているかどうかを確認します(正規表現がない場合、正規表現は1バイト長くなります)

(-2バイトのLaikoniに感謝します)


1
9*39201に対するチェックにはすでに4桁の数字が必要であるため、単ににすることができます。
ライコニ

2

オクターブ、49バイト

J.Doeが提案する、より便利な出力形式を使用して6バイトを節約しました。

訂正してくれた@Laikoniに感謝します

y=dec2base(x=1e3:9999,10)'-48;x(sum(y)==9>all(y))

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


私はオクターブについては何も知りませんが、あなたが残すことができるように見えますdisp...オフ
J.Doe

@ J.Doe OPは、出力形式が受け入れられることを確認しました。提案をありがとう!
ルイスメンドー

2

Dart 103100  96バイト

f()=>List.generate(9001,(i)=>'$i').where((i)=>i.contains('0')&&i.runes.fold(0,(p,e)=>p+e)==201);

  • 配列内の値を文字列に設定し、2回ではなく1回変換して、-3バイト
  • codeUnitsの代わりにルーン文字を使用して-4バイト
  • かなり自明です。セルのインデックスを値として9001(0-9000)セルのリストを生成し、0を含むセルをフィルタリングし、次にASCIIの合計が201のセルをフィルタリングします(すべてのASCII文字の合計が9の場合の結果)。これらの条件には、2つのASCII数字(および0)を使用すると201に到達できないため、年が4桁であることが暗黙的に含まれています。

    Dartpadでお試しください!


    PPCGへようこそ。:)
    ライコニ

    1
    ありがとう!しばらく潜んでいましたが、ついに参加できるようになりました
    エルカン




    2

    PHP、69、87バイト 74バイト

    for($i=999;$i<9001;$i++){echo((array_sum(str_split($i))==9&strpos($i,"0")!=0)?$i:" ");} for($i=999;$i++<1e4;)echo!strpos($i,48)|array_sum(str_split($i))-9?" ":$i;

    これにより、すべての「失敗した」番号にスペースが配置され、ある種のファンキーな間隔になります。これはカンマ区切りに変更できますが、さらに4文字が追加されます。?$i.",":""

    0をチェックしていなかったため、大きくなりました。タイタスによって13に短縮!


    2
    私は本当にPHPを知りませんが、このコードは毎年ゼロが含まれることを保証しますか?
    ライコニ

    このコードは、数字のゼロをチェックしません。
    krzysiej

    1
    13バイト短縮:for($i=999;$i++<1e4;)echo!strpos($i,48)|array_sum(str_split($i))-9?" ":$i;
    タイタス

    ここに別のバイトがあります:えーと?"$i,":""...逆になりました:?"":"$i,"
    タイタス

    実際、数バイトを追加する@Titus。文字列を含む場合を除き、$ iを引用符で囲む必要はありません。
    アスラム


    2

    スカラ76 63 61 56バイト)

    for(n<-0 to 9000;t=n+""if t.sum==201&t.min<49)println(t)
    

    オンラインで試す

    • 提案してくれたライコニに感謝
    • ジョー・キングのコメントを適用した後、さらに2バイト減少

    1
    PPCGへようこそ!このコードをTIOで実行するために、ヘッダーまたはフッターセクションに何を追加する必要があるか考えていますか?オンラインでお試しください!
    ライコニ

    @ Laikoni、TIOでScalaを実行できるとは知らなかった。修正しました。コメントありがとうございます。
    jrook

    1
    t.sum==201代わりに動作するように見えますt.map(_.asDigit).sum==9
    ライコニ

    あなたは私たちを見つけるかもしれません Scalaでのゴルフのヒントはおもしろい。例えば、そうs"$n"n+""ありs"$t "得るように見えますt+" "
    ライコニ

    1
    合計は201トリックを使用しているため、範囲は999で開始する必要はありません
    Jo King


    1

    Japt、16バイト

    数字配列の配列を返します。

    L²õì l4 k_ת9aZx
    

    試して


    説明

    L                    :100
     ²                   :Squared
      õ                  :Range [1,L²]
       ì                 :Convert each to a digit array
         l4              :Filter elements of length 4
            k_           :Remove each Z that returns truthy (not 0)
              ×          :  When reduced by multiplication
               ª         :  OR
                  Zx     :  When reduced by addition
                9a       :   And subtracted from 9
    

    1
    OPは、残念ながら数字配列は有効な出力ではないと判断しました:o(
    Sok

    1

    APL(NARS)、45文字、90バイト

    f←{⍵×⍳(0∊x)∧9=+/x←⍎¨⍕⍵}⋄f¨1e3..5e3⋄f¨5e3..9e3
    

    いくつかのフォーマットをテストします。

    1008  1017  1026  1035  1044  1053  1062  1071  1080  1107  1170  1206  1260  
      1305  1350  1404  1440  1503  1530  1602  1620  1701  1710  1800  2007  2016  
      2025  2034  2043  2052  2061  2070  2106  2160  2205  2250  2304  2340  
      2403  2430  2502  2520  2601  2610  2700  3006  3015  3024  3033  3042  3051  
      3060  3105  3150  3204  3240  3303  3330  3402  3420  3501  3510  3600  
      4005  4014  4023  4032  4041  4050  4104  4140  4203  4230  4302  4320  4401  
      4410  4500 
    5004  5013  5022  5031  5040  5103  5130  5202  5220  5301  5310  5400  6003  
      6012  6021  6030  6102  6120  6201  6210  6300  7002  7011  7020  7101  7110  
      7200  8001  8010  8100  9000 
    

    可能な代替

    r←f;i;x
       r←⍬⋄i←1e3⋄→B
    A: r←r,i
    B: i+←1⋄→A×⍳(0∊x)∧9=+/x←⍎¨⍕i⋄→B×⍳i≤9e3
    

    1

    ゼリー、13 バイト

    ȷ4µṢÄm3Ḍ)ẹ9ṫ4
    

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

    どうやって?

    ȷ4µṢÄm3Ḍ)ẹ9ṫ4 - Link: no arguments
    ȷ4            - literal 10^4 = 10000
      µ     )     - for each in range (1,2,3,...,10000): e.g. 3042       or  5211
       Ṣ          -   sort (given an integer makes digits)    [0,2,3,4]      [1,1,2,5]
        Ä         -   cumulative addition                     [0,2,5,9]      [1,2,4,9]
         m3       -   modulo 3 slice (1st,4th,7th...)         [0,9]          [1,9]
           Ḍ      -   convert from decimal digits             9              19
             ẹ9   - 1-based indices equal to nine             [9,99,999,1008,1017,...,8100,9000]
               ṫ4 - tail from the 4th index                   [1008,1017,...,8100,9000]
    
    弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
    Licensed under cc by-sa 3.0 with attribution required.