ย้อนกลับและเพิ่มความเสื่อม


22

Intro

ย้อนกลับและเพิ่มนั้นง่ายอย่างที่มันฟังใช้nและเพิ่มลงในตัวเลขในลำดับย้อนกลับ (เช่น 234 + 432 = 666)

หากคุณใช้กระบวนการนี้ซ้ำ ๆ ตัวเลขบางหมายเลขจะถึงจำนวนเฉพาะในที่สุดและบางหมายเลขจะไม่ถึงจำนวนเฉพาะ

ตัวอย่าง

ฉันมี

ตัวแทน 11431

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!

จำนวนนี้เป็นจำนวนเฉพาะ

ในทางตรงกันข้ามตัวคูณใด ๆ ของ 3 จะไม่ตียอดเยี่ยมนี่เป็นเพราะผลคูณของ 3 ทั้งหมดมีผลรวมหลักที่เป็นผลคูณของ 3 และในทางกลับกัน ดังนั้นการย้อนกลับและการเพิ่มค่าทวีคูณของ 3 จะส่งผลให้เกิดพหุคูณใหม่ 3 และจะไม่เป็นค่าที่ดีที่สุด

งาน

ใช้จำนวนเต็มบวกnและพิจารณาว่าการย้อนกลับและการเพิ่มซ้ำ ๆ จะส่งผลให้มีจำนวนเฉพาะหรือไม่ ส่งออกค่าความจริงหรือเท็จ ความจริงสำหรับการเข้าถึงค่าที่สำคัญและเป็นเท็จสำหรับไม่ได้หรือวิธีอื่น ๆ ที่เป็นที่ยอมรับ

ตัวเลขที่สำคัญจะถูกพิจารณาว่ามีจำนวนเฉพาะในศูนย์ซ้ำ

นี่คือดังนั้นพยายามทำให้รหัสของคุณสั้นที่สุด

กรณีทดสอบ

จริงสำหรับการเข้าถึงความเท็จ

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

เปรย

ในขณะที่ฉันกำลังเขียนความท้าทายนี้ฉันค้นพบเคล็ดลับดีๆที่ทำให้ปัญหานี้ง่ายขึ้นมาก มันเป็นไปไม่ได้หากไม่มีกลอุบายนี้และมันก็ไม่สำคัญกับมัน แต่ช่วยได้ ฉันสนุกมากที่ได้ค้นพบสิ่งนี้ดังนั้นฉันจะทิ้งมันไว้ในสปอยเลอร์ด้านล่าง

การย้อนกลับซ้ำและเพิ่มซ้ำจะตีซ้ำ 11 ใน 6 หรือน้อยกว่าเสมอ ถ้ามันไม่ตีนายกก่อนที่จะตีหลาย 11 มันจะไม่ตีนายก


ฉันพบว่ามันมีปัญหาทางคณิตศาสตร์มากกว่าการเข้ารหัส ฉันเดาว่าปัญหารหัสมีกฎเฉพาะที่จัดทำขึ้นซึ่งถูกนำไปใช้ในรหัสโดยผู้ตอบ ฉันไม่คิดว่าเป็นกรณีของการท้าทายนี้
Arjun

@ DobbyTheFree- เอลฟ์ฉันคิดว่าความแตกต่างระหว่างปัญหานี้กับปัญหา "การเขียนโค้ด" ทั่วไปคือบ่อยครั้งสำหรับอัลกอริธึมที่จะนำมาใช้นั้นชัดเจนและมันก็เป็นเรื่องของการทำโค้ดให้น้อยที่สุดเท่าที่จะทำได้ ความท้าทายนี้บังคับให้คุณต้องหาอัลกอริธึมตั้งแต่เริ่มต้น ทั้งคู่ก่อให้เกิดปริศนาที่เป็นเอกลักษณ์ของตัวเอง แต่ในที่สุดทั้งคู่ก็ยังคงเป็นปัญหาการเข้ารหัส
ข้าวสาลีตัวช่วยสร้าง

ฉันเห็นด้วยกับความคิดเห็นของคุณ แต่ในความคิดของฉันการคิดอัลกอริทึมดังกล่าวในการท้าทายนี้เป็นงานของนักคณิตศาสตร์มากกว่าโปรแกรมเมอร์ ฉันไม่รู้ว่าคนอื่นคิดอย่างไร แต่อย่างน้อยฉันก็คิด ดังนั้นนี่คือ downvote ของฉัน
Arjun

1
@ DobbyTheFree- เอลฟ์ฉันเกลียดที่จะทำลายมันให้คุณ แต่การหาอัลกอริทึมที่มีประสิทธิภาพเพื่อแก้ปัญหาในส่วนที่สำคัญของการเป็นโปรแกรมเมอร์ที่ดี
ข้าวสาลีตัวช่วยสร้าง

ฉันก็เห็นด้วยเช่นกัน แต่อัลกอริทึมสำหรับความท้าทายนี้จะมีค่าทางคณิตศาสตร์มากขึ้น เราจะต้องค้นหาหรือสร้างทฤษฎีทางคณิตศาสตร์ที่ผ่านการพิสูจน์แล้วเพื่อรับประกันผลลัพธ์ที่ถูกต้องกับอินพุตที่เป็นไปได้ทุกอย่างซึ่งในความคิดของฉันนักคณิตศาสตร์ทำอะไร วิธีการทั่วไปเช่นแรงเดรัจฉาน ฯลฯ จะไม่ทำงานในกรณีนี้
Arjun

คำตอบ:


7

Ruby , 84 79 77 74 ไบต์

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

ลองออนไลน์!

ถ้าฉันเข้าใจถูกต้องเมื่อเราไปถึง 11 หลายครั้งเราสามารถหยุดได้ (เราจะได้ 11 เท่านั้นหลังจากนั้น)


มีบางสิ่งที่มีประสิทธิภาพมากกว่าที่เราสามารถพิสูจน์ได้ด้วยข้อมูลในสปอยเลอร์
ข้าวสาลีตัวช่วยสร้าง

3

Haskell , 65 ไบต์

fใช้เวลาและผลตอบแทนInteger หมายความว่ามันถึงนายกBoolTrue

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

ลองออนไลน์!

น่าเสียดายที่การทดสอบช่วงสั้น ๆ แต่ไม่มีประสิทธิภาพนั้นหมายความว่า OP Trueกรณีทดสอบนอกเหนือจากการ11โตเกินขนาดที่ใหญ่เกินกว่าจะสำเร็จได้ แต่ตัวอย่างเช่น 11432 เป็นTrueกรณีที่ไม่เสร็จสิ้น

คุณสามารถลองขนาด 3 ไบต์นี้ได้นานขึ้นอีกหนึ่งตัวซึ่ง TIO สามารถทำทุกTrueกรณีทดสอบได้:

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

ลองออนไลน์!

การทดสอบที่สำคัญของทั้งสองรุ่นแตกหักในวันที่ 1 แต่มันก็เกิดขึ้นที่มันจะได้รับการทดสอบที่ดีเยี่ยม (2)

มิฉะนั้นฉันสังเกตเห็นเกี่ยวกับสิ่งเดียวกันกับ GB ในสปอยเลอร์ของการส่งทับทิม:

เมื่อจำนวนเติบโตถึงความยาวการทำซ้ำครั้งต่อไปจะหารด้วย 11 เมื่อตัวเลขหารด้วย 11 ดังนั้นการทำซ้ำทั้งหมดจะตามมา


@WheatWizard ทีนี้ก็หมายความว่าจำนวนการวนซ้ำถูก จำกัด ด้วย (ขออภัยไม่มีแท็กสปอยเลอร์ในความคิดเห็น) สูงสุด 6 ขั้นตอนในการตรวจสอบฉันคิดว่า (เช่น 100 คือสูงสุด) พยายามสั้น ๆ นี่ไม่ได้ช่วยแก้ปัญหาให้ฉันได้ คุณหมายถึงบางสิ่งที่มีพลังมากกว่านั้นหรือ?
Ørjan Johansen

ไม่นั่นคือมันเป็นจำนวนสูงสุด 6 ตัว
Wheat Wizard


2

Python 2 , 78 70 69 ไบต์

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

ลองออนไลน์!

คำอธิบาย

โปรแกรมนี้อาศัยความจริงที่ว่า

ทุกจำนวนที่สูญเสียตลอดไปจะถึง 11 เท่าในเวลาน้อยกว่า 6 ครั้ง

โปรแกรมนี้เป็นแลมบ์ซ้ำที่มีการเปรียบเทียบเชิงตรรกะแบบหมุนเวียน ก่อนอื่นตรวจสอบว่า n เป็นจำนวนเฉพาะหรือไม่

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

ถ้านี่เป็นความจริงเราจะคืนความจริง

ถ้ามันเป็นเท็จเราตรวจสอบว่ามันเป็นหลายเท่าของ 11

x%11

หาก false เราส่งคืน false มิฉะนั้นเราจะส่งคืนผลลัพธ์fในการทำซ้ำครั้งถัดไป

f(x+int(`x`[::-1]))

2

เยลลี่ 11 ไบต์

ṚḌ$+$6СÆPS

ลองออนไลน์!


เพื่อประโยชน์ของใครก็ตามที่อ่านคำตอบนี้คนสุดท้ายSอาจเป็นTเช่นกัน RD$+$สามารถเป็น+RD$$หรือRD+<newline>Ç(การปรับเปลี่ยนเล็กน้อยทั้งหมด)
HyperNeutrino

@HyperNeutrino ฉันเลือกSเพราะมันมีโอกาสน้อยที่จะแสดงอะไร> 1 ไม่มีRDแค่ṚḌและฉันเลือกṚḌ$+$เพื่อให้ฉันสามารถจัดระเบียบได้ดีขึ้น
Erik the Outgolfer

ฉันขี้เกียจเกินไปที่จะใส่จุดต่างๆ ฉันรู้ว่าทำไมคุณถึงใส่S; ฉันควรจะเลือกมันมากกว่าTแต่นั่นก็เพื่อผลประโยชน์ของคนอื่นเป็นส่วนใหญ่
HyperNeutrino

1

05AB1E , 14 13 ไบต์

แก้ไข : บันทึกหนึ่งไบต์เนื่องจากอินพุตถูกนำมาใช้ใหม่หากมีองค์ประกอบไม่เพียงพอในสแต็ก

[Dp#D11Ö#R+]p

ลองออนไลน์!

ใช้คำใบ้ในคำถาม

มันทำงานอย่างไร

[              # 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


0

JavaScript (ES6), 73 ไบต์

ผลตอบแทนหรือ0true

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

แสดงความคิดเห็น

สิ่งนี้ขึ้นอยู่กับสูตรเวทย์มนตร์สปอยเลอร์ที่อธิบายโดย Wheat Wizard

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

กรณีทดสอบ

ฉันได้ลบอินพุตที่ใหญ่ที่สุดสองรายการออกจากข้อมูลโค้ดเนื่องจากใช้เวลาสองสามวินาทีจึงจะเสร็จสมบูรณ์ (แต่พวกเขาก็ทำงานเช่นกัน)



0

Microsoft Sql Server, 826 786 * ไบต์

* ฉันจำเกี่ยวกับฟังก์ชั่น IIF ที่เปิดตัวใน 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)

ตรวจสอบออนไลน์

การจัดรูปแบบเรียบร้อยมากขึ้น

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

คุณต้องการ/*true*/และ/*false*/แสดงความคิดเห็น?
แยกผลไม้

ไม่มันเป็นความคิดเห็นที่ใช้ในการแยกข้อมูลอินพุตตามผลลัพธ์ที่คาดไว้
Andrei Odegov

คุณสามารถลบได้ไหม
แยกผลไม้

ใช่แน่นอนสามารถลบความคิดเห็นได้
Andrei Odegov

ดูเหมือนว่าคุณได้ป้อนรหัสอย่างหนัก ฉันไม่แน่ใจ แต่ฉันคิดว่ารูปแบบการป้อนข้อมูลที่ยอมรับได้คือการเลือกพวกเขาจากตารางแทน
Jo King


0

PHP 114 ไบต์

<?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');}

รุ่นที่อ่านเพิ่มเติมได้:

<?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 );

ลองออนไลน์!

ฉันใช้สิ่งนี้เพื่อนับจำนวนไบต์


อาโอเคมันควรจะยุติ ฉันเข้าใจผิดคำถามแล้ว แก้ไขคำถามเพื่อยุติกรณี false-y
แอนดรู

ตอนนี้มันจะคืนค่า false เสมอยกเว้นว่า reverse แรกเป็น prime คุณยังไม่ได้ตรวจสอบกรณีแรกที่nเป็นนายกรัฐมนตรี และ TIO มีตัวนับไบต์สำหรับคุณ ... มันยังมีตัวจัดรูปแบบอัตโนมัติสำหรับเทมเพลตการส่งที่คุณสามารถใช้ได้
Jo King
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.