Ditransposisikan, bilangan prima, oh my!


15

Tugasnya sederhana: program Anda membaca bilangan bulat sebagai input, dan mencetak apakah bilangan prima atau bukan. Anda dapat mencetak "ya / tidak", "benar / salah" atau apa pun yang dengan jelas mengidentifikasikan hasilnya.

Tantangannya adalah, kode harus bekerja dengan baris dan kolomnya ditransformasikan.

Untuk mengecualikan solusi yang jelas (solusi "sederhana" terpendek yang diulang secara vertikal char-by-char dengan menggunakan komentar), metrik ini sedikit berbeda dari kode-golf yang biasa:

Karena pemformatan sangat penting dalam tantangan ini , ukuran kode diukur di area persegi panjang terkecil yang cocok dengan kode. Dengan kata lain, spasi putih memang dihitung, dan garis harus diisi dengan panjang yang sama (Anda tidak perlu harus benar-benar melakukannya ketika Anda memposting solusi, demi kesederhanaan). Sebagai contoh

int main()   
{            
    return 0;
}            

akan memiliki ukuran 4 * 13 = 52, (dan jelas itu tidak cocok dengan salah satu dari dua kriteria: deteksi utama dan transposable.)

Kemenangan ukuran terkecil.

Anda dapat menggunakan bahasa apa pun, dan fungsi perpustakaan apa pun kecuali jika satu-satunya tujuan fungsi itu adalah untuk menemukan, menghasilkan, atau mendeteksi bilangan prima.

Edit:

Sementara pemenang mungkin akan menjadi solusi Golfscript, saya akan memberikan hadiah 50 poin untuk solusi C atau C ++ terbaik!


Metrik persegi panjang Anda gagal untuk mencegah solusi yang jelas - lebih baik mengambil sidelength terpanjang. Padahal, ini akan mengurangi jawaban GS untuk memiliki skor 4.
Stanby

Kamu benar. Masalah dialihkan berikutnya harus memiliki solusi simetris metrik dan terlarang yang berbeda. Namun saya pikir bahkan kemudian akan ada seseorang yang menghindari aturan atau setidaknya menemukan solusi yang QA tidak harapkan ketika menyusun aturan.
vsz

Jawaban:


7

GolfScript, 13 × 1

~.,2>{1$\%!}?

GolfScript menyerang lagi!

Ulangi input jika prima, jika tidak, cetak input bersambung dengan pembagi terkecil yang tepat. Ya, saya tahu itu memperluas definisi "apa pun yang jelas-jelas mengidentifikasi hasil", tetapi melakukan sesuatu yang lebih menarik akan membutuhkan beberapa karakter tambahan. Jika Anda ingin hasil yang lebih bagus, tambahkan tiga karakter ;]!ke kode yang menghasilkan 1bilangan prima dan bilangan 0komposit.

Algoritma ini benar-benar tidak efisien, hanya pembagian percobaan brute force dari 2 ke n −1. Sebagian besar operator GolfScript hanya karakter tunggal, sehingga kode ini berfungsi dengan baik sebagaimana ditransformasikan. Mengganggu, meskipun, operator penugasan :tidak mengizinkan spasi putih antara dirinya dan targetnya, jadi saya harus melakukan ini sepenuhnya tanpa variabel.


Wrt "pelamun apa pun akan dikenakan biaya beberapa karakter tambahan" - Anda bisa mendapatkan Boolean gaya-GolfScript hanya untuk 2.
Peter Taylor

@ Peter: Maksud Anda seperti edit saya di atas, hanya tanpa !? Atau apakah Anda memiliki sesuatu yang lebih menarik di benak Anda?
Ilmari Karonen

1
Saya berpikir )sebelum ,sehingga selalu menemukan pembagi dan =pada akhirnya.
Peter Taylor

:diikuti oleh baris baru, ditugaskan ke karakter baris baru - jadi bukan bahwa spasi putih tidak diizinkan, hanya saja ruang kosong itulah yang ditugaskan
gnibbler

@gnibbler: Secara teknis, kami berdua benar. :tidak mengizinkan spasi putih, atau apa pun , antara dirinya dan targetnya: apa pun yang segera mengikutinya, apakah spasi putih atau token lainnya (ya, genap angka, string, atau blok kode), adalah yang ditugaskan untuknya. Namun, spasi putih adalah apa yang secara khusus diperingatkan oleh dokumentasi resmi, dan untuk alasan yang baik - karena di sebagian besar tempat lain, menambahkan spasi putih antara token di GolfScript tidak melakukan apa-apa (biasanya, kecuali jika ditugaskan untuk ...).
Ilmari Karonen

21

C, 2 * 70 2 * 60

Mencetak yuntuk bilangan prima, tidak sebaliknya.
EDIT : Mengubah kode untuk menyimpan 10 karakter. Harus dijalankan tanpa parameter (jadi m=1).

main(m,n){for(scanf("%d",&n);n%++m&&n>1;);n-m||puts("y");}/*
\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/ 

Metode untuk menangani transposisi cukup umum, dan dapat diterapkan pada program apa pun.
Ini didasarkan pada konversi ini:

abcd/*
\\\\*/

Untuk ini:

a\
b\
c\
d\
/*
*/

Dan keduanya berarti sederhana abcd.


wow, penyalahgunaan
cerat

2
Ini adalah situs golf / puzzle. Tidak ada penyalahgunaan.
stan

2
@ bby, kurasa maksudnya pelecehan. Tapi saya tidak berdebat dengan pujian.
ugoren

14

C - 13x13

Membaca input dari stdin dan mencetak a 1for prime dan a 0for prime.

////m(i;(a=)<
////aans")a;2
//:Di)tc%;;p)
//O n{ adfau+
main//bn"o%t4
(a){///f,r-c8
int b///&(-h)
;scanf///bba;
("%d",&///;r}
a);for(b///( 
=a;a%--b;//( 
);putchar((b 
<2)+48);}    

sunting: kompilasi dengan gcc dan dentang sekarang, kompiler lain tidak diuji


12

C, 12x12 karakter

Solusi dua dimensi, tidak seperti jawaban saya yang lain , berdasarkan kode yang sama (dan menyukainya, mencetak yuntuk prime, tidak untuk komposit).
Strukturnya mirip dengan jawaban Quasimodo , tetapi kode saya lebih pendek, dan saya pikir penggunaan comemnts saya sedikit lebih efisien, sehingga saya dapat memuat 12x12.

////m()s";np
////am{c%n>u
////i,fad%1t
////nnon"+;s
main//rf,+)(
(m,n//((&m;"
){for(//n&ny
scanf(//)&-"
"%d",&n)//m)
;n%++m&&//|;
n>1;);n-m|| 
puts("y"); }

7

Perl, 14 x 14

Saya pikir saya sudah memahami ini. Tentukan angka sebagai argumen baris perintah, output 0atau 1. Mungkin lebih banyak ruang untuk perbaikan.

$   n=pop;$p|=
 !  ($n%$_)for
  2 ..$n/2;   
   print!$p+m~
n(.r          
=$.i          
pn$n          
o%nt          
p$/!          
;_2$          
$);p          
pf +          
|o m          
=r ~          

3

Q

Komentar yang disalahgunakan untuk solusi simetris, karakter yang tidak efisien.

/{/////////////////////////////////
{(~)any 0=mod[x;2+(!)x-2]}"I"$(0:)0
/~
/)
/a
/n
/y
/ 
/0
/=
/m
/o
/d
/[
/x
/;
/2
/+
/(
/!
/)
/x
/-
/2
/]
/}
/"
/I
/"
/$
/(
/0
/:
/)
/0

Mengambil input dari STDIN, mengembalikan boolean.


Melihat sqrtdi sana. Ketika mencari bilangan prima dalam kode-golf, biasanya menguntungkan untuk (sia-sia) membagi semua jalan hingga n daripada berhenti di sqrt n.
gnibbler

Sangat benar, terima kasih. Saya belum memiliki kesempatan untuk mencoba dan mendapatkan skor yang lebih baik.
skeevey

Anda harus memasukkan skor dalam jawaban Anda
FlipTack

2

Jelly , 2x2 persegi

PÆ
ÆP

Cobalah online!

Saya pikir saya memiliki bagian transposisi yang benar, dan jika demikian, versi transposisi dari ini adalah

PÆ
ÆP

Cobalah online!

(yang merupakan kode yang sama)


4
Ini tidak valid: " Anda dapat menggunakan bahasa apa pun, dan fungsi perpustakaan apa pun kecuali jika satu-satunya tujuan fungsi itu adalah untuk menemukan, menghasilkan, atau mendeteksi bilangan prima . "
Kevin Cruijssen

1

05AB1E , 1x5 1x3 ( 5 3 byte )

Ini bukan satu program besar; setiap baris adalah program alternatif yang terpisah untuk menangani pemeriksaan prima (tanpa menggunakan prime builtin).

ÑPQ
ÒgΘ
ÒQP
ÕαΘ
fQO
fs¢
f`Q

-2 byte terima kasih kepada Grimy .

Ruang putih di antara baris adalah no-ops di 05AB1E, dan karena saya hanya menggunakan perintah 1-byte, ini berfungsi dengan baik setelah transposing.

Keluaran 1/ 0untuk kebenaran / kepalsuan masing-masing.

Coba yang pertama online atau verifikasi beberapa test case lainnya (dengan eval builtin.V ) .
Ditransposisikan: Coba yang pertama online .

Penjelasan:

Ñ    # Get a list of all divisors of the (implicit) input-integer
     # (which would be only 1 and the integer itself for primes)
 P   # Take the product of that list
  Q  # And check if it's equal to the (implicit) input-integer

Ò    # Get a list of all prime factors of the (implicit) input-integer 
 g   # Get the amount of those prime factors by taking the length of the list
  Θ  # Check if that's equal to 1 (so only itself is a prime factor)

Ò    # Get a list of all prime factors of the (implicit) input-integer including duplicates
 Q   # Check for each if it's equal to the (implicit) input-integer
     # (1 if truthy; 0 if falsey)
  P  # Take the product of those checks (resulting in either 1 or 0 as well)

Õ    # Get the Euler totient of the (implicit) input-integer
 α   # Take the absolute difference with the (implicit) input-integer
  Θ  # Check if that's equal to 1

f    # Get a list of all prime factors of the (implicit) input-integer without duplicates
 Q   # Check for each if it's equal to the (implicit) input-integer
  O  # And take the sum of that (resulting in either 1 or 0)

f    # Get a list of all prime factors of the (implicit) input-integer without duplicates
 s   # Swap to get the (implicit) input-integer
  ¢  # And count how many time it occurs in the list

f    # Get a list of all prime factors of the (implicit) input-integer without duplicates
 `   # Dump all the content of this list onto the stack
  Q  # Check if the top two values are equal, or if only a single value is present, it will
     # use the (implicit) input-integer as second value

     # For all these program the same applies at the end:
     # (implicitly output the result with trailing newline)

CATATAN: Jika hanya nilai kebenaran / falsey yang valid, dan itu tidak perlu harus berbeda Òg atau Õαdapat digunakan sebagai 2-byters yang valid, karena hanya 1benar di 05AB1E, dan yang lainnya falsey: Coba keduanya mereka untuk beberapa kasus uji .

Jika bawaan diizinkan, satu saja psudah mencukupi: Cobalah secara online atau verifikasi beberapa kasus uji lagi .


1
ÑPQatau ÒgΘatau ÒQPselama 3 byte. ( Ñdan Òkeduanya memiliki tujuan selain "untuk menemukan, menghasilkan, atau mendeteksi bilangan prima", sehingga mereka tidak termasuk dalam larangan, menurut bacaan saya).
Grimmy

1
Lebih 3-byters: ÕαΘ, fQO, fs¢,f`Q
Grimmy

@ Grim Ah, tidak percaya saya belum memikirkan pembagi atau faktor bawaan. Saya menjawab terlalu cepat, saya kira. Namun, tidak tahu tentang Õα! Itu bagus sekali.
Kevin Cruijssen



0

Ukuran Python 3 , 28 x 28

lambda i:i>1 and           \
all(i%j for j in range(2,i))
ml="""                     "
b("                        "
di"                        "
a%"  
 j   
i    
:f   
io   
>r   
1    
 j   
a    
ni   
dn   
     
 r   
 a   
 n   
 g   
 e   
 (   
 2   
 ,   
 i   
 )   
\)"""

Cobalah online!



0

APL (Dyalog Unicode) , 10x11

{⍵∊∘.×⍨1↓⍳⍵          
           
           
 .          
 ×          
           
 1          
           
           
          }

Cobalah online!

Mengoreksi fungsi untuk memenuhi spesifikasi. Terima kasih @ Adám untuk informasi lebih lanjut.

Mengembalikan 0 untuk truey, 1 untuk falsy .

Bagaimana

{⍵∊∘.×⍨1↓⍳⍵  Dfn. everything below this is a noop up until closing the brace
         ⍳⍵  Range [1..arg]
       1    Dropping the first element (yields [2..arg])
   ∘.×⍨      Multiplication table for each element in the vector
 ⍵∊          Check if the argument is in the table.

Versi yang dialihkan adalah sama persis.

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.