วิธีการสี่เหลี่ยมกลาง


19

บทนำ

วิธีการกลางสแควร์จะใช้สำหรับการสร้างตัวเลขหลอกเทียม อย่างไรก็ตามนี่ไม่ใช่วิธีการที่ดีในการปฏิบัติเนื่องจากช่วงเวลานั้นมักจะสั้นมากและมีจุดอ่อนที่รุนแรง มันทำงานอย่างไร ลองมาตัวอย่าง:

สำหรับเมล็ดเราเลือก123456:

Seed     123456

เมล็ดกำลังสอง (เมล็ด×เมล็ด) เท่ากับ:

Seed²  15241383936

เราเริ่มต้นด้วย6 หลักจำนวน นั่นหมายความว่าเมล็ดยืดควรส่ง12 บาทจำนวน หากไม่ใช่กรณีนี้จะมีการเพิ่มศูนย์นำหน้าเพื่อชดเชย:

Seed²  015241383936

จากนั้นเราจะนำส่วนตรงกลางของจำนวนที่มีขนาดเท่ากับเมล็ด:

Seed²  015241383936
          ^^^^^^

นี่คือเมล็ดพันธุ์ใหม่ของเรา: 241383. เราทำซ้ำกระบวนการเดียวกันตามที่แสดงด้านบน เราได้รับดังต่อไปนี้:

0:     123456
    015241383936
       |    |
1:     241383
    058265752689
       |    |
2:     265752
    070624125504
       |    |
3:     624125
    389532015625
       |    |
4:     532015
    283039960225
       |    |
5:     039960
    001596801600
       |    |
6:     596801

และสิ่งนี้ยังคงดำเนินต่อไปในขณะนี้ ... ตอนนี้เรารู้แล้วว่าวิธีกำลังสองคืออะไร


งาน

เมล็ดพันธุ์ทุกมีระยะเวลา ระยะเวลาของการให้nเมล็ด -digit ไม่สามารถจะยาวกว่า 8 n 82ยกตัวอย่างเช่นเมล็ด สิ่งนี้จะให้ลำดับต่อไปนี้:

82 > 72 > 18 > 32 > 02 > 00 > 00 > 00 > 00 > 00
|____|____|____|____|____|____|____|____|____|___...
0    1    2    3    4    5    6    7    8    9

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

อีกตัวอย่างคือ: 24ซึ่งให้สิ่งต่อไปนี้:

24 > 57 > 24
|____|____|___...
0    1    2

อย่างที่คุณเห็นว่าลำดับทั้งหมดไม่ได้ลงท้าย0ด้วย รอบนี้มีระยะเวลาของ1


กรณีทดสอบ

Input   >   Output
24      >   1
82      >   5
123456  >   146
8989    >   68
789987  >   226

Pastebins พร้อมลำดับสำหรับ123456 , 8989 , 789987

นี่คือดังนั้นการส่งที่มีจำนวนไบต์น้อยที่สุดจะชนะ!

คุณสามารถสันนิษฐานได้ว่าการป้อนข้อมูลจะไม่มีตัวเลขที่ไม่สม่ำเสมอ


10
เลือก Nit: นั่นไม่ใช่ช่วงเวลา Period บ่งบอกว่าในที่สุดลำดับกลับไปเป็นสถานะเริ่มต้น 24คือระยะ (กับช่วงที่ 2, ฉันจะบอกว่า) 82เป็นระยะ (ในระยะที่ 1)
เดนนิส

1
ดังนั้น "จุด" คือดัชนี 0 ของสถานะสุดท้ายซึ่งแตกต่างจากสถานะก่อนหน้า
Luis Mendo เมื่อ

@LuisMendo ใช่ถูกต้องแล้ว ความรู้ทางคณิตศาสตร์ของฉันไม่ได้ดีที่สุด: p.
Adnan

มันจะเป็นเหมือน 'จำนวนการวนซ้ำก่อนที่จะทำให้เสถียร'
ASCII- เท่านั้น

1
@WashingtonGuedes ดูนี้Pastebin นั่นทำให้ชัดเจนยิ่งขึ้น?
Adnan

คำตอบ:


3

เยลลี่26 24 18 ไบต์

³DL⁵*
²:¢½¤%¢µÐĿL’

ลองออนไลน์!

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

³DL⁵*         Helper link. No arguments.

³             Yield the original input.
 D            Convert from integer to base 10.
  L           Get l, the length of the decimal representation.
   ⁵*         Compute 10 ** l.


²:¢½¤%¢µÐĿL’  Main link. Input: n (integer)

²             Square n.
  ¢½¤         Call the helper link and take the square root of the result.
 :            Integer division; divide the left result by the right one.
      ¢       Call the helper link.
     %        Take the left result modulo the right one.
       µ      Convert the previous chain into a link, and begin a new chain.
        ÐĿ    Repeat the previous chain until the results are no longer unique,
              updating n in each iteration. Collect the intermediate results.
          L   Get the length of the list of results.
           ’  Decrement.

5

ทุบตีบริสุทธิ์162 131 116 113 107

บันทึก 3 ไบต์โดยใช้$c...

ขอบคุณ@Dennis ที่ช่วยฉันบันทึกอีก 6 ไบต์

---- begin middleSquare ----

for((b=$1;i[c=10#$b]<2;)){ a=${#b}
printf -v b %0$[a*2]d $[c*c]
b=${b:a/2:a};((i[10#$b]++))
};echo ${#i[@]}

---- end middleSquare ----

for testCase in 24 82 123456 8989 789987 111111;do
    printf "%12s: " $testCase
    bash middleSquare $testCase
  done
          24: 2
          82: 5
      123456: 146
        8989: 68
      789987: 226
      111111: 374

รูปสี่เหลี่ยมจตุรัส, 131

---- begin middleSquare ----

for((b=$1;i[
10#$b]<2;1))
do a="${#b}" 
printf -v b\
 %0$[a*2]d \
$[10#$b**2];
b=${b:a/2:a}
((i[10#$b]++
));done;ech\
o ${#i[@]:0}

---- end middleSquare ----

for testCase in 24 82 123456 8989 789987 111111;do
    printf "%12s: %9d\n" $testCase $(
        bash middleSquare $testCase)
  done
          24:         2
          82:         5
      123456:       146
        8989:        68
      789987:       226
      111111:       374

เก่า แต่มีเอาท์พุทแฟนซี 162

---- begin middleSquare ----

for((b=$1;i[10#$b
]<2;1))do a=${#b}
printf -v b %0$[a
*2]d  $[10#$b**2]
b=${b:a/2:a};((i[
10#$b]++));print\
f "%9d %s\n" ${#\
i[@]} $b;done;ec\
ho -- ${#i[@]} --

---- end middleSquare ----

bash middleSquare 24
        1 57
        2 24
        2 57
-- 2 --

for testCase in 24 82 123456 8989 789987 111111
    do while read f v f
        do r=$v;done < <(
        bash middleSquare $testCase)
    printf "%12s: %11d\n" $testCase $r
  done
          24:           2
          82:           5
      123456:         146
        8989:          68
      789987:         226
      111111:         374

3

JavaScript (ES7), 82 ไบต์

f=(n,p={},m=-1,l=n.length)=>p[n]?m:f(`${n*n+100**l}`.substr(l/2+1,l,p[n]=1),p,++m)

ยอมรับอินพุตในรูปแบบของสตริงเช่น "82" และส่งคืนจำนวนเต็ม เทคนิคการวนซ้ำแบบหางแบบง่าย ๆ เพื่อตรวจสอบเมล็ดแต่ละชนิดเพื่อป้องกันการแฮชของเมล็ดพันธุ์ที่ได้รับการเห็นแล้ว ฉันเพิ่ม 100 ** l ลงในตารางเพื่อให้แน่ใจว่ามีความยาวสม่ำเสมอ


@Downgoat ยอมรับการป้อนข้อมูลในรูปแบบของสตริง
Neil

1
โอ้ใช่ฉันเดาว่าฉันอ่านไม่ออก: |
Downgoat

@ WashingtonGuedes ไม่ไม่ทำงานเมื่อค่ากลางเริ่มต้นด้วยค่าศูนย์ที่เพียงพอ (นี่คือเหตุผลที่ฉัน "เสีย" 7 ไบต์เพิ่ม 100 ** l.)
Neil

1
@ WashingtonGuedes มีหลายกรณีที่มันใช้งานไม่ได้ตัวอย่างเช่นลองติดตาม chain จาก 5288
Neil

3

Python 3 2, 139 114 97 ไบต์

ขอบคุณ Seeq สำหรับการเล่นกอล์ฟ 25 ไบต์และขอบคุณเดนนิสสำหรับการเล่นกอล์ฟ 17 ไบต์! รหัส:

s=`input()`;u=[];l=len(s)/2
while not s in u:u+=[s];s=`int(s)**2`.zfill(l*4)[l:3*l]
print~-len(u)

สามารถตีกอล์ฟต่อไปได้อย่างแน่นอน นี่เป็นรหัสที่ใช้ทำกรณีทดสอบ: P


2

Pyth, 21 ไบต์

tl.us_<>_`^N2/lz2lzsz

ลองใช้ออนไลน์: การสาธิตหรือชุดทดสอบ

แก้ไข: พบเคส1000ที่ไม่ได้ทำงานกับรหัสก่อนหน้าของฉัน แก้ไขเป็น 1 ไบต์

คำอธิบาย:

tl.us_<>_`^N2/lz2lzsz   implicit: z = input string
  .u               sz   apply the following instructions to N, starting with N = int(z), 
                        until it runs into a loop:
          ^N2              square it
         `                 convert it to a string
        _                  reverse order
       >     /lz2          remove the first len(z)/2
      <          lz        remove everything but the first len(z)  
     _                     reverse order
    s                      convert to int
  .u                   returns the list of all intermediate values
 l                     compute the length of this list
t                      minus 1

เหตุผลใดที่จะใช้szแทนQ?
Ven

@ user1737909 ถ้าฉันใช้Qฉันต้องแทนที่ทั้งหมดlzด้วยl`Qs
Jakube

MH ดูเหมือนว่าน่าแปลกใจ Pyth inputไม่ได้ส่วนแบ่ง ฉันคิดว่ามันมีความหมายจริงๆที่จะอนุญาตให้อ่าน stdin ครั้งที่สอง .. ?
Ven

@ user1737909 ใช่ มีความเป็นไปได้เพียงอย่างเดียวที่จะแบ่งปันอินพุตด้วย.zและ.Qแม้ว่าพวกเขาจะอ่านอินพุตหลายบรรทัดและเก็บไว้ในรายการ แต่ฉันไม่เคยเห็นใครใช้คุณสมบัตินี้ มีเพียง 1 ไบต์เท่านั้นในการประเมินสตริงหรือเพื่อทำให้ตัวเลขเป็นตัวเลข
Jakube

โอเคคุณสามารถอ่าน stdin ได้สูงสุด 4 ครั้งใน Pyth Qz.Q.zใช่ไหม
Ven

2

MATL , 33 35 40ไบต์

`t0)2^10GVnXK2/^/k10K^\vtun@>]n2-

ลองออนไลน์!

`           % do...while
  t         %   duplicate. Take input implicitly on first iteration
  0)        %   pick last value of array
  2^        %   square
  10        %   push 10
  GVn       %   number of digits of input
  XK        %   copy that to clipboard K
  2/        %   divide by 2
  ^         %   power
  /k        %   divide and floor. This removes rightmost digits from the square value
  10K^      %   10 ^ number of digits of input
  \         %   modulo. This takes the central part of the squared number
  v         %   concatenate this new number to array of previous numbers
  tun@>     %   does the number of unique values exceed the iteration index?
]           % if so: next iteration. Else: exit loop
n2-         % desired result is the amount of numbers minus 2. Implicitly display

2

Oracle SQL 11.2, 184 ไบต์

WITH v(v,p,n)AS(SELECT:1,'0',-1 FROM DUAL UNION ALL SELECT SUBSTR(LPAD(POWER(v,2),LENGTH(v)*2,0),LENGTH(v)/2+1,LENGTH(v)),v,n+1 FROM v)CYCLE v SET c TO 1 DEFAULT 0 SELECT MAX(n)FROM v;

ยกเลิกแข็งแรงเล่นกอล์ฟ

WITH v(v,p,n) AS
(
  SELECT :1,'0',-1 FROM DUAL
  UNION ALL
  SELECT SUBSTR(LPAD(POWER(v,2),LENGTH(v)*2,0), LENGTH(v)/2+1, LENGTH(v)),v,n+1 FROM v
)
CYCLE v SET c TO 1 DEFAULT 0
SELECT MAX(n) FROM v;

มันใช้การสร้างวงจรตรวจจับเพื่อหยุดการซ้ำ




1

CJam, 37 ไบต์

q{__,W*:D;~_*sD2/<D>]___|=:A;~A}g],((

พบปัญหาการสั่งซื้อสแต็กที่น่ารำคาญที่ฉันไม่สามารถดูวิธีแก้ไขได้ทันที มันยังช้าอย่างไม่น่าเชื่อ

วิธีการทำงาน: การวนซ้ำแต่ละครั้งจะส่งค่าใหม่ไปที่ด้านบนสุดของสแต็กจากนั้นเราจะรวมสแต็กเข้าในอาร์เรย์และดูว่ามันเป็นแบบเดียวกันกับยูเนี่ยนของมันเองหรือไม่ เมื่อมีองค์ประกอบที่ซ้ำกันหยุดและดูจำนวนองค์ประกอบในกอง




1

VBSCRIPT, 131 ไบต์

s=inputbox(c):l=len(s):do:t=t&","&s:s=space(l*2-len(s*s))&s*s:s=mid(s,l/2+1,l):i=i+1:loop until instr(t,","&s)>0:msgbox i-1

ดีที่สุดที่ฉันสามารถทำกับ vbscript, โปสเตอร์ครั้งแรกดังนั้นไปง่าย ๆ กับฉัน!


ยินดีต้อนรับสู่การเขียนโปรแกรมปริศนาและการแลกเปลี่ยนรหัสกองกอล์ฟ! โพสต์แรกสุดยอด! ฉันแก้ไขการจัดรูปแบบโพสต์ของคุณเล็กน้อยเพื่อให้อ่านได้ง่ายขึ้นและสอดคล้องกับมาตรฐานของเรามากขึ้น มีความสุขในการเล่นกอล์ฟ!
GamrCorps
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.