Gambarlah segitiga phi


11

Klarifikasi: Pada dasarnya, Anda perlu membuat ini

Fungsi totient Euler memiliki nama phi.

Mari kita coba hitung phi (8)

Pertama, daftarkan semua angka 8 dan di bawahnya, tidak termasuk 0 atau di bawah

8
7
6
5
4
3
2
1

Sekarang cari nomor mana yang tidak berbagi faktor dengan 8 (1 tidak masuk hitungan), dan tempatkan #di tempat mereka.

8
#
6
#
4
#
2
#

Hapus angka-angkanya.

#

#

#

#
                                                 -

Sekarang lakukan ini, tetapi merangkai output bersama dalam sebuah segitiga

        9
       88
      777
     6666
    55555
   444444
  3333333
 22222222
111111111
---------
123456789

# nomor berbagi non-faktor

        9
       8#
      7##
     6#66
    5####
   4#4#4#
  3##3##3
 2#2#2#2#
#########

Hapus angka:

        #
       ##
      #
     ####
    # # #
   ## ## 
  # # # #
#########

Ini akan menjadi output untuk input 9 (karena 9 kolom.)

Leading + trailing newlines diizinkan.


Klarifikasi diperlukan.

4
jika Anda perlu menjelaskan, coba kotak pasir terlebih dahulu.
Rɪᴋᴇʀ

dapatkah saya menampilkan sebagai daftar baris?
Maltysen

Memimpin baris baru diizinkan?
Luis Mendo

Jawaban:


7

MATL , 17 15 byte

:Gq:!Zd1=RP35*c

Cobalah online!

Jika sebuah baris baru dapat diterima: 13 byte :

:t!Zd1=RP35*c

Penjelasan

:     % Take input N. Generate row vector [1 2 ... N]
Gq:   % Row vector [1 2 ... N-1].
      % (In the 13-byte version this is replaced by function `t`, which duplicates
      % the array [1 2 ... N])
!     % Transpose into column vector
Zd    % GCD, element-wise with broadcast. Gives (N-1)×N matrix
1=    % True for entries that equal 1, corresponding to relatively prime pairs.
      % The rest of entries are set to false, i.e. 0.
R     % Upper triangular part: set values below diagonal to 0
P     % Flip matrix vertically
35*   % Multiply each entry by 35 (ASCII for '#')
c     % Convert to char. 0 will be displayed as a space. Implicitly display

Nice use of char(0):)
Suever

@Suever Ternyata sangat berguna!
Luis Mendo



2

JavaScript (ES6), 112 byte

n=>[...s=` `.repeat(n)].map(_=>s.replace(/./g,_=>`# `[+g(n+1,i++)],n-=i=1),g=(i,j)=>i?i>j||g(j%i,i):j>1).join`\n`

Dimana \nmewakili karakter baris baru literal. Solusi alternatif, juga 112 byte:

n=>(s=`# `.repeat(n)).replace(r=/../g,_=>s.replace(r,m=>m[+g(n+1,i++)],n-=i=1)+`
`,g=(i,j)=>i?i>j||g(j%i,i):j>1)

1

Java, 162 158 byte

int g(int a,int b){return a<1?b:g(b%a,a);}
String d(int n){String r="";for(int i=0;i<n;i++){for(int j=1;j<=n;)r+=i+j<n|g(n-i,j++)>1?" ":"#";r+="\n";}return r;}

Program lengkap (tidak diperbarui)

import java.util.Scanner;

public class Q79082 {
    int gcd_ungolfed(int a,int b){
        if(a==0) return b;
        return gcd_ungolfed(b%a,a);
    }
    void draw_ungolfed(int n){
        for(int i=1;i<=n;i++){
            for(int j=1;j<=n;j++){
                if(i+j<=n || gcd_ungolfed(n+1-i,j)!=1){
                    System.out.print(" ");
                }else{
                    System.out.print("#");
                }
            }
            System.out.println();
        }
    }
    int g(int a,int b){return a<1?b:g(b%a,a);}
    String d(int n){String r="";for(int i=0;i<n;i++){for(int j=1;j<=n;j++)r+=(i+j<n||g(n-i,j)>1)?" ":"#";r+="\n";}return r;}
    public static void main(String args[]){
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        sc.close();
        new Q79082().draw_ungolfed(n);
        System.out.println(new Q79082().d(n));
    }
}

Input output:

9

        #
       ##
      #  
     ####
    # # #
   ## ## 
  # # # #
#########

        #
       ##
      #  
     ####
    # # #
   ## ## 
  # # # #
#########

Buat pintasan atau ke dalam satu pipa, lalu masukkan i ++ dan j ++ ke dalam panggilan ke g. Akan menghemat 3 byte. Juga, Anda tidak perlu orangtua dalam trinary di d. 2 byte lagi
Biru

i ++ tidak akan berfungsi karena bersarang.
Leaky Nun

1

SQL (PostGreSQL9.4), 239 291 byte

Membuat pernyataan siap yang dapat dieksekusi. Saya yakin saya mungkin dapat mengambil beberapa byte dari ini, tetapi saya harus mengambilnya nanti. Apakah tanda silang bergabung pada kisaran 1 hingga n. Hitung GCD dalam gabungan lateral. Di mana GCD adalah 1 dan seri A lebih besar dari seri B menghasilkan '#' jika tidak spasi. Himpun hasil menjadi string yang dikelompokkan berdasarkan seri B.

prepare p(int)as
select string_agg(coalesce(CASE WHEN b<=a AND x=1THEN'#'END,' '),'')from generate_series(1,$1)a,generate_series(1,$1)b,LATERAL(SELECT MAX(G)x FROM generate_series(1,LEAST(a,b))g WHERE a%g+b%g=0)g
group by b
order by b desc

Jalankan dengan cara berikut

execute p(13)

string_agg
----------------

            #
           ##
          # #
         ## #
        # # #
       ######
      #   # #
     #### ###
    # # # # #
   ## ## ## #
  # # # # # #
#############

Dan dibersihkan dengan

deallocate p

0

Ruby, 84 byte

->n{s=[];n.times{|i|j=0;m=n-i;s<<(?#*n).gsub(/./){m.gcd(j+=1)>1||m>j ?' ':$&}};s*$/}

0

Python 2 (120 byte)

g=lambda m,n:m if n<1 else g(n,m%n)
r=range(input())
for i in r[:0:-1]:print''.join('# '[i>j+1 or g(i,j+1)>1]for j in r)
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.