Pierwsza i ostatnia liczba pierwsza z pierwszymi cyframi zakresu

12

Wyzwanie

Dla danego dodatniego zakresu liczb całkowitych znajdź pierwszą i ostatnią liczbę pierwszą w całości złożoną z cyfr liczby pierwszej, wyjątkowo zawierającą 0 (dla cyfr zakres 0-2 powinien dać wynik 2-2). Zakres obejmuje. Jeśli nie zostanie znaleziona żadna liczba, oczekiwany wynik to 0. Jeśli istnieje tylko jeden taki numer, oczekiwanym wynikiem jest ta liczba dwa razy.

Przykłady

  • Dla zakresu 1–100 pierwsza liczba pierwsza to 2, a ostatnia to 73 (7 i 3 to liczby pierwsze).
  • Dla zakresu 70–80 pierwsza liczba pierwsza to 73, a ostatnia także 73 (ponieważ w podanym zakresie jest tylko jedna poprawna liczba, zwracamy ją dwa razy).
  • Dla zakresu 190–200 nie ma poprawnej odpowiedzi, więc zwracasz 0.
  • Dla zakresu 2000–2100 pierwsza liczba pierwsza to 2003, a ostatnia to 2053 (pomijamy cyfrę 0, ale wszystkie pozostałe cyfry są liczbą pierwszą)

To jest , więc wygrywa najkrótszy kod w bajtach!

Obowiązują wszystkie standardowe luki.

Wejście

  • Możesz przyjąć dwie liczby całkowite jako dane wejściowe, jednak możesz zobaczyć dopasowanie, stos, argument (y) funkcji, argument CLI, stdin.
  • Państwo musi otrzymać tylko dwie liczby całkowite.

Wynik

  • Państwo musi też zwrócić wynik (krotki, tablicą, multi-powrót, jeśli obsługuje języki IT), pozostawić go na stosie, albo je wydrukować (w tym przypadku muszą być one oddzielone jakoś).
  • Kolejność wyjść nie ma znaczenia.
  • Dozwolone są nawiasy początkowe / końcowe i znaki nowej linii.
  • Musisz zwrócić dwie liczby, jeśli istnieje odpowiedź, nawet jeśli są takie same.
  • Musisz zwrócić 0, jeśli nie ma odpowiedzi.
LamaDelRay
źródło
Dla pewności, jeśli zwracam listę liczb całkowitych, gdy są odpowiedzi, mogę zwrócić listę zawierającą tylko 0, gdy nie ma odpowiedzi? Nie muszę wracać 0zamiast [0]?
Οurous

Odpowiedzi:

5

Perl 6, 105 94 90 86 bajtów

{my @b=grep {is-prime all($_,|.comb>>.Int Xor 2)},$^a..$^b;say @b??"@b[0] @b[*-1]"!!0}
Ven
źródło
4

JavaScript (ES6), 83 bajty

Przyjmuje zakres [ab] w składni curry (a)(b). Zwraca tablicę 2-elementową lub 0 .

n=>g=(m,a=0)=>n>m?a:g(m-1,(P=d=>m%--d?P(d):d>1|/[14689]/.test(m))(m)?a:[m,a[1]||m])

Przypadki testowe

Arnauld
źródło
4

Mathematica, 91 bajtów

If[(s=Select[Range@##,(p=PrimeQ)@#&&And@@((p@#||#<1)&/@IntegerDigits@#)&])!={},MinMax@s,0]&

Wypróbuj online!

J42161217
źródło
3

Galaretka , 14 bajtów

æRµDo2ÆPẠµÐf.ị

Wypróbuj online!

Jak to działa

æRµDo2ÆPẠµÐf.ị ~ Pełny program.

æR ~ Inclusive prime range.
  µ µÐf ~ Zachowaj tylko te, które spełniają warunek.
   Do2ÆPẠ ~ Warunek filtra:
   D ~ Cyfry dziesiętne bieżącego numeru.
    o2 ~ Logiczne lub z 2 (odwzorowuje 0 na 2 i dowolną inną cyfrę do siebie).
      ÆP ~ Czy liczba pierwsza (pod względem elementu)?
        Ạ ~ Sprawdź, czy wszystkie cyfry spełniają warunek.
            .ị ~ Uzyskaj element o indeksie modułowym 0,5. Trochę szczegółów:
                 ~ Galaretka ma indeks 1, więc 1 daje nam pierwszy element, a 0
                   daje nam ostatni element.
                 ~ Jeśli sufit i podłoga podanego numeru N nie pasują, 
                   następnie Galaretka zwraca przedmioty według indeksów floor (N) i Ceil (N).
                 ~ Jeśli lista jest pusta, to daje 0, stąd jest to bardzo wygodne.

Jeśli pozwolenie na cały zakres byłoby dozwolone (choć myślę, że nie powinno tak być), to 12 bajtów:

Do2,ÆPȦµÐf.ị

Wypróbuj online!

Pan Xcoder
źródło
13 bajtów Chociaż nie jest bardzo podobny. Czy powinienem to po prostu opublikować? Możesz go wziąć, jeśli chcesz, ale daj mi znać, jeśli zamierzasz zachować rozwiązanie.
dylnan
OP mówi For a given positive integers range. Poproszę o wyjaśnienie
dylnan
@dylnan pamiętaj, że twoja wersja jest jednak nieprawidłowa ( 0jest wyjątkiem od wyzwania, ponieważ z jakiegoś powodu powinna być traktowana jako liczba pierwsza). W każdym razie opublikowałem krótszą i
ważniejszą
Och, myślałem, że zasada 0 jest zmieniona
dylnan
3

Brachylog , 16 bajtów

⟦₂{ṗṗᵐ}ˢ⟨⌋≡⌉⟩|∧0

Wypróbuj online!

Zupełnie bezsensowne „return 0 if no be prime” powoduje, że tracimy 3 bajty ( |∧0) bez powodu (powróciłoby false., gdybyśmy ich nie dodali)

Wyjaśnienie

⟦₂                Range from the smallest element of the input to the biggest
  {   }ˢ          Select on that range:
   ṗ                Numbers that are primes
    ṗᵐ              And whose digits are primes
        ⟨   ⟩     Fork on this new list:
         ⌋          Minimum
           ⌉        maximum
          ≡         Do nothing and return [Minimum, Maximum]
             |∧0  If all of this fails (i.e. the list after selection is empty), return 0
Fatalizować
źródło
Niepoprawny, ponieważ nie obsługuje cyfry 0 jako liczby pierwszej (jak określono w wyzwaniu). Tak więc nie udaje się[2000, 2100]
Pan Xcoder,
3

Pyth , 24 bajty

Zastosowanie mojego początkowego podejścia okazuje się krótsze.

.x,eKfP#I_M-+TjT;0}EQhKZ

Wypróbuj tutaj!

(Właśnie aktualizowałem do 23, ale Steven mnie pobił )

?KfP#I_M-+TjT;0}FQhM_BK0

Wypróbuj tutaj!

Naturalnie hM_BKmożna go zastąpić ,hKeK.

25 bajtów

.x,eKf.AmP_|d2+TjT;}EQhKZ

Wypróbuj tutaj!

26 bajtów

|>2.<f.AmP_|d2+TjT;*2}EQ1Z

Wypróbuj tutaj!

|>2.<fP#I_M|R2+TjT;*2}EQ1Z

Wypróbuj tutaj!


Jak oni pracują

.x,eKfP#I_M-+TjT;0}EQhKZ ~ Full program. Q, E = first, second inputs

.x                     Z ~ Try-catch block. If the code errors, output 0.
     f            }EQ    ~ Filter the range [E ... Q] for (uses a variable T):
            +TjT;          ~ Append T to the list of its digits.
           -     0         ~ Remove the zeros.
         _M                ~ Multiply each by -1 (for primality testing).
        I                  ~ Check if the result is invariant over...
      P#                   ~ Removing non-prime items.
    K                    ~ Assigned the filtered range to a variable K.
  ,e                     ~ Pair the last element of K with...
                     hK  ~ Its first element.

|>2.<f.AmP_|d2+TjT;*2}EQ1Z ~ Full program.

                   *2}EQ   ~ Inclusive range, repeated twice..
     f                     ~ Filter, using T as the current number.
                jT;        ~ Base-10 digits of T.
              +T           ~ Concatenated with T.
        mP_|d2             ~ Prime check after performing OR 2 (makes 0 be treated as prime)
      .A                   ~ Do all satisfy this condition?
   .<                   1  ~ Rotate by one place cyclically to the left.
 >2                        ~ Last two elements (ignored if there aren't enough)
|                        Z ~ Logical or with 0.
Pan Xcoder
źródło
Ten nie zwraca dwóch wystąpień [73] w przypadku testowym [70, 80].
Steven H.,
Przegapił cię z powrotem o 1, teraz o 25.
Steven H.
@StevenH. Przegapił cię z powrotem o 1, teraz o 24.
Mr. Xcoder,
Zawody stają się intensywne ... w wieku 23 lat!
Steven H.,
2

Mathematica 85 bajtów

Wiem, że istnieje już podobna odpowiedź, ale podejście tutaj jest zupełnie inne.

MinMax@Cases[Range@##,x_/;PrimeQ@x&&DisjointQ@@IntegerDigits/@{x,14689}]/.{_,∞}->0&

Ta 83-znakowa odpowiedź zostanie wklejona i uruchomiona w Mathematica. Witryna TIO nie wie, jak interpretować ∞.

Kelly Lowder
źródło
2

Galaretka , 14 bajtów

Do2ÆPẠ
æRÇÐf.ị

Wypróbuj online!

æRÇÐf.ị            Main link
æR                 Prime range
   Ðf              Filter the range with...
  Ç                The helper link
      ị            At index (decimal, returns [xs[floor], xs[ceil]], otherwise 0)
     .             0.5

Do2ÆPẠ             Helper link
D                  For each decimal
 o2                Replace 0s with 2s, an actual prime prime (could be 3, 5, or 7).
   ÆP              Filter primes (1 if true, 0 if false)
     Ạ             Check if all are true

Dzięki Erikowi Outgolfer za pomoc w naprawieniu błędu. Dzięki panu Xcoderowi za .ịpodstęp.

Ven
źródło
Czy będzie ṙ-ḣ2działać, aby Ḣ,Ṫto naprawić (być może trzeba będzie trochę zmodyfikować)?
Zacharý
@ Zacharý, który podaje dane wyjściowe w niewłaściwej kolejności. I to nie działa: \
Ven
@ Mr.Xcoder Pokój Jelly doprowadził mnie do tego samego rozwiązania. Dzięki!
Ven
.ị może również działać (rodzaj skradziony od pana XCodera)
Zacharý
Masz rację! To miłe.
Ven
1

Rubinowy , 87 bajtów

->a,b{(z=(a..b).select{|x|(2...x).none?{|r|x%r<1}&&/[14689]/!~"%d"%x})[0]?(z.minmax):0}

Wypróbuj online!

GB
źródło
1

Perl 6 ,  68 66 65 61  58 bajtów

{($_=($^a..$^b).grep({.is-prime&&/^<[02357]>+$/})[0,*-1])[1]??$_!!0}

Spróbuj

{($_=($^a..$^b).grep({.is-prime&&!/<[14689]>/})[0,*-1])[1]??$_!!0}

Spróbuj

{($_=($^a..$^b).grep({.is-prime*!/<[14689]>/})[0,*-1])[1]??$_!!0}

Spróbuj

{($_=($^a..$^b).grep({.is-prime*!/<[14689]>/}))??.[0,*-1]!!0}

Spróbuj

{($_=grep {.is-prime*!/<[14689]>/},$^a..$^b)??.[0,*-1]!!0}

Spróbuj

Rozszerzony:

{  # bare block lambda with two placeholder parameters 「$a」 and 「$b」

  (
    $_ =  # store the list in 「$_」 for later use

      grep {
          .is-prime

        *              # True * True == 1 (all others equal 0)

          !/<[14689]>/ # doesn't contain a non-prime other than 0
      },

      $^a .. $^b       # inclusive Range

  )            # is the list Truish (not empty)
  ?? .[0,*-1]  # if so output the first and last values (from 「$_」)
  !! 0         # otherwise return 0
}
Brad Gilbert b2gills
źródło
1

Java 8, 165 164 bajtów

(a,b)->{for(;a<=b&!p(a);a++);for(;b>a&!p(b);b--);return a>b?"0":a+" "+b;}boolean p(int n){int N=n,i=2;for(;i<N;N=N%i++<1?0:N);return(n+"").matches("[02357]+")&N>1;}

Wyjaśnienie:

Wypróbuj tutaj.

(a,b)->{            // Method with two integer parameters and String return-type
                    //  (Input `a` is the lowest input, input `b` is the highest input)
  for(;a<=b         //  Increase `a` as long as it's smaller than or equal to `b`,
       &!p(a);a++); //   and it's not a prime, and not all of its digits are prime-digits
  for(;b>a          //  Decrease `b` as long as it's larger than `a`,
       &!p(b);b--); //   and it's not a prime, and not all of its digits are prime-digits
  return a>b?       //  If `a` is now larger than `b`:
    "0"             //   Return 0, because nothing is found
   :                //  Else:
    a+" "+b;}       //   Return the resulting `a` and `b`

boolean p(int n){int N=n,i=2;for(;i<N;N=N%i++<1?0:N);return(n+"").matches("[02357]+")&N>1;}
                    // Separate method that returns whether the input integer is a prime,
                    //  and all of its digits are also primes (or 0)
Kevin Cruijssen
źródło
1

Czysty , 142 131 125 bajtów

import StdEnv
@a b#l=[n\\n<-[a..b]|and[gcd p n<2&&or[c==k\\k<-:"02357"]\\p<-[1..n-1],c<-:toString n]]
|l>[]=[hd l,last l]=[0]

Nie golfowany:

import StdEnv
fn start finish
    # primes
        = [ n
            \\
            n <- [start..finish]
            | and [ gcd p n == 1 && isMember c ['0','2','3','5','7'] 
                \\
                p <- [1..n-1],
                c <-: toString n
            ]
        ]
    | isEmpty primes
        = [0]
    = [hd primes, last primes]

Wypróbuj online!

Obrzydliwe
źródło
1

Pyth, 28 25 23 bajtów

.xhM_BfP#I_M #+TjT;}FQ0

Zestaw testowy. Zwraca [2003,2053] dla ostatniego przypadku testowego, ponieważ 2053 jest liczbą pierwszą.

Steven H.
źródło
Haha, nieważne. Zwraca [0, 0]zamiast0
Mr. Xcoder,
Ach, strzelaj. Naprawię to.
Steven H.,
@ Mr.Xcoder Naprawiono!
Steven H.,
Cholera, właśnie aktualizowałem też 23
Mr. Xcoder,
Myślałem, że powiedziałeś, że idziesz spać ... Oszukałeś: P
Steven H.