九九で一意の数字を並べ替える


30

今日の非常に簡単な課題:

正の整数Nを取り、行と列の被乗数の両方が1からNまでの範囲の乗法テーブルに現れる一意の数字のソートされたリストを出力または返すプログラムまたは関数を記述します。

リストは、昇順(最小から最大)または降順(最大から最小)でソートでき、適切な形式で出力できます。

バイト単位の最短コードが勝ちです!

N = 4の場合、乗算表は次のようになります。

   1  2  3  4
  -----------
1| 1  2  3  4
 |
2| 2  4  6  8
 |
3| 3  6  9 12
 |
4| 4  8 12 16

テーブル内の一意の番号は1, 2, 3, 4, 6, 8, 9, 12, 16です。これらはすでにソートされているため、

1, 2, 3, 4, 6, 8, 9, 12, 16

N = 4の正確な出力になる可能性があります。ただし、並べ替えを逆にすることができ、フォーマットに多少の余裕があるため、これらも有効な出力になります。

[16,12,9,8,6,4,3,2,1]
1
2
3
4
6
8
9
12
16
16 12 9 8 4 3 2 1

テストケース

N=1 -> [1]
N=2 -> [1, 2, 4]
N=3 -> [1, 2, 3, 4, 6, 9]
N=4 -> [1, 2, 3, 4, 6, 8, 9, 12, 16]
N=5 -> [1, 2, 3, 4, 5, 6, 8, 9, 10, 12, 15, 16, 20, 25]
N=6 -> [1, 2, 3, 4, 5, 6, 8, 9, 10, 12, 15, 16, 18, 20, 24, 25, 30, 36]
N=7 -> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 12, 14, 15, 16, 18, 20, 21, 24, 25, 28, 30, 35, 36, 42, 49]
N=8 -> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 12, 14, 15, 16, 18, 20, 21, 24, 25, 28, 30, 32, 35, 36, 40, 42, 48, 49, 56, 64]
N=9 -> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 12, 14, 15, 16, 18, 20, 21, 24, 25, 27, 28, 30, 32, 35, 36, 40, 42, 45, 48, 49, 54, 56, 63, 64, 72, 81]
N=10 -> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 12, 14, 15, 16, 18, 20, 21, 24, 25, 27, 28, 30, 32, 35, 36, 40, 42, 45, 48, 49, 50, 54, 56, 60, 63, 64, 70, 72, 80, 81, 90, 100]
N=11 -> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 14, 15, 16, 18, 20, 21, 22, 24, 25, 27, 28, 30, 32, 33, 35, 36, 40, 42, 44, 45, 48, 49, 50, 54, 55, 56, 60, 63, 64, 66, 70, 72, 77, 80, 81, 88, 90, 99, 100, 110, 121]
N=12 -> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 14, 15, 16, 18, 20, 21, 22, 24, 25, 27, 28, 30, 32, 33, 35, 36, 40, 42, 44, 45, 48, 49, 50, 54, 55, 56, 60, 63, 64, 66, 70, 72, 77, 80, 81, 84, 88, 90, 96, 99, 100, 108, 110, 120, 121, 132, 144]

したがって、基本的に、コードはNで指定された乗算テーブルの数値のリストを返しますが、どの数値も繰り返すことはできません。
-TanMath

Nはどれくらい大きくできますか?
xsot

1
@xsotあなたはN * Nはあなたの言語の最大の通常のint型の値よりも小さくなりますと仮定することができます(おそらく、2 ^ 31-1)
カルバンの趣味

したがって、これは本質的に1-nであり、n ^ 2までの素数です。
グレッグデニス

1
@gregsdennisいいえ。存在しない複合材料がたくさんあります。例:N = 10の場合、91、92、93、94、95、96
カルビンの趣味

回答:


12

Pyth、8バイト

S{*M^SQ2

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

説明:SQ評価済みリスト入力(Q)を取り、リストを作成します[1, 2, ..., Q]^SQ2そのリストのデカルト積とそれ自体を取ります-すべての可能な製品の組み合わせ。*Mこれらのすべてのペアを乗算して、乗算テーブルで可能なすべての結果を形成し、S{それを一意にしてソートします。


@FryAmTheEggman入力5は既に並べ替えが必要です。そうでない場合、出力の10と9は順不同です。
レトコラディ

その飛び散ることを忘れ続けてくださいM。+1
マルティセン

13

パイソン2、61の 51バイト

lambda n:sorted({~(i%n)*~(i/n)for i in range(n*n)})

いくつかの構文を短縮したxnorに感謝します。


1
set(...)ちょうどセットカンプことができます{...}。また、ここではデフォルトで関数が許可されているため、単にを書くことができますlambda n:...
xnor

セット理解について思い出させてくれてありがとう、それが存在することを完全に忘れていた。
xsot

私はこれを行うためのより良い方法を見ることができませんf=lambda n:n*[0]and sorted(set(range(n,n*n+n,n)+f(n-1)))
xnor

11

APL、18 16バイト

{y[⍋y←∪,∘.×⍨⍳⍵]}

これは名前のない単項関数です。出力は昇順です。

説明:

             ⍳⍵]}   ⍝ Get the integers from 1 to the input
         ∘.×⍨       ⍝ Compute the outer product of this with itself
        ,           ⍝ Flatten into an array
       ∪            ⍝ Select unique elements
     y←             ⍝ Assign to y
 {y[⍋               ⍝ Sort ascending

問題を修正し、Thomas Kwaのおかげで2バイト節約しました!


7

CJam、14 12バイト

@aditsuによって提案された改善を含む最新バージョン:

{)2m*::*0^$}

これは匿名関数です。テストに必要な入力/出力コードを使用して、オンライン試してください

@Martinは{,:)_ff*:|$}、同じ長さの別の非常にエレガントなソリューション()を提案しました。私のオリジナルのソリューションに非常に似ていたので、私はaditsuのものを使用しました。

私の元のソリューションとの主な違いは、これ0により元のシーケンスに値が保持され、開始時に2バイトが節約されることです。0結果から値を削除する必要があるため、これは役に立たないと思います。しかし、@ aditsuのアイデアの中核は0^最後にあり、これはとのセットの違い0です。これはを削除する0と同時に、集合演算であるため、ソリューションセットから重複する要素を削除します。以前に重複を除去するためにすでに2バイトが必要だったので、削除すること0は本質的に無料です。

説明:

{     Start anonymous function.
  )     Increment to get N+1.
  2m*   Cartesian power, to get all pairs of numbers in range [0, N].
  ::*   Reduce all pairs with multiplication.
  0^    Remove 0, and remove duplicates at the same time since this is a set operation.
  $     Sort the list.
}     End anonymous function.

同じ長さの場合{2m*::)::*_&$}{)2m*::*_&$0-}
ピーターテイラー

2
2バイト以下の場合はどうですか:){,:)_ff*:|$}
Martin Ender

1
別の方法:{)2m*::*0^$}
aditsu


4

ジュリア、24バイト

n->sort(∪((x=1:n)*x'))

これは、整数を受け入れて整数配列を返す匿名関数です。

ゴルフをしていない:

function f(n::Integer)
    # Construct a UnitRange from 1 to the input
    x = 1:n

    # Compute the outer product of x with itself
    o = x * transpose(x)

    # Get the unique elements, implicitly flattening
    # columnwise into an array
    u = unique(o)

    # Return the sorted output
    return sort(u)
end

4

MATLAB、24バイト

@(n)unique((1:n)'*(1:n))

いいね!すぐに7または8バイトで実行できるようになります ... :
ルイスメンドー

いいね!:-)
Stewie Griffin

@Luisは、あなたがしようとした持っているこのいずれかを MATLに?
スティーヴィーグリフィン

チャレンジ全体を読む時間は今あまりありませんが、Matlabのコードを見ると、MATLでできるように見えます
ルイスメンドー

4

zsh、86 56バイト

30(!)バイトを節約してくれた@Dennisに感謝

(for a in {1..$1};for b in {1..$1};echo $[a*b])|sort -nu

説明/未使用:

(                      # begin subshell
  for a in {1..$1}     # loop through every pair of multiplicands
    for b in {1..$1}
      echo $[a*b]      # calculate a * b, output to stdout
) | sort -nu           # pipe output of subshell to `sort -nu', sorting
                       # numerically (-n) and removing duplicates (-u for uniq)

Bashは展開されないため、これはBashでは機能しません。{1..$1}文字どおりに解釈するだけです(したがって、の代わりにa=5; echo {1..$a}出力します)。{1..5}1 2 3 4 5


* shの回答を待っていました。:D
アディソンクランプ

1
関連するbash tip。Zシェルにも適用されるようです。
デニス


4

ルビー、50 48バイト

->n{c=*r=1..n;r.map{|i|c|=r.map{|j|i*j}};c.sort}

ゴルフをしていない:

->n {
  c=*r=1..n
  r.map { |i| c|=r.map{|j|i*j} }
  c.sort
}

ネストされたループを使用して、各数値をnまで1つおきの数値で乗算し、配列をソートします。

50バイト

->n{r=1..n;r.flat_map{|i|r.map{|j|i*j}}.uniq.sort}

使用法:

->n{c=*r=1..n;r.map{|i|c|=r.map{|j|i*j}};c.sort}[4]
=> [1, 2, 3, 4, 6, 8, 9, 12, 16]

3

R、39バイト

cat(unique(sort(outer(n<-1:scan(),n))))

これは、STDINから整数を読み取り、スペースで区切られたリストをSTDOUTに書き込みます。

を使用して乗算テーブルを行列として作成しouter、暗黙的にベクトルに平坦化して使用しsort、を使用して一意の要素を選択しunique、を使用して区切られたスペースを印刷しcatます。




2

K、17バイト

t@<t:?,/t*\:t:1+!

ここで言うことはあまりありません。平坦化された()乗算されたデカルト自己積(t@<t:)の一意のアイテム(?)を、N()まで1でソートします()。,/t*\:t:1+!

動作中:

  t@<t:?,/t*\:t:1+!5
1 2 3 4 5 6 8 9 10 12 15 16 20 25

2

Haskell、55 54バイト

import Data.List
f n=sort$nub[x*y|x<-[1..n],y<-[1..x]]

使用例:f 4-> [1,2,3,4,6,8,9,12,16]

nub リストから重複した要素を削除します。

編集:@Zgarbは余分なを見つけました$


2

J、21 20バイト

-1バイトの@Zgarbに感謝します!

/:~@~.@,@(1*/~@:+i.)

私の最初のJの答え!ゴルフに何かがあれば、ゴルフのヒントは大歓迎です。

これは単項関数です。リスト1..inputとそれ自体の乗算により外積を取り、平坦化し、一意の要素を取り、ソートします。


2

Kotlin、70バイト

val a={i:Int->(1..i).flatMap{(1..i).map{j->it*j}}.distinct().sorted()}

ゴルフされていないバージョン:

val a: (Int) -> List<Int> = { 
    i -> (1..i).flatMap{ j -> (1..i).map{ k -> j * k } }.distinct().sorted()
}

以下でテストします:

fun main(args: Array<String>) {
    for(i in 1..12) {
        println(a(i))
    }
}

2

シェル+共通ユーティリティ、41

seq -f"seq -f%g*%%g $1" $1|sh|bc|sort -nu

または、代わりに:

Bash + coreutils、48

eval printf '%s\\n' \$[{1..$1}*{1..$1}]|sort -nu

算術展開内にブレース展開を構築します。

\$[{1..n}*{1..n}]は算術展開に展開$[1*1] $[1*2] ... $[1*n] ... $[n*n]され、評価されてに渡さprintfsortます。これは、1行に1を出力し、パイプに渡されます。

引用符を慎重に使用し、エスケープevalし、必要な順序で展開するようにします。


または、代わりに:

ピュアバッシュ、60

eval a=($(eval echo [\$[{1..$1}*{1..$1}\]]=1))
echo ${!a[@]}


1

Minkolang 0.1425の 22 18バイト

この質問が投稿される前に、デカルト製品を非常に便利に実装したことを思い出しました!

1nLI20P[x*1R]sS$N.

ここで試してみてください。(出力は逆順です。)

説明

1                     Push a 1 onto the stack
 n                    Take number from input (n)
  L                   Pushes 1,2,...,n onto the stack
   I                  Pushes length of stack so 0P knows how many items to pop
    2                 Pushes 2 (the number of repeats)
     0P               Essentially does itertools.product(range(1,n+1), 2)
       [              Open for loop that repeats n^2 times (0P puts this on the stack)
        x             Dump (I know each product has exactly two numbers
         *            Multiply
          1R          Rotate 1 step to the right
            ]         Close for loop
             s        Sort
              S       Remove duplicates ("set")
               $N.    Output whole stack as numbers and stop.

1

JavaScript(ES6)、92 90バイト

n=>eval(`for(r=[],a=n;a;a--)for(b=n;b;)~r.indexOf(x=a*b--)||r.push(x);r.sort((a,b)=>a-b)`)

説明

n=>eval(`                 // use eval to remove need for return keyword
  for(r=[],a=n;a;a--)     // iterate for each number a
    for(b=n;b;)           // iterate for each number b
      ~r.indexOf(x=a*b--) // check if it is already in the list, x = value
      ||r.push(x);        // add the result
  r.sort((a,b)=>a-b)      // sort the results by ascending value
                          // implicit: return r
`)

テスト

N = <input type="number" oninput="result.innerHTML=(

n=>eval(`for(r=[],a=n;a;a--)for(b=n;b;)~r.indexOf(x=a*b--)||r.push(x);r.sort((a,b)=>a-b)`)

)(+this.value)" /><pre id="result"></pre>


1

Perl 6、27バイト

{squish sort 1..$_ X*1..$_} # 27
{unique sort 1..$_ X*1..$_} # 27
{sort unique 1..$_ X*1..$_} # 27

使用例:

say {squish sort 1..$_ X*1..$_}(3); # (1 2 3 4 6 9)␤

my $code = {squish sort 1..$_ X*1..$_}

for 1..100 -> \N { say $code(N) }

my &code = $code;

say code 4; # (1 2 3 4 6 8 9 12 16)␤

1

Haskell、51バイト

f n=[i|i<-[1..n*n],elem i[a*b|a<-[1..n],b<-[1..n]]]

かなりつまらない。ただ、リストフィルタリング[1..n*n]の形の要素にa*b持つabでは[1..n]。を使用filterすると同じ長さになります

f n=filter(`elem`[a*b|a<-[1..n],b<-[1..n]])[1..n*n]

私はしばらくの間、concatMapまたはのようなより巧妙なもので製品のリストを生成しようとしましたmapMが、結果は長くなりました。メンバーシップのより洗練されたチェックは1バイト長い52バイトで行われましたが、おそらく短縮できます。

f n=[k|k<-[1..n*n],any(\a->k`mod`a<1&&k<=n*a)[1..n]]

あなたは、使用して3つのバイトを保存することができます(*)<$>..<*>..ように、この
ბიმო

1

JAVA-86バイト

Set a(int a){Set s=new TreeSet();for(;a>0;a--)for(int b=a;b>0;)s.add(a*b--);return s;}

非ゴルフ

Set a(int a){
    Set s = new TreeSet();
    for (;a>0;a--){
        for(int b = a;b>0;){
            s.add(a*b--);
        }
    }
    return s;
}

1

Pyth、11バイト

S{sm*RdSdSQ

これはジュリアの答えに似ています。@Maltysenに感謝


1

PHP、74,73 70バイト

while($i++<$j=$n)while($j)$a[]=$i*$j--;$a=array_unique($a);sort($a);

print_r($a); // Not counted, but to verify the result

ゴルフをしていない:

while($i++<$j=$n)
    while($j)
        $a[]=$i*$j--;

前:

while(($j=$i++)<$n)for(;$j++<$n;)$a[]=$i*$j;$a=array_unique($a);sort($a);

出力の処理方法を100%確信することはできませんが$a、対応する番号の配列が含まれています。$n数が経由gevenされる$_GET['n']と、register_globals=1


1

TeaScript37 35文字。40バイト

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

TeaScriptはゴルフ用のJavaScriptです。

(b+r(1,+x¬)ßam(z=>z*l±s`,`.u¡s»l-i)

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

非ゴルフと説明

(b+r(1,+x+1)m(#am(z=>z*l)))s(',').u()s(#l-i)
              // Implicit: x = input number
r(1,+x+1)     // Generate a range of integers from 1 to x.
m(#           // Map each item "l" in this range "a" to:
 am(z=>       //  a, with each item "z" mapped to
  z*l))       //   z * l.
(b+      )    // Parse this as a string by adding it to an empty string.
s(',')        // Split the string at commas, flattening the list.
.u()          // Take only the unique items from the result.
s(#l-i)       // Sort by subtraction; the default sort sorts 10, 12, 100, etc. before 2.
              // Implicit: output last expression

範囲を生成するr代わりに使用できますA.r
-Downgoat

確かにこれは35 バイトですか?35文字または40バイトを取得します。
マナトワーク

@manatworkこれは、ISO / IEC_8859-1エンコード形式で35バイトになります。しかし、TeaScriptがそのエンコードをサポートしているかどうかはわかりませんので、今のところ40バイトに変更します。
ETHproductions

0

C、96バイト

i,a[1<<16];main(n){for(scanf("%d",&n);i<n*n;a[~(i%n)*~(i++/n)]="%d ");while(i)printf(a[i--],i);}

これは、数字を降順で出力します。これは最適とはほど遠いので、提案を歓迎します。


0

JavaScript(ES6)、86バイト

n=>{n++;a=[];for(j=1;j<n;j++)for(i=1;i<n;i++)if(a.indexOf(i*j)<0)a.push(i*j);return a}

それを短くしようとしています(ループを入れ子にしてみます)。


0

Perl 5、91バイト

for my $y (1 .. $ARGV[0]){
    map {$s{$n}++ unless($s{$n=$y*$_}) } ($y .. $ARGV[0])
}
print join(" ", sort {$a<=>$b} keys %s) . "\n";

コマンドラインで引数を渡すことで実行されます。それは、制約と警告を伴う実行に足りないかなりの数の宣言です。


0

Python、124 102バイト

n=input()
l=[1]
for i in range(1,n+1):
 for j in range(1,n+1):l.append(i*j)
print sorted(list(set(l)))

もっとニシキヘビ!


2
これは実際には123のバイトではなく、124である。しかし、あなたはむしろ4よりもインデントレベルごとに1つだけのスペースを使って、数バイトを保存することができます
アレックスA.

1
l.append(i*j)if条件と同じ行に置くこともできます。最終的には102バイトになると思います。
エレンディアスターマン

3
そしての+=代わりに使用しますappend
カルティック

@ El'endiaStarman編集、ありがとう!
-TanMath

1
比較的小さな問題の1つlist(set(l))は、並べ替えが保証されていないことです。
エレンディアスターマン

0

Perl 5、67バイト

for$i(1..($n=pop)){$a{$_*$i}++for 1..$n}map say,sort{$a<=>$b}keys%a
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.