Odwróć i dodaj degenerację

22

Wprowadzenie

Odwróć i dodaj jest tak proste, jak się wydaje, weź ni dodaj do cyfr w odwrotnej kolejności. (np. 234 + 432 = 666).

Jeśli zastosujesz ten proces wielokrotnie, niektóre liczby ostatecznie osiągną liczbę pierwszą, a niektóre nigdy nie osiągną liczby pierwszej.

Przykład

Obecnie mam

11431 rep.

11431 is not prime
11431 + 13411 = 24842 which is not prime
24842 + 24842 = 49684 which is not prime
49684 + 48694 = 98378 which is not prime
98378 + 87389 = 185767 which is prime!

Ta liczba uderza w liczbę pierwszą

W przeciwieństwie do tego, żadna wielokrotność 3 nigdy nie trafi liczby pierwszej, ponieważ wszystkie wielokrotności 3 mają sumę cyfr, która jest wielokrotnością 3 i odwrotnie. Zatem odwrócenie i dodanie wielokrotności 3 zawsze spowoduje powstanie nowej wielokrotności 3, a zatem nigdy liczby pierwszej.

Zadanie

Weź dodatnią liczbę całkowitą ni ustal, czy wielokrotne cofanie i dodawanie spowoduje kiedykolwiek liczbę pierwszą. Podaj wartość prawdy lub fałszu. Albo prawda jak dla osiąga wartość pierwszą, a fałsz dla nie lub na odwrót oba są dopuszczalne.

Liczby pierwsze będą uznawane za osiągające liczbę pierwszą w zerowych iteracjach.

To jest więc postaraj się, aby Twój kod był jak najkrótszy.

Przypadki testowe

Prawda dla osiąga liczbę pierwszą fałsz, ponieważ nigdy nie osiąga liczby pierwszej

11 -> True
11431 -> True
13201 -> True
13360 -> True
13450 -> True
1019410 -> True
1019510 -> True
22 -> False
1431 -> False
15621 -> False
14641 -> False

Wskazówka

Podczas pisania tego wyzwania odkryłem fajną sztuczkę, która znacznie ułatwia ten problem. Nie jest to niemożliwe bez tej sztuczki i nie jest też trywialne, ale pomaga. Miałem dużo zabawy z odkryciem tego, więc zostawię to w spoilerze poniżej.

Powtarzane odwracanie i dodawanie zawsze będzie miało wartość 11 w 6 iteracjach lub mniej. Jeśli nie trafi liczby pierwszej, zanim trafi wielokrotność 11, nigdy nie trafi liczby pierwszej.

Kreator pszenicy
źródło
Uważam, że jest to raczej problem matematyczny niż problem kodowania. Myślę, że problemy z kodem mają określone reguły, które są zaimplementowane w kodzie przez odpowiadającego; Nie sądzę, że tak jest w przypadku tego wyzwania.
Arjun
@ DobbyTheFree-Elf Myślę, że różnica między tym problemem a typowymi problemami z „kodowaniem” polega na tym, że często w przypadku tego drugiego algorytm, który ma zostać zaimplementowany, jest oczywisty i jest to po prostu kwestia robienia tego przy możliwie najmniejszym kodzie. To wyzwanie zmusza cię do wymyślenia algorytmu od zera. Oba stanowią własne unikalne łamigłówki, ale ostatecznie oba nadal mają problemy z kodowaniem.
Wheat Wizard
Zgadzam się z twoim komentarzem, ale moim zdaniem wymyślenie takiego algorytmu obecnego w tym wyzwaniu jest raczej zadaniem matematyka niż programisty. Nie wiem, co myślą inni, ale przynajmniej tak myślę. To ma moje zdanie.
Arjun
1
@ DobbyTheFree-Elf Nienawidzę ci tego łamać, ale znajdowanie wydajnych algorytmów do rozwiązania problemu w kluczowej części bycia dobrym programistą.
Wheat Wizard
Ja też się z tym zgadzam. Ale algorytm tego wyzwania będzie miał większą wartość matematyczną. Trzeba będzie znaleźć lub stworzyć sprawdzone twierdzenia matematyczne, aby zagwarantować poprawny wynik przy każdym możliwym wkładzie, co moim zdaniem robi matematyka. W tym przypadku nie będą działać popularne podejścia, takie jak brutalna siła itp.
Arjun

Odpowiedzi:

7

Ruby , 84 79 77 74 bajtów

->x{y=1;x+="#{x}".reverse.to_i while(2...x).any?{|z|0==y=x%z}&&x%11>0;y>0}

Wypróbuj online!

Jeśli mam rację, kiedy osiągniemy wielokrotność 11, możemy przestać (po tym otrzymamy wielokrotności 11)

GB
źródło
Jest coś potężniejszego, co możemy udowodnić za pomocą informacji w spoilerze.
Kreator pszenicy 24.04.17
3

Haskell , 65 bajtów

fbierze Integeri zwraca a Bool.Trueoznacza, że ​​osiąga liczbę pierwszą.

f n=gcd(product[2..n-1])n<2||gcd 33n<2&&f(n+read(reverse$show n))

Wypróbuj online!

Niestety krótki, ale nieefektywny test główny oznacza, że Trueprzypadki testowe PO inne niż11 zbyt duże, aby je zakończyć. Ale na przykład 11432 to Truesprawa, która się kończy.

Możesz także wypróbować ten 3 bajty dłuższy, dla którego TIO może zakończyć wszystkie Trueprzypadki testowe:

f n=and[mod n i>0|i<-[2..n-1]]||gcd 33n<2&&f(n+read(reverse$show n))

Wypróbuj online!

Pierwsze testy obu wersji zaczynają się od 1, ale tak się składa, że ​​i tak dostaje się do liczby pierwszej (2).

W przeciwnym razie zauważyłem mniej więcej to samo, co GB w spoilerze zgłoszenia Ruby:

Gdy liczba osiągnie równą długość, następna iteracja będzie podzielna przez 11. Gdy liczba będzie podzielna przez 11, wszystkie kolejne iteracje.

Ørjan Johansen
źródło
@WheatWizard Cóż, implikuje to, że liczba iteracji jest ograniczona, z (przepraszam, brak tagów spoilera w komentarzach) maksymalnie 6 kroków do sprawdzenia, myślę (np. 100 jest maksymalna). Próbując krótko, nie wydaje mi się to jednak krótszym rozwiązaniem. Masz na myśli coś potężniejszego niż to?
Ørjan Johansen
Nie, to było to, że 6 to maksimum
Wheat Wizard
3

Python 2, 123 110 bajtów

Zaoszczędź 13 bajtów dzięki Ørjan Johansen i Wheat Wizard !

n=input()
while 1:
 if all(n%m for m in range(2,n)):print 1;break
 if n%11==0:print 0;break
 n+=int(`n`[::-1])

Zwraca 1, jeśli osiągnie liczbę pierwszą, 0, jeśli nie. Wypróbuj online!

NumberManiac
źródło
2

Python 2 , 78 70 69 bajtów

f=lambda x:all(x%a for a in range(2,x))or x%11and f(x+int(`x`[::-1]))

Wypróbuj online!

Wyjaśnienie

Ten program opiera się na tym, że

Każda liczba, która straci na zawsze, osiągnie wielokrotność 11 w mniej niż 6 ruchach

Ten program to rekurencyjna lambda z obwodowymi logicznymi porównaniami. Najpierw sprawdza, czy n jest liczbą pierwszą.

all(x%a for a in range(2,x))

Jeśli to prawda, zwracamy prawdę.

Jeśli jest to fałsz, sprawdzamy, czy jest to wielokrotność 11.

x%11

Jeśli false, zwracamy false, w przeciwnym razie zwracamy wynik fprzy następnej iteracji

f(x+int(`x`[::-1]))
Kreator pszenicy
źródło
2

Galaretka , 11 bajtów

ṚḌ$+$6СÆPS

Wypróbuj online!

Erik the Outgolfer
źródło
W interesie każdego, kto czyta tę odpowiedź, ostatnia Smoże być Trównież. RD$+$może być +RD$$lub RD+<newline>Ç(wszystkie trywialne modyfikacje)
HyperNeutrino 28.04.17
@HyperNeutrino Wybrałem, Sponieważ ma mniejsze szanse na pokazanie czegokolwiek> 1. Nie ma RD, tylko ṚḌi wybrałem ṚḌ$+$, żebym mógł to lepiej zorganizować.
Erik the Outgolfer
Byłem zbyt leniwy, by dodać kropki; Wiem, dlaczego stawiasz S; Powinienem to przemyśleć T, ale to głównie w interesie wszystkich innych.
HyperNeutrino
1

05AB1E , 14 13 bajtów

EDYCJA : Zapisano jeden bajt, ponieważ dane wejściowe są ponownie wykorzystywane, jeśli na stosie nie ma wystarczającej liczby elementów

[Dp#D11Ö#R+]p

Wypróbuj online!

Wykorzystuje wskazówkę w pytaniu

Jak to działa

[              # begin infinite loop
               # implicit input
 D             # duplicate input
  p            # push primality of input
   #           # if prime, break
    D          # duplicate input
     11        # push 11
       Ö       # push input % 11 == 0
        #      # if multiple of 11, break
               # implicit push input
          R    # reverse input
           +   # add both numbers
            ]  # end infinite loop
             p # push primality of result; 1 if prime, 0 if multiple of 11
               # implicit print
Neil A.
źródło
0

MATLAB, 88 81 bajtów

function r=f(n);r=0;for i=1:7 r=r+isprime(n);n=n+str2num(fliplr(num2str(n)));end;
Steadybox
źródło
0

JavaScript (ES6), 73 bajty

Zwraca 0lub true.

f=n=>{for(d=n;n%--d;);return d<2||n%11&&f(+[...n+''].reverse().join``+n)}

Skomentował

Jest to oparte na formule magicznego spoilera opisanej przez Kreatora pszenicy.

f = n => {              // given n:
  for(d = n; n % --d;); // find the highest divisor d of n
  return                //
    d < 2 ||            // if this divisor is 1, return true (n is prime)
    n % 11 &&           // else: if 11 is a divisor of n, return 0
    f(                  // else: do a recursive call with
      +[...n + '']      // the digits of n
      .reverse().join`` // reversed, joined,
      + n               // coerced to a number and added to n
    )                   //
}                       //

Przypadki testowe

Usunąłem dwa największe dane wejściowe z fragmentu, ponieważ ich ukończenie zajmuje kilka sekund. (Ale oni też działają.)

Arnauld
źródło
0

Mathematica, 45 bajtów

Or@@PrimeQ@NestList[#+IntegerReverse@#&,#,6]&
alephalpha
źródło
0

Serwer Microsoft Sql, 826 786 * bajtów

* Przypomniałem o funkcji IIF, która została wprowadzona w Microsoft Sql Server 2012

set nocount on
use rextester
go
if object_id('dbo.n','IF')is not null drop function dbo.n
go
create function dbo.n(@ bigint,@f bigint)returns table as return
with a as(select 0 c union all select 0),b as(select 0 c from a,a t),c as(select 0 c from b,b t),
d as(select 0 c from c,c t),e as(select 0 c from d,d t),f as(select 0 c from e,e t),
v as(select top(@f-@+1)0 c from f)select row_number()over(order by(select 0))+@-1 n from v
go
with u as(select cast(a as bigint)a from(values(11),(11431),(13201),(13360),(13450),(1019410),(1019510),(22),(1431),
(15621),(14641))u(a)),v as(select a,a c from u union all select a,c+reverse(str(c,38))from v
where 0=any(select c%n from dbo.n(2,c/2))and c%11>0)select a,iif(0=any(select max(c)%n from dbo.n(2,max(c)/2)),0,1)
from v group by a option(maxrecursion 0)

Sprawdź to online

Bardziej schludne formatowanie

SET NOCOUNT ON;
USE rextester;
GO
IF OBJECT_ID('dbo.n', 'IF') IS NOT NULL DROP FUNCTION dbo.n;
GO
CREATE FUNCTION dbo.n(@ BIGINT,@f BIGINT)RETURNS TABLE AS RETURN
  WITH
    a AS(SELECT 0 c UNION ALL SELECT 0),
    b AS(SELECT 0 c FROM a,a t),
    c AS(SELECT 0 c FROM b,b t),
    d AS(SELECT 0 c FROM c,c t),
    e AS(SELECT 0 c FROM d,d t),
    f AS(SELECT 0 c FROM e,e t),
    v AS(SELECT TOP(@f-@+1)0 c FROM f)
    SELECT ROW_NUMBER()OVER(ORDER BY(SELECT 0))+@-1 n FROM v;
GO
WITH u AS(
  SELECT CAST(a AS BIGINT) a
  FROM(VALUES (11), (11431), (13201), (13360), (13450), (1019410), (1019510),
              (22), (1431), (15621), (14641)) u(a)
),
v AS(
  SELECT a, a c FROM u
    UNION ALL
  SELECT a, c + reverse(str(c, 38))
  FROM v
  WHERE 0 = ANY(SELECT c % n FROM dbo.n(2, c / 2)) AND c % 11 > 0
)
SELECT a, IIF(0 = ANY(SELECT MAX(c) % n FROM dbo.n(2, MAX(c) / 2)), 0, 1)
FROM v
GROUP BY a
OPTION (MAXRECURSION 0);
Andrei Odegov
źródło
Czy potrzebujesz /*true*/i /*false*/komentarzy?
Esolanging Fruit
Nie. To komentarze wykorzystano do oddzielenia danych wejściowych zgodnie z oczekiwanymi wynikami.
Andrei Odegov
Czy możesz je usunąć?
Esolanging Fruit
Tak, oczywiście komentarze można usunąć.
Andrei Odegov
Wygląda na to, że wejścia zostały zakodowane na stałe. Nie jestem zbyt pewien, ale wydaje mi się, że akceptowalnym formatem wejściowym jest wybranie ich z tabeli
Jo King
0

Galaretka , 9 bajtów

ṚḌ+Ɗ6СẒẸ

Wypróbuj online!

Jak to działa

ṚḌ+Ɗ6СẒẸ    Monadic main link.
ṚḌ+Ɗ         Monad: Reverse and add to original.
    6С      Repeatedly apply the above 6 times, collecting all iterations
       ẒẸ    Is any of them a prime?
Bubbler
źródło
0

PHP 114 bajtów

<?php function f($n){$n1=strrev((string)$n);$r=$n+(int)$n1;for($i=2;$i<$r;$i++){if($r%$i==0){die('0');}}die('1');}

Bardziej czytelna wersja:

<?php function f($n)
{
    $n1 = strrev((string)$n);
    $r = $n + (int)$n1;
    for ($i = 2; $i < $r; $i++) {
        if ($r % $i == 0) {
            die('0');
        }
    }
    die('1');
}

f(11431 );

Wypróbuj online!

Użyłem tego do liczenia bajtów.

Andrzej
źródło
Ach, okej, to powinno się skończyć. Nie zrozumiałem wtedy pytania. Edytowałem pytanie, aby zakończyć w przypadkach fałszywych.
Andrew
Teraz zawsze zwraca false, chyba że pierwsze odwrócenie jest liczbą pierwszą. Nie sprawdzasz także pierwszego przypadku, gdzienjest liczbą pierwszą. A TIO ma dla ciebie licznik bajtów ... ma nawet automatyczny formatator szablonu przesyłania, którego możesz użyć
Jo King