Mengurutkan angka unik dalam tabel perkalian


30

Tantangan yang cukup sederhana hari ini:

Tulis program atau fungsi yang mengambil dalam bilangan bulat positif N dan mencetak atau mengembalikan daftar angka unik yang diurutkan dalam tabel perkalian yang baris dan kolomnya dikalikan baik dari 1 hingga N inklusif.

Daftar ini dapat disortir dalam urutan menaik (terkecil ke terbesar) atau urutan menurun (terbesar ke terkecil), dan dapat dihasilkan dalam format apa pun yang masuk akal.

Kode terpendek dalam byte menang!

Contoh

Ketika N = 4, tabel perkalian tampak seperti:

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

Angka unik dalam tabel adalah 1, 2, 3, 4, 6, 8, 9, 12, 16. Ini sudah diurutkan, jadi

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

mungkin output tepat Anda untuk N = 4. Tapi karena pengurutan dapat dibalik dan ada beberapa kelonggaran dalam format, ini juga akan menjadi output yang valid:

[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

Uji Kasus

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]

Jadi pada dasarnya, kode mengembalikan daftar angka dalam tabel perkalian yang ditentukan oleh N, kecuali angka apa pun tidak dapat diulang?
TanMath

Seberapa besar N bisa?
xsot

1
@xsot Anda dapat mengasumsikan N * N akan kurang dari nilai int biasanya maksimum bahasa Anda (mungkin 2 ^ 31-1)
Calvin's Hobbies

Jadi pada dasarnya ini adalah 1-n dan bukan bilangan prima hingga n ^ 2.
gregsdennis

1
@regregdennis Tidak. Ada banyak komposit tidak ada. mis. 91, 92, 93, 94, 95, 96 untuk N = 10.
Calvin Hobbies

Jawaban:


12

Pyth, 8 byte

S{*M^SQ2

Cobalah online.

Penjelasan: SQmengambil input daftar yang dievaluasi ( Q) dan membuat daftar [1, 2, ..., Q]. ^SQ2membawa produk Cartesian dari daftar itu dengan sendirinya - semua kombinasi produk yang mungkin. *Mmengalikan semua pasangan ini bersama-sama untuk membentuk semua hasil yang mungkin di tabel perkalian dan S{membuatnya unik dan mengurutkannya.


@FryAmTheEggman Input 5 sudah perlu disortir, jika 10 dan 9 dalam output rusak.
Reto Koradi

Sialan terus lupa tentang percikan itu M. +1
Maltysen

13

Python 2, 61 51 byte

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

Terima kasih kepada xnor untuk mempersingkat beberapa sintaks.


1
Hanya set(...)bisa menjadi set comp {...}. Selain itu, fungsi diizinkan secara default di sini, jadi Anda bisa menulis lambda n:....
xnor

Terima kasih telah mengingatkan saya tentang pemahaman set, saya benar-benar lupa itu ada.
xsot

Aku tidak bisa melihat cara yang lebih baik untuk melakukan hal ini, terbaik yang saya lihat dengan rekursi adalah 56: f=lambda n:n*[0]and sorted(set(range(n,n*n+n,n)+f(n-1))).
xnor

11

APL, 18 16 byte

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

Ini adalah fungsi monadik yang tidak disebutkan namanya. Output dalam urutan menaik.

Penjelasan:

             ⍳⍵]}   ⍝ 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

Memperbaiki masalah dan menyimpan 2 byte berkat Thomas Kwa!


7

CJam, 14 12 byte

Versi terbaru dengan perbaikan yang diusulkan oleh @aditsu:

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

Ini adalah fungsi anonim. Cobalah online , dengan kode input / output yang diperlukan untuk mengujinya.

@ Martin mengusulkan solusi lain yang sangat elegan ( {,:)_ff*:|$}) dengan panjang yang sama. Saya menggunakan yang oleh aditsu karena itu jauh lebih mirip dengan solusi asli saya.

Perbedaan utama dengan solusi asli saya adalah bahwa ini menjaga 0nilai dalam urutan asli, yang menghemat 2 byte di awal. Anda akan berpikir bahwa ini tidak akan membantu, karena Anda harus menghapus 0nilai dari hasilnya. Tapi inti dari ide @ aditsu adalah 0^pada akhirnya, yang merupakan perbedaan yang ditetapkan 0. Ini menghapus0 , dan pada saat yang sama, karena ini adalah operasi yang ditetapkan, menghilangkan elemen duplikat dari rangkaian solusi. Karena saya sudah membutuhkan 2 byte untuk menghilangkan duplikat sebelumnya, menghapus 0itu pada dasarnya gratis.

Penjelasan:

{     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.

Untuk panjang yang sama {2m*::)::*_&$},,{)2m*::*_&$0-}
Peter Taylor

2
Bagaimana kalau ini kurang dua byte :){,:)_ff*:|$}
Martin Ender

1
Cara lain:{)2m*::*0^$}
aditsu


4

Julia, 24 byte

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

Ini adalah fungsi anonim yang menerima integer dan mengembalikan array integer.

Tidak Disatukan:

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

zsh, 86 56 byte

terima kasih kepada @Dennis karena telah menghemat 30 (!) byte

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

Penjelasan / ungolfed:

(                      # 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)

Ini tidak berfungsi di Bash karena Bash tidak berkembang {1..$1}— itu hanya menafsirkannya secara harfiah (jadi, a=5; echo {1..$a}output {1..5}bukan 1 2 3 4 5).


Saya sedang menunggu jawaban. : D
Addison Crump

1
Tip bash yang relevan. Tampaknya berlaku untuk shell Z juga.
Dennis


4

Ruby, 50 48 byte

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

Tidak Disatukan:

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

Menggunakan nested loop untuk mengalikan setiap angka dengan setiap angka lainnya hingga n lalu menyortir array.

50 byte

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

Pemakaian:

->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 byte

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

Ini membaca bilangan bulat dari STDIN dan menulis daftar yang dibatasi ruang untuk STDOUT.

Kami membuat tabel perkalian sebagai menggunakan matriks outer, secara implisit meratakan menjadi vektor dan mengurutkan menggunakan sort, pilih elemen unik menggunakan unique, dan ruang cetak dibatasi menggunakan cat.




2

K, 17 byte

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

Tidak banyak bicara di sini. Sortir ( t@<t:) item unik (? ) dari ,/produk-sendiri kartesian yang diratakan ( ) berlipat ganda ( t*\:t:) dari 1 hingga dan termasuk N ( 1+!).

Dalam aksi:

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

2

Haskell, 55 54 byte

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

Contoh penggunaan: f 4 -> [1,2,3,4,6,8,9,12,16].

nub menghapus elemen duplikat dari daftar.

Sunting: @Zgarb menemukan berlebihan $.


2

J, 21 20 byte

Terima kasih kepada @Zgarb untuk -1 byte!

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

Jawaban J pertamaku! Tips golf sangat dihargai, jika ada sesuatu untuk golf.

Ini adalah fungsi monadik; kami mengambil produk luar dengan mengalikan daftar 1..inputitu sendiri, meratakan, mengambil elemen unik, dan mengurutkan.


2

Kotlin, 70 byte

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

Versi tidak disatukan:

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

Uji dengan:

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

2

Shell + utilitas umum, 41

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

Atau sebagai alternatif:

Bash + coreutils, 48

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

Membangun ekspansi penjepit di dalam ekspansi aritmatika:

\$[{1..n}*{1..n}]memperluas ke ekspansi aritmatika $[1*1] $[1*2] ... $[1*n] ... $[n*n]yang dievaluasi dan diteruskan ke printf, yang mencetak satu per baris, yang disalurkan ke sort.

Penggunaan kutipan, kehati-hatian, dan evalmemastikan ekspansi terjadi dalam urutan yang disyaratkan.


Atau sebagai alternatif:

Bash Murni, 60

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


1

Minkolang 0,14 , 25 22 18 byte

Saya ingat bahwa saya sangat mudah menerapkan produk Cartesian sebelum pertanyaan ini diposting !

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

Coba di sini. (Output dalam urutan terbalik.)

Penjelasan

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 byte

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)`)

Penjelasan

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
`)

Uji

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 byte

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

Contoh penggunaan:

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 byte

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

Membosankan. Cukup saring daftar [1..n*n]ke elemen formulir a*bdengan adan bdi [1..n]. Menggunakan filtermemberi panjang yang sama

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

Saya mencoba untuk sementara waktu untuk menghasilkan daftar produk dengan sesuatu yang lebih pintar seperti concatMapatau mapM, tetapi hanya mendapat hasil yang lebih lama. Pemeriksaan keanggotaan yang lebih canggih datang pada 52 byte, 1 byte lebih lama, tetapi mungkin dapat dipersingkat.

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

Anda dapat menyimpan 3 byte dengan menggunakan (*)<$>..<*>..seperti ini
ბიმო

1

JAVA - 86 Bytes

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

Tidak disatukan

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 byte

S{sm*RdSdSQ

Ini mirip dengan jawaban Julia. Terima kasih kepada @Maltysen


1

PHP, 74,73 70bytes

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

Tidak Disatukan:

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

Sebelumnya:

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

Tidak 100% yakin apa yang harus dilakukan dengan output, tetapi $aberisi array dengan angka yang sesuai. $nadalah nomor geven via $_GET['n'], denganregister_globals=1


1

TeaScript , 37 35 karakter; 40 byte

Disimpan 2 byte berkat @Downgoat

TeaScript adalah JavaScript untuk bermain golf.

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

Cobalah online!

Tidak terseret dan penjelasan

(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

Anda hanya bisa menggunakan ralih-alih A.runtuk menghasilkan rentang
Downgoat

Yakin ini adalah 35 byte ? Saya mendapatkan 35 karakter atau 40 byte.
manatwork

@manatwork Ini akan menjadi 35 byte dalam format penyandian ISO / IEC_8859-1 . Tapi saya tidak yakin bahwa TeaScript mendukung pengkodean itu, jadi saya akan mengubahnya menjadi 40 byte untuk saat ini.
ETHproduk

0

C, 96 byte

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);}

Ini mencetak angka dalam urutan menurun. Saran disambut karena ini terlihat jauh dari optimal.


0

JavaScript (ES6), 86 byte

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}

Mencari untuk mempersingkat (mungkin akan mencoba loop bersarang).


0

Perl 5, 91 byte

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

untuk dijalankan dengan melewati argumen di baris perintah. Ini adalah beberapa deklarasi pendek berjalan dengan striktur dan peringatan.


0

Python, 124 102 byte

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)))

Lebih banyak pythonic!


2
Ini sebenarnya 123 byte, bukan 124. Tetapi Anda dapat menyimpan beberapa byte dengan hanya menggunakan satu spasi per level indentasi daripada 4.
Alex A.

1
Anda juga dapat memakai l.append(i*j)baris yang sama dengan kondisional if. Saya pikir itu akhirnya menjadi 102 byte sama sekali.
El'endia Starman

3
Dan gunakan +=sebagai gantinya append.
Kartik

@ El'endiaStarman diedit, terima kasih!
TanMath

1
Satu masalah yang relatif kecil: list(set(l))tidak dijamin akan disortir.
El'endia Starman

0

Perl 5, 67 byte

for$i(1..($n=pop)){$a{$_*$i}++for 1..$n}map say,sort{$a<=>$b}keys%a
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.