Transpoze, asallar, oh benim!


15

Görev basittir: programınız bir tamsayıyı girdi olarak okur ve asal olup olmadığını yazdırır. "Evet / hayır", "doğru / yanlış" veya sonucu kesin olarak tanımlayan her şeyi yazdırabilirsiniz.

Zor olan, kodun transpoze edilen satır ve sütunlarıyla çalışması gerektiğidir.

Açık çözümü (yorumların kullanımı ile dikey olarak char-by-char tekrarlanan en kısa "basit" çözüm) hariç tutmak için, metrik normal kod golfünden biraz farklıdır:

Biçimlendirme bu zorlukta çok önemli olduğundan , kod boyutu kodun sığdığı en küçük dikdörtgen alanında ölçülür. Başka bir deyişle, boşluk sayılır ve satırlar eşit uzunlukta olacak şekilde doldurulmalıdır ( basitlik uğruna, çözümü yüklerken bunu yapmak zorunda). Örneğin

int main()   
{            
    return 0;
}            

4 * 13 = 52 boyutunda olurdu (ve açıkçası iki kritere de uymuyor: prime algılama ve transposable.)

En küçük boyut kazanır.

Bu işlevin tek amacı asal sayıları bulmak, oluşturmak veya tespit etmek dışında herhangi bir dili ve herhangi bir kütüphane işlevini kullanabilirsiniz.

Düzenle:

Kazanan muhtemelen Golfscript çözümü olsa da, en iyi C veya C ++ çözümü için 50 puan ödül kazanacağım!


Dikdörtgen metriğiniz bariz çözümü caydırmıyor - en uzun sidel uzunluğunu almak daha iyi olur. Gerçi, bu skor 4. sahip GS cevabını azaltacak
Boothby

Haklısın. Bir sonraki aktarılan sorun farklı bir metrik ve yasak simetrik çözümlere sahip olmalıdır. Ancak o zaman bile kuralları aşan ya da en azından KG'nin kuralları oluştururken beklemediği bir çözüm bulan biri olacağını düşünüyorum.
vsz

Yanıtlar:


7

GolfScript, 13 × 1

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

GolfScript tekrar saldırıyor!

Asalsa girişi tekrarlar, aksi takdirde girişi en küçük uygun böleniyle birleştirilmiş olarak yazdırır. Evet, bunun "sonucu kesin olarak tanımlayan herhangi bir şey" tanımını genişlettiğini biliyorum, ancak meraklı bir şey yapmak birkaç ekstra karaktere mal olacak. Daha iyi bir çıktı istiyorsanız, üç karakteri ;]!koda eklemek 1asal sayıları ve 0bileşik sayıları verir.

Algoritma gerçekten verimsiz, sadece kaba kuvvet deneme bölümü 2'den n −1'e. Çoğu GolfScript operatörü yalnızca tek karakterdir, bu nedenle bu kod aktarılmış olduğu gibi çalışır. Rahatsız edici olsa da, atama operatörü :kendisi ve hedefi arasında boşluk bırakmaz, bu yüzden bunu tamamen değişkenler olmadan yapmak zorunda kaldım.


Wrt "meraklısı bir kaç ekstra karakter mal olacak" - sadece 2 için GolfScript tarzı bir Boolean alabilirsiniz
Peter Peter

@Peter: Yukarıdaki düzenlemem gibi bir şey mi kastediyorsun, sadece !? Yoksa aklınızdaki bir şey var mı?
Ilmari Karonen

1
Daha )önce ,her zaman bir bölen ve =sonunda bulacağını düşünüyordum .
Peter Taylor

:ardından newline, newline karakterine atar - bu yüzden boşluklara izin verilmez, sadece boşluk atanır
gnibbler

@gnibbler: Teknik olarak ikimiz de haklıyız. kendisi ve hedefi arasında :boşluk veya başka bir şeye izin vermez : hemen ardından gelen, boşluk veya başka bir belirteç olsun (evet, hatta sayılar, dizeler veya kod blokları), atanan şeydir. Bununla birlikte, boşluk resmi belgelerin özellikle uyardığı ve iyi bir nedenden ötürü - çünkü çoğu başka yerde, GolfScript'te jetonlar arasına boşluk eklemek hiçbir şey yapmaz (normalde, atanmamışsa ...).
Ilmari Karonen

21

C, 2 * 70 2 * 60

yAsal baskılar , başka bir şey yok.
EDIT : 10 karakter kaydetmek için kod değiştirildi. Parametre olmadan çalıştırılmalıdır (yani m=1).

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

Transpozisyonu ele alma yöntemi oldukça geneldir ve herhangi bir programa uygulanabilir.
Bunu dönüştürmeye dayanır:

abcd/*
\\\\*/

Buna:

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

Ve her ikisi de basitçe abcd.


vay, çizgi bitiştirmenin zekice kötüye kullanılması :)
vsz

2
Bu bir golf / bulmaca sitesidir. Yanlış kullanım diye bir şey yoktur.
boothby

2
@ boothby, sanırım taciz demek. Ama iltifatlarla tartışmıyorum.
ugoren

14

C - 13x13

Stdin'den girişi okur ve 1asal için a ve asal 0olmayan için a yazdırır .

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

edit: gcc ve clang ile derler, diğer derleyiciler test edilmedi


12

C, 12x12 karakter

Diğer cevabımın aksine , aynı koda dayalı iki boyutlu bir çözüm (ve bunun gibi, yasal için baskı , kompozit için hiçbir şey).
Yapı Quasimodo'nun cevabına benzer , ancak kodum daha kısadır ve bence komutanlarımın kullanımı biraz daha verimli, bu yüzden 12x12 sığabilirim.

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

Sanırım bunun asısını alıyorum. Sayıyı komut satırı bağımsız değişkeni olarak belirtin, çıktılar0 veya1 . Muhtemelen daha fazla alan.

$   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

S

Simetrik, karakter verimsiz bir çözüm için kötüye yorumlar.

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

STDIN'den girdi alır, bir boole döndürür.


sqrtOrada fark ettim . Kod golfünde primer ararken, n (sqrt n) 'de durmak yerine n'ye kadar (atık) bölmek genellikle avantajlıdır.
gnibbler

Çok doğru, teşekkürler. Henüz daha iyi bir puan alma şansım olmadı.
skeevey

Cevabınıza bir puan
eklemelisiniz


1

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

Bu büyük bir program değil; her bir hat, prime kontrolünü ele almak için ayrı bir alternatif programdır (prime yerleşikini kullanmadan).

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

Grimy sayesinde -2 bayt .

05AB1E'de satırlar arasındaki boşluklar op-op değildir ve yalnızca 1 baytlık komutları kullandığım için, bu, transpozisyondan sonra iyi çalışır.

Çıktılar 1/0 sırasıyla doğruluk / falsey için.

İlkini çevrimiçi deneyin veya hepsi için daha fazla test vakası doğrulayın (eval builtin ile .V) .
Aktarılmış: İlkini çevrimiçi deneyin .

Açıklama:

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

NOT: Sadece bir truthy / Falsey değeri geçerli olduğunu ve farklı olmak için gerekli vardır değil, ya olursa Ògveya Õαsadece beri geçerli 2-byters olarak kullanılabilir 105AB1E içinde truthy olduğunu ve her şey Falsey geçerli: her ikisini de deneyin bazı test senaryoları için .

Yerleşiklere izin verilmiş polsaydı, tek bir kişi yeterli olurdu: Çevrimiçi deneyin veya daha fazla test vakası doğrulayın .


1
ÑPQveya ÒgΘveya ÒQP3 bayt için. ( Ñve Òher ikisinin de “asalları bulmak, üretmek veya tespit etmek” dışında amaçları vardır, bu yüzden okumamla yasağa dahil edilmezler).
Grimmy

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

@Grimy Ah, bölücüler veya asal faktör yerleşikleri düşünmediğime inanamıyorum .. Sanırım çok hızlı cevap verdim. ÕαYine de bilmiyordum ! Oldukça hoş biri.
Kevin Cruijssen





0

APL (Dyalog Unicode) , 10x11

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

Çevrimiçi deneyin!

İşlev spesifikasyonlara uyması için düzeltildi. Head-up için teşekkürler Adám.

İade falsy için truthy için 0, 1 .

Nasıl

{⍵∊∘.×⍨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.

Aktarılan sürüm tamamen aynıdır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.