Wyzwanie liczb całkowitych ujemnego rzędu, ale jest to Prime Time!

12

Mówię o tym pytaniu , spójrz na to, jeśli jesteś trochę zdezorientowany.

Główne zadanie

Twoim zadaniem jest wyprowadzanie skonkatowanych liczb całkowitych w malejącej kolejności, ale zwiększanie maksymalnej liczby całkowitej za każdym razem, gdy trafisz 1 (w tym pytaniu 1 będzie uważana za liczbę pierwszą) . Chociaż nie brzmi to inaczej niż w pierwszym pytaniu, nadchodzi trudna część: wszystkie wyprowadzane liczby mogą być tylko liczbami pierwszymi . Zostaną one połączone razem w jeden ciąg bez spacji i znaków nowej linii. Twój wkład będzie również liczbą pierwszą .

Przykład:

1
21
321
5321
75321
1175321
Valid output:
1213215321753211175321

Wejście

Twój kod może przyjąć tylko jeden wpis: najwyższą liczbę pierwszą do wydrukowania. Dane wejściowe mogą pochodzić z dowolnego miejsca (grafika, STDIN). Masz pewność, że wejście jest liczbą pierwszą.

Wynik

Będziesz musiał podać wynikową liczbę. Możesz uzyskać ten numer, odliczając w dół, policz tylko liczbę, jeśli jest liczbą pierwszą, a następnie połącz wszystkie wyniki razem w jedną liczbę. Ostatni „wiersz” (np. 7, 5, 3, 2, 1) Musi zostać wydrukowany w całości. Wynik może być dowolny (liczby, ciągi, grafika), o ile jest czytelny. Obowiązuje ten sam wzorzec Regex do sprawdzania przypadków testowych:

^(\D*(\d)+\D*|)$

Jeśli dane wyjściowe nie są zgodne z tym wzorcem, kod jest nieprawidłowy.

Zasady

  • Dane wejściowe są zapewnione jako pierwsze, nie obejmują obsługi błędów, chyba że chcesz / potrzebujesz.
  • Wyjście może być tylko liczbą w pełni połączoną, dlatego nie może być podzielone według niczego, nawet nowych linii.
  • Algorytm nie powinien sprawdzać pierwszego wystąpienia N(na przykład 17in 1175321), ale raczej pierwszego wystąpienia Njako rzeczywistej liczby.
  • Twój wkład jest pewny, że jest pozytywny, nie dodawaj obsługi, chyba że chcesz / potrzebujesz.

Przypadki testowe

Input: -2, 0
Output: Any, or none (number isn't positive)

Input: 9
Output: Any, or none (number isn't prime)

Input: 1
Output: 1

Input: 7
Output: 121321532175321

Input: 23
Output: 1213215321753211175321131175321171311753211917131175321231917131175321

Zwycięzca

To jest , więc autor kodu o najmniejszej długości w bajtach wygrywa!

devRicher
źródło
8
Nie będę sugerować zmiany wyzwania, ale nie sądzę, że 1jest to liczba pierwsza z definicji.
Erik the Outgolfer,
3
1. Posiadanie przypadku testowego jest 1bezpośrednio sprzeczne ze specyfikacją, która „ zapewnia ”, że liczba wejściowa będzie liczbą pierwszą. 2. Specyfikacja wyjściowa wydaje się zawierać wiele sprzeczności i dwuznaczności. „ Ostatni wiersz„ wiersza ”(np. 7, 5, 3, 2, 1) musi być wydrukowany w całości ” - więc inni nie? „ Stosuje się ten sam wzorzec Regex do sprawdzania przypadków testowych ”, ale „ Dane wyjściowe mogą być tylko połączonymi liczbami, a zatem nie mogą być podzielone na nic ”, jest sprzeczne z tym wyrażeniem regularnym. Ale wyrażenie regularne i tak jest wyraźnie niejasne, ponieważ pozwala na pusty ciąg i nie ma danych wejściowych, które mogłyby to dać.
Peter Taylor,
1
1. „ Pojedynczy znak nowej linii jest dozwolony. ” Jest redundantny / niezgodny ze wzorem wyrażeń regularnych, który pozwala na dowolną liczbę znaków końca . 2. Zdanie wprowadzające „ Twoim zadaniem jest wyprowadzanie liczb całkowitych ” jest mylące, ponieważ później poprosisz o podanie pojedynczej liczby. 3. Całe wyjaśnienie sekwencji i wyniku jest mylące - ludzie w zasadzie muszą ponownie przeanalizować, co masz na myśli, studiując przykłady (lista sekwencji i przypadki testowe). Ostatnie wyzwanie miało również te problemy, a ja rozwiązałem je tam w sugerowanej edycji, którą odrzuciłeś ... :(
smls,
5
Jaki jest sens arbitralnego uczynienia 1 liczbą pierwszą?
Xanderhall,
1
Wyzwanie liczb całkowitych ujemnego rzędu, ale za każdym razem, gdy jest liczbą pierwszą, staje się szybsze;)
SplittyDev

Odpowiedzi:

5

Galaretka , 9 bajtów

ÆR1;;\UFV

Wypróbuj online!

Jak to działa

ÆR1;;\UFV  Main link. Argument: n

ÆR         Prime range; yield all primes up to n.
  1;       Prepend the "prime" 1.
    ;\     Cumulative concatenation; yield all prefixes of the prime range.
      U    Upend; reverse each prefix.
       F   Flatten the resulting 2D array.
        V  Eval. This casts the integer array to string first, thus concatenating
           the integers.
Dennis
źródło
Wiem, że jestem zbyt głęboko w nauce gry w golfa, kiedy czytam Galaretkę, aby zrozumieć pytanie, a nie na odwrót. (W rzeczywistości jest to dość czytelny program Jelly; jedynym mylącym punktem dla mnie był dziwny szczególny przypadek Vna liście.)
5

Przetwarzanie, 161 bajtów

int p(int n){for(int k=1;++k<=sqrt(n);)if(n%k<1)return 0;return 1;}void t(int n){for(int i=1,j;i<=n;i++){if(p(i)<1)continue;for(j=i;j>0;j--)print(p(j)<1?"":j);}}

Jedna funkcja sprawdza pierwotność, druga drukuje. Nazwij tot(7)

Nie golfił

Pierwsza funkcja sprawdza pierwotność. Zwraca intzamiast zamiast, booleanponieważ w ten sposób zapisywanych jest więcej bajtów. ( intzamiast boolean, 0zamiast false, 1zamiast true)

int Q103891p(int n){
  for(int k=1;++k<=sqrt(n);)
    if(n%k<1)return 0;
  return 1;
}

Druga funkcja drukuje ciąg. Powtarza każdą liczbę, jeśli nie jest liczbą pierwszą, przejdź do następnej iteracji. Jeśli jest liczbą pierwszą, kontynuuje drukowanie w kolejnej forpętli. Ponownie, jeśli liczba jest liczbą pierwszą, wówczas drukujemy ją, w przeciwnym razie nie.

void Q103891(int n){
  for(int i=1,j;i<=n;i++){
    if(p(i)<1)continue;
    for(j=i;j>0;j--)
      print(p(j)<1?"":j);
  }
}
user41805
źródło
5

Galaretka , 12 bajtów

ÆR;@1
ÇÇ€UVV

Wypróbuj online!

Gdyby nie było 1wcale, mój kod byłby po prostu ÆRÆRUVVdla 7 bajtów.

Ulepszone wyjaśnienie:

ÇÇ€UVV Main link. Arguments: z.
Ç      Run link1 on z.
 ǀ    Run link1 on z's elements.
   U   Reverse z's elements.
    V  Flatten z.
     V Concatenate z's elements.

ÆR;@1 Link 1. Arguments: z.
ÆR    Range of primes [2..z].
    1 Integer: 1.
  ;@  Concatenate x to y.

Irlandczyk (zwany Dennis?) Jakoś obezwładnił mnie lol.

Erik the Outgolfer
źródło
4

05AB1E , 19 bajtów

LDpÏX¸ì€Lí˜ÐXQsp+ÏJ

Wypróbuj online!

Wyjaśnienie

L                     # range [1 ... input]
 DpÏ                  # keep only primes
    X¸ì               # prepend a 1
       €L             # map: range [1 ... n]
         í            # reverse each sublist
          ˜           # flatten list to 1D
           Ð          # triplicate
            XQ        # check elements in one copy for equality with 1
              sp      # check elements in one copy for primality
                +     # add the above lists giving a list with true values at indices
                      # comtaining 1 or a prime
                 Ï    # keep only those elements of the unmodified copy of the list
                  J   # join
Emigna
źródło
Zaskoczony tym DpÏoświadczeniem. Dobra robota!
devRicher
2

Brachylog , 17 bajtów

y:{e1|e#p}f@[rcw\

Wypróbuj online!

Wydaje się, że nie może być krótszy ...

Wyjaśnienie

y                      The list [0, ..., Input]
 :{      }f            Find all...
   e1                     ...elements that are 1 (there is 1)...
     |                    ...or...
      e#p                 ...elements that are prime...
           @[          Take a prefix of the result
             rc        Reverse it and concatenate it into a number
               w       Write to STDOUT
                  \    Backtrack: try another prefix
Fatalizować
źródło
2

GameMaker Language, 169 bajtów

Główna funkcja (68 bajtów)

b=""for(i=1;i<=argument0;i++){c=i while(j)b+=string(p(c--))}return b

Funkcja p (46 bajtów)

for(a=0;a<argument0;a++)while q(++b){}return b

Funkcja q (55 bajtów)

n=argument0 for(i=2;i<n;i++)if!(n mod i)p=1return p|n=1
Timtech
źródło
Fajnie, ktoś, kto używa GML
FireCubez
@FireCubez Dzięki :) Często go używałem. To był właściwie pierwszy język programowania, którego się nauczyłem.
Timtech,
1

MATL , 15 bajtów

Zq"1@ZqP]1v!VXz

Wypróbuj online!

Zq      % Implicit input. Push array of primes up to that value
"       % For each prime in that array
  1     %   Push 1
  @     %   Push current prime
  Zq    %   Push array of primes up to that
  P     %   Reverse
]       % End
1       % Push 1
&h      % Concatenate all stack horizontally
V       % Convert to string
Xz      % Remove spaces. Implicit display
Luis Mendo
źródło
1

Perl 6 , 41 bajtów

{[~] flat [\R,] 1,|grep *.is-prime,2..$_}

( Wypróbuj online. )

Wyjaśnienie:

  • 1, |grep(*.is-prime, 2..$_): Sekwencja 1 i liczb pierwszych ... (1 2 3 5)
  • [,] ...: Zmniejsz („złóż”) nad przecinkiem ... (1 2 3 5)
  • [\,] ...: Z wynikami pośrednimi ( zmniejszenie trójkątne ) ...((1) (1 2) (1 2 3) (1 2 3 5))
  • [\R,] ...: Zastosuj odwracającego metaoperatora do przecinku ...((1) (2 1) (3 2 1) (5 3 2 1))
  • [~] flat ...: Usuń zagnieżdżanie listy i złóż operator konkatty łańcuchowej ... 1213215321

(Opiera się to na mojej odpowiedzi na poprzednie wyzwanie ).

smls
źródło
1

Mathematica, 61 bajtów

ToString/@(1<>Prime@Range[Range@PrimePi@#,0,-1]/.Prime@0->1)&

Funkcja bez nazwy, przyjmująca argument liczby całkowitej i zwracająca ciąg znaków. (Jeśli dane wejściowe nie są liczbą pierwszą, po prostu „zaokrągla je” do najbliższej liczby pierwszej; jeśli dane wejściowe nie są dodatnie, udaje, że to 1.)

Ta implementacja wykorzystuje paskudną sztuczkę z odpowiedzi Martina Endera na podobne poprzednie wyzwanie (kto mówi, że ten stary pies nie może nauczyć się nowych sztuczek?): Nadużywanie w <>celu spłaszczenia zagnieżdżonej listy liczb całkowitych.

Lista zagnieżdżona, o której mowa, zaczyna się od wygenerowania podobnej listy zagnieżdżonej jak w tej odpowiedzi, o odpowiedniej długości (podanej przez PrimePi@#liczbę liczb pierwszych aż do wejścia); następnie Primejest stosowany do każdego elementu. Na przykład dla danych wejściowych, 5które są trzecią liczbą pierwszą, kod Range[Range@PrimePi@#,0,-1]daje {{1,0},{2,1,0},{3,2,1,0}}, a zastosowanie Primedo każdego elementu daje, {{2,Prime[0]},{3,2,Prime[0]},{5,3,2,Prime[0]}}ponieważ pierwsza, druga i trzecia liczba pierwsza to odpowiednio 2, 3 i 5. Jestem dumny, że udało mi się dodać jeszcze więcej błędów do podejścia Martina Endera - Mathematica narzeka za każdym razem, gdy pisze Prime[0].

Prime[0]nie jest rzeczą, ale jest w porządku: /.Prime@0->1zamienia je wszystkie w 1s. Chcemy również 1z przodu, więc zastępujemy odpowiedź ""Martina Endera po prostu 1, co faktycznie oszczędza bajt.

Greg Martin
źródło
0

PHP, 72 bajty

for(;$n<$argv[1];print$s=$n.$s)for($i=2;$i>1;)for($i=++$n;--$i&&$n%$i;);

Uruchom dowcip -r

awaria

for(;$n<$argv[1];               // loop $n up to argument:
    print$s=$n.$s)                  // 2. prepend $n to $s, print $s
    for($i=2;$i>1;)                 // 1. find next prime: break if $i<2
        for($i=++$n;--$i&&$n%$i;);      // if $n is prime, $i is 1 after loop (0 for $n=1)
Tytus
źródło