Transponowane, liczby pierwsze, o mój!

15

Zadanie jest proste: twój program odczytuje liczbę całkowitą jako dane wejściowe i drukuje, czy jest liczbą pierwszą, czy nie. Możesz wydrukować „tak / nie”, „prawda / fałsz” lub cokolwiek, co jednoznacznie identyfikuje wynik.

Wyzwanie polega na tym, że kod musi działać z transponowanymi wierszami i kolumnami.

Aby wykluczyć oczywiste rozwiązanie (najkrótsze „proste” rozwiązanie powtarzane pionowo char-by-char za pomocą komentarzy), metryka różni się nieco od zwykłego golfa kodowego:

Ponieważ formatowanie jest bardzo ważne w tym wyzwaniu , rozmiar kodu jest mierzony w obszarze najmniejszego prostokąta, w którym mieści się kod. Innymi słowy, białe spacje się liczą, a linie powinny być wypełnione, aby były równej długości (nie trzeba to zrobić po opublikowaniu rozwiązania, dla uproszczenia). Na przykład

int main()   
{            
    return 0;
}            

miałby rozmiar 4 * 13 = 52 (i oczywiście nie spełnia żadnego z dwóch kryteriów: detekcji pierwotnej i transpozycji).

Najmniejszy rozmiar wygrywa.

Możesz używać dowolnego języka i dowolnej funkcji biblioteki, z wyjątkiem przypadków, gdy jedynym celem tej funkcji jest wyszukiwanie, generowanie lub wykrywanie liczb pierwszych.

Edytować:

Podczas gdy zwycięzcą prawdopodobnie byłoby rozwiązanie Golfscript, przyznam 50 punktów nagrody za najlepsze rozwiązanie C lub C ++!

vsz
źródło
Twoja miara prostokąta nie zniechęca do oczywistego rozwiązania - lepiej byłoby wziąć najdłuższą boczną długość. Zmniejszyłoby to jednak odpowiedź GS do wyniku 4.
stoisko
Masz rację. Następny transponowany problem powinien mieć inną charakterystykę i zabraniać symetrycznych rozwiązań. Myślę jednak, że nawet wtedy będzie ktoś, kto obejdzie reguły lub przynajmniej znajdzie rozwiązanie, którego QA nie spodziewała się podczas tworzenia reguł.
vsz

Odpowiedzi:

7

GolfScript, 13 × 1

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

GolfScript uderza ponownie!

Powtarza dane wejściowe, jeśli jest liczbą pierwszą, w przeciwnym razie drukuje dane wejściowe połączone z najmniejszym właściwym dzielnikiem. Tak, wiem, że to rozszerza definicję „wszystkiego, co jednoznacznie identyfikuje wynik”, ale zrobienie czegoś bardziej wymyślnego kosztowałoby kilka dodatkowych znaków. Jeśli chcesz uzyskać lepszy wynik, dołączenie trzech znaków ;]!do kodu daje 1liczby pierwsze i0 zespolonych.

Algorytm jest naprawdę nieefektywny, wystarczy podział na brutalną próbę od 2 do n- 1. Większość operatorów GolfScript to tylko pojedyncze znaki, więc ten kod działa równie dobrze transponowany. Irytujące jest jednak to, że operator przypisania :nie dopuszcza spacji między sobą a jego celem, więc musiałem to zrobić całkowicie bez zmiennych.

Ilmari Karonen
źródło
Napisz „cokolwiek bardziej wymagającego kosztowałoby kilka dodatkowych znaków” - możesz dostać Boolean w stylu GolfScript za tylko 2.
Peter Taylor
@Peter: Masz na myśli coś takiego jak moja edycja powyżej, tylko bez !? A może miałeś na myśli coś bardziej wyszukanego?
Ilmari Karonen
1
Myślałem )przed tym, ,aby zawsze znajdował dzielnik i =na końcu.
Peter Taylor,
:następnie linią, przenosi na znak nowej linii - więc nie jest to, że spacje nie jest dozwolone, jest to po prostu, że spacje, co zostanie przypisana do
gnibbler
@gnibbler: Technicznie oboje mamy rację. :nie dopuszcza spacji ani niczego innego między sobą a celem: cokolwiek następuje bezpośrednio po nim, czy to spacja, czy jakikolwiek inny token (tak, liczby parzyste, ciągi znaków lub bloki kodu), jest przypisywana. Jednak spacja jest dokładnie tym, o czym oficjalnie ostrzega oficjalna dokumentacja, i to nie bez powodu - ponieważ w większości innych miejsc dodawanie białych znaków między tokenami w GolfScript nic nie robi (normalnie, chyba że jest przypisane do ...).
Ilmari Karonen,
21

C, 2 * 70 2 * 60

Drukuje yna liczbach pierwszych, nic poza tym.
EDYCJA : Zmieniono kod, aby zapisać 10 znaków. Musi być uruchamiany bez parametrów (tak m=1).

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

Metoda obsługi transpozycji jest dość ogólna i można ją zastosować w dowolnym programie.
Polega na konwersji tego:

abcd/*
\\\\*/

Do tego:

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

I oba oznaczają po prostu abcd.

ugoren
źródło
wow, sprytne niewłaściwe użycie konkatenacji linii :)
vsz
2
To jest strona gry w golfa / puzzli. Nie ma czegoś takiego jak niewłaściwe użycie.
stoisko
2
@boothby, myślę, że ma na myśli znęcanie się. Ale nie kłócę się z komplementami.
ugoren
14

C - 13x13

Odczytuje dane wejściowe ze standardowego wejścia i wypisuje wartość „ 1za pierwszą” i „ 0za pierwszą”.

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

edycja: kompiluje się teraz z gcc i clang, inne kompilatory nie były testowane

quasimodo
źródło
12

C, znaki 12x12

Dwuwymiarowe rozwiązanie, w przeciwieństwie do mojej innej odpowiedzi , oparte na tym samym kodzie (i podoba mu się to, że drukuje yza pierwszą, nic za kompozytową).
Struktura jest podobna do odpowiedzi Quasimodo , ale mój kod jest krótszy i myślę, że użycie komemntów jest nieco bardziej wydajne, więc mogę zmieścić 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"); }
ugoren
źródło
7

Perl, 14 x 14

Myślę, że rozumiem. Podaj liczbę jako argument wiersza poleceń, wyniki 0lub 1. Prawdopodobnie więcej miejsca na ulepszenia.

$   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 ~          
tłum
źródło
3

Q

Nadużywane komentarze do symetrycznego, nieefektywnego rozwiązania.

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

Pobiera dane wejściowe ze STDIN, zwraca wartość logiczną.

skeevey
źródło
Zauważyłem sqrttam. Szukając liczb pierwszych w golfie kodowym, zwykle korzystne jest (nieekonomiczne) dzielenie się do n zamiast zatrzymywania się na sqrt n.
gnibbler 10.10.12
Bardzo prawda, dzięki. Nie miałem jeszcze okazji spróbować uzyskać lepszego wyniku.
skeevey 10.10.12
Do odpowiedzi należy dołączyć wynik
FlipTack
2

Galareta , kwadrat 2x2

PÆ
ÆP

Wypróbuj online!

Myślę, że mam poprawną część transpozycji, a jeśli tak, to transponowana wersja jest

PÆ
ÆP

Wypróbuj online!

(który jest tym samym kodem)

Cairney Coheringaahing
źródło
4
To jest nieprawidłowy: „ Można użyć dowolnego języka i żadnych funkcji biblioteki wyjątkiem sytuacji, gdy jedynym celem tej funkcji jest znalezienie, generować lub wykryć liczb pierwszych .
Kevin Cruijssen
1

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

To nie jest jeden duży program; każda linia jest oddzielnym alternatywnym programem do sprawdzania liczby pierwszych (bez użycia wbudowanej liczby pierwszej).

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

-2 bajty dzięki Grimy .

Białe spacje między wierszami nie występują w 05AB1E, a ponieważ używam tylko poleceń 1-bajtowych, działa to dobrze po transpozycji.

Wyjścia 1/ odpowiednio 0dla truey / falsey.

Wypróbuj pierwszy online lub sprawdź kilka innych przypadków testowych dla wszystkich (z wbudowanym eval .V) .
Transponowano: Wypróbuj pierwszy online .

Wyjaśnienie:

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

UWAGA: Jeśli tylko wartość prawda / falsey jest prawidłowa i nie musi być ona odrębna, albo Ògalbo Õαmoże być użyta jako ważna 2-bajtowa, ponieważ tylko 1prawda jest w 05AB1E, a wszystko inne jest falsey: Wypróbuj oba dla niektórych przypadków testowych .

Gdyby wbudowane były dozwolone, wystarczyłoby jedno p: Wypróbuj online lub sprawdź więcej przypadków testowych .

Kevin Cruijssen
źródło
1
ÑPQlub ÒgΘlub ÒQPdla 3 bajtów. ( Ñi Òoba mają inne cele niż „znajdowanie, generowanie lub wykrywanie liczb pierwszych”, więc według mojego czytania nie są one objęte zakazem).
Grimmy,
1
Inne 3-byters: ÕαΘ, fQO, fs¢,f`Q
Grimmy
@Grimy Ach, nie mogę uwierzyć, że nie myślałem o dzielnikach lub wbudowanych czynnikach pierwszorzędnych .. Chyba odpowiedziałem zbyt szybko. ÕαJednak nie wiedziałem o tym ! To całkiem niezłe.
Kevin Cruijssen
0

dzaima / APL, 8 × 9 = 72

{t0,1↓⍳⍵
 ←⍵∊∘.×⍨t
 0      
 ,∘      
 1.      
 ↓×      
 ⍳⍨      
 t     }

Wypróbuj oryginał lub transponuj !

dzaima
źródło
0

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

Wypróbuj online!

Joel
źródło
0

JavaScript (Node.js) , 26 25x5

n=>!( P/**//*-
= * P =* /** -         r 
>**/= r=>n%--r?P(r):~-r)(
/*////=  %  *        /*/n
*1 )//>*/   /        *//)

Wypróbuj online!

Transponowano:

n=>/*
= **1
>**/ 
! //)
(P=//
   //
P=r=>
/*= *
* > /
*/n% 
/*%  
/*-  
* -*/
--r  
  ?  
  P  
  (  
  r  
  )  
  :  
  ~  
  -/*
  r*/
 r)//
  (n)

Wypróbuj online!

Shieru Asakoto
źródło
0

APL (Dyalog Unicode) , 10x11

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

Wypróbuj online!

Poprawiono funkcję zgodną ze specyfikacjami. Dzięki @ Adám za heads-up.

Zwraca 0 za prawda, 1 za fałsz .

W jaki sposób

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

Wersja transponowana jest dokładnie taka sama.

J. Sallé
źródło