คำนวณจำนวน Delacorte ของตาราง


12

ถาม: ใช้การคำนวณหมายเลข Delacorte ในภาษาใด ๆ รหัสที่สั้นที่สุดชนะ

สำหรับเมทริกซ์จตุรัสที่กำหนดของจำนวนเต็มชัดเจน1..n² (ความยาวด้านที่เป็นไปได้nอย่างน้อยระหว่าง 3 และ 27) หมายเลข Delacorte ของมันคือผลรวมของผลิตภัณฑ์gcd (a, b) ×distance² (a, b)สำหรับแต่ละจุดที่แตกต่างกัน จำนวนเต็ม {a, b}

ตัวอย่างต่อไปนี้แสดงตาราง 3 × 3 พร้อมหมายเลข Delacorte เป็น 160

3 2 9
4 1 8
5 6 7

ในตารางนี้เรามีการคำนวณ 36 คู่ที่แตกต่างกันเช่นคู่ที่ 4 และ 6: gcd (4, 6) × ระยะทาง ² (4, 6) = 4

อีกตัวอย่างสแควร์สำหรับการทดสอบ - นี้มีจำนวน Delacorte 5957:

10  8 11 14 12
21  4 19  7  9
 5 13 23  1 16
18  3 17  2 15
24 22 25  6 20

หมายเลข Delacorte นำมาจากการแข่งขันเขียนโปรแกรมนี้ - ดูรายละเอียดเพิ่มเติมที่นั่น ... การประกวดสิ้นสุดลงในเดือนมกราคม 2558 มันสนุกมาก!

กฎ:

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

คุณสามารถเลือกวิธีจัดการกับอินพุตและเอาต์พุตและคุณไม่ต้องนับเฟรมเวิร์กที่จำเป็นสำหรับภาษาของคุณเช่นส่วนหัวแบบมาตรฐานหรือส่วนหัวของฟังก์ชันหลัก เฉพาะจำนวนจริงเท่านั้น (รวมถึงคำจำกัดความทางลัด / นามแฝง) เช่นในตัวอย่าง C # นี้:

namespace System
{
    using Collections.Generic;
    using I=Int32; //this complete line counts
    class Delacorte
    {
        static I l(I[]a){return a.Length;} //of course this complete line counts

        static void CalculateSquare(int[] a, out int r)
        {
            r=0;for(I i=l(a);i-->0;)r+=a[i]; //here only this line counts
        }

        static void Main()
        {
            int result;
            CalculateSquare(new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9 }, out result);
            Console.Write(result); //should output 140 for the example
            Console.ReadKey();
        }
    }
}

นอกจากนี้คุณยังสามารถป้อนสแควร์เป็นอาร์เรย์ 2 มิติหรือจากพรอมต์หรือเป็นสตริงหรือบางประเภทคอลเลกชันมาตรฐาน อาเรย์สองมิติเป็นวิธีเดียวที่ไม่ต้องคำนวณความยาวด้านของสี่เหลี่ยมจัตุรัสด้วยตัวคุณเอง
ไม่จำเป็นต้องใช้ฟังก์ชั่นย่อยสำหรับงานจริงคุณสามารถใส่รหัสลงใน Main () ได้โดยตรง

อนุญาตให้มีการเตรียมการมากขึ้นได้ฟรีเช่นที่นี่:

using System;
unsafe class Delacorte
{
    static void CalculateSquare(int* a, out int r)
    {
        r=0;while(*a>0)r+=*a++; //only this line counts
    }

    static void Main()
    {
        var input = new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 }; //adding a terminator
        int result;
        fixed (int* a = &input[0]) //necessary in C#
            CalculateSquare(a, out result);
        Console.Write(result);
        Console.ReadKey();
    }
}

หากคุณไม่แน่ใจว่าการเตรียมการที่ยาวนานของคุณอยู่ในจิตวิญญาณของกฎเหล่านี้หรืออาจจะเรียกว่าการโกงเพียงแค่ถาม :)


เสียงเหมือนในกรณีของ Python ทั้งหมดรวมฟรีหรือไม่ ซึ่งอาจทำให้บางการเพิ่มประสิทธิภาพแปลก ...
Falko

@Falko คำถามคืออะไรรวมถึงมาตรฐานคืออะไร? โปรดลองเข้าใจวิญญาณของกฎและปรับให้เข้ากับภาษาของคุณ ดังนั้นไม่ใช่: ดูusingตัวอย่างของฉัน- ถ้ามันถูกใช้เพื่อรวมไลบรารีเพราะมิฉะนั้นคุณไม่สามารถเรียกบางฟังก์ชันได้ฟรี หากคุณใช้เพื่อกำหนดนามแฝงสั้น ๆ สำหรับสิ่งใด ๆ คำสั่งทั้งหมดจะนับ
maf-soft

@Optimizer: ความหมายของฟังก์ชั่นระยะทางค่อนข้างซ่อนอยู่ในลิงค์ : มันคือสแควร์ของระยะทางแบบยุคลิดระหว่างสองฟิลด์
Falko

@Optimizer แทนที่จะให้คำจำกัดความที่ถูกต้องฉันได้ยกตัวอย่างเพื่อให้คุณมั่นใจได้ว่ามีความหมายอะไร ผมคิดว่าเป็นพอและเพิ่มความสนุกสนาน ...
MAF นุ่ม

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

คำตอบ:


6

APL (38)

{.5×+/∊∘.{(∨/Z[⍺⍵])×+/⊃×⍨⍺-⍵}⍨⊂¨⍳⍴Z←⍵}

นี่คือฟังก์ชันที่ใช้เมทริกซ์เป็นอาร์กิวเมนต์ที่ถูกต้องเช่น:

      sq5←↑(10 8 11 14 12)(21 4 19 7 9)(5 13 23 1 16)(18 3 17 2 15)(24 22 25 6 20)
      sq5
10  8 11 14 12
21  4 19  7  9
 5 13 23  1 16
18  3 17  2 15
24 22 25  6 20
      {.5×+/∊∘.{(∨/Z[⍺⍵])×+/⊃×⍨⍺-⍵}⍨⊂¨⍳⍴Z←⍵}sq5
5957

คำอธิบาย:

  • ⊂¨⍳⍴Z←⍵: Zเก็บเมทริกซ์ใน Zทำให้รายการของแต่ละคู่เป็นไปได้ของพิกัดใน
  • ∘.{... }⍨: สำหรับแต่ละคู่ของพิกัดรวมกับแต่ละคู่ของพิกัด:
    • +/⊃×⍨⍺-⍵: คำนวณdistance^2: ลบคู่แรกของพิกัดจากที่สองคูณด้วยตัวเองและรวมผลลัพธ์
    • ∨/Z[⍺⍵]: รับตัวเลขZสำหรับทั้งคู่พิกัดและค้นหา GCD
    • ×: คูณพวกเขาด้วยกัน
  • +/∊: รวมองค์ประกอบของผลลัพธ์ที่ได้
  • .5×: คูณด้วย 0.5 (เพราะเรานับแต่ละคู่ที่ไม่ใช่ศูนย์สองครั้งก่อนหน้านี้)

นี่จะเป็น 72 ไบต์ถ้าเรานับโดยใช้ UTF-8 ไบต์
kennytm

2
@KennyTM: ชุดอักขระ APL พอดีภายในไบต์ การเข้ารหัสมีอยู่ที่ใช้สิ่งนี้ APL ถือกำเนิด Unicode หลายทศวรรษ ดูเหมือนว่าจะได้รับการยอมรับบนไซต์นี้เพื่อนับอักขระ APL เป็นไบต์ตราบใดที่ไม่มีการใช้อักขระ Unicode (เช่นการใช้ codepoints Unicode สตริงเข้ารหัสหรือบางสิ่งบางอย่าง.)
marinus

@marinus ฟังดูสมเหตุสมผล คุณคิดอย่างไรเกี่ยวกับตัวอักษร unicode ใน Mathematica
maf-soft

@ maf-soft: ดีถ้ามีการเข้ารหัสที่มีอยู่ซึ่งตัวละครทั้งหมดที่ใช้อยู่ในไบต์ (ดังนั้นรวมทั้งอักขระ 'พิเศษ' และ 'ปกติ' ดังนั้นจึงมีเอกลักษณ์ไม่เกิน 256 อักขระ) จากนั้นสามารถนับเป็นหนึ่งไบต์ต่ออักขระ ถ้าไม่เช่นนั้นก็ไม่สามารถทำได้ อย่างไรก็ตามถ้า Mathematica ใช้อักขระ Unicode ที่ไม่ซ้ำกันน้อยกว่า 128 ตัวอักษรเหล่านั้นสามารถแมปลงในครึ่งบนของไบต์ด้วย ASCII ในครึ่งล่าง [1/2]
marinus

@ maf-soft: นี่เป็นการเข้ารหัสนวนิยาย (~ "ภาษา") ดังนั้นคุณต้องจัดเตรียมโปรแกรมแปลภาษาและคุณสามารถใช้ได้เฉพาะกับคำถามที่ใหม่กว่าโปรแกรมแปลของคุณตามกฎ ที่ระบุว่าคุณสามารถตอบคำถามในภาษาที่ตั้งคำถามล่วงหน้าไว้ล่วงหน้า (เพื่อป้องกันบุคคลที่กำหนดภาษาด้วยคำสั่ง 1 ไบต์เพื่อแก้ปัญหาอย่างแน่นอน) [2/2]
marinus

5

Mathematica (83 82 79 69 67 66)

การจัดเตรียม

a={{10,8,11,14,12},{21,4,19,7,9},{5,13,23,1,16},{18,3,17,2,15},{24,22,25,6,20}}

รหัส

#/2&@@Tr[ArrayRules@a~Tuples~2/.{t_->u_,v_->w_}->u~GCD~w#.#&[t-v]]

หากเรานับโดยใช้อักขระ Unicode: 62 :

Tr[ArrayRules@a~Tuples~2/.{t_u_,v_w_}u~GCD~w#.#&[t-v]]〚1〛/2

คุณสามารถใช้รุ่น UTF ของ '-> `: 
swish

@swish ->ใช้เวลา 2 ตัวอักษรและใช้ 1 ตัวอักษร แต่->ใช้เวลา 2 ไบต์และใช้เวลา 3 ไบต์ใน UTF-8 ดังนั้นจึงอาจนานกว่านั้นขึ้นอยู่กับตัวชี้วัด
kennytm

ดีมองไปที่การแก้ปัญหา APL ดังนั้นฉันเดาตัวชี้วัดที่อยู่ในตัวละครในนี้;)
หวด

@swish นั่นคือสิ่งที่ OP ควรชี้แจงเป็น UTF-8 ไบต์เป็นค่าเริ่มต้นหากไม่ได้ระบุไว้ :)
kennytm

@ KennyTM - ฉันไม่แน่ใจว่ามีอะไรดีที่สุด ฉันต้องการติดตามสิ่งที่พบได้ทั่วไปในเว็บไซต์นี้ ขณะนี้ฉันไม่มีเวลาค้นหา มีใครช่วยด้วยลิงก์บ้างไหม? คุณยังสามารถใช้การแชทที่กล่าวถึงในความคิดเห็น OP
maf-soft

5

Python - 128 112 90 89 88

เตรียม:

import pylab as pl
from fractions import gcd
from numpy.linalg import norm
from itertools import product

A = pl.array([
    [10,  8, 11, 14, 12],
    [21,  4, 19,  7,  9],
    [ 5, 13, 23,  1, 16],
    [18,  3, 17,  2, 15],
    [24, 22, 25,  6, 20]])

การคำนวณหมายเลข Delacorte (บรรทัดที่นับ):

D=sum(gcd(A[i,j],A[m,n])*norm([m-i,n-j])**2for j,n,i,m in product(*[range(len(A))]*4))/2

เอาท์พุท:

print D

ผลลัพธ์:

5957

2
คุณสามารถยุบforลูปทั้งสองเป็นเครื่องกำเนิดไฟฟ้าเดียวและsumครั้งเดียว นอกจากนี้คุณยังสามารถบันทึกP(R,R)ตัวแปรโดย*x,=product(R,R)ใช้การกำหนดที่ติดดาวเพื่อทำสำเนา ยิ่งไปกว่านั้นคุณสามารถทำให้มันเป็นผลิตภัณฑ์ที่สี่เท่าและเพียงแค่ทำproduct(R,R,R,R) for j,n,i,m in product(*[R]*4)
xnor

@xnor: ยอดเยี่ยม! *[R]*4เป็นสิ่งที่ฉันกำลังมองหาด้วยตัวเอง แต่ไม่สามารถทำงานได้
Falko

1
เนื่องจากการเตรียมของคุณไม่นับรวมกับจำนวนไบต์คุณไม่สามารถทำสิ่งที่ต้องการfrom fractions import gcd as gบันทึกไบต์ในส่วนสำคัญได้หรือไม่
FlipTack

3

Pyth 43

คำตอบนี้อาจจะเล่นกอล์ฟต่อไปได้อย่างแน่นอน ฉันไม่ชอบการคำนวณระยะทางเป็นพิเศษ

K^lJ.5VJFdUN~Z*i@JN@Jd+^-/dK/NK2^-%dK%NK2;Z

ในการตั้งค่านี้ให้เก็บอาเรย์เชิงเส้นในตัวแปร J คุณสามารถทำได้โดยการเขียน:

J[3 2 9 4 1 8 5 6 7)

ลองมันออนไลน์

ส่งออกลอย ฉันคิดว่านี่ถูกต้องตามกฎหมายโปรดบอกฉันว่าฉันทำผิดกฎ :)

คำอธิบาย:

                                             : Z=0 (implicit)
K^lJ.5                                       : K=sqrt(len(J))
      VJ                                     : for N in range(len(J))
        FdUN                                 : for d in range(N)
            ~Z*                              : Z+= the product of
               i@JN@Jd                       : GCD(J[N],J[d])
                      +^-/dK/NK2^-%dK%NK2    : (d/K-N/K)^2 + (d%K-N%K)^2 (distance)
                                         ;Z  : end all loops, and print Z

ว้าวในที่สุดฉันก็เอาชนะ Pyth ด้วย APL
marinus

@marinus ฮ่า ๆ ฉันยังคงพยายามอยู่ แต่ฉันคิดว่าคุณต้องเอาชนะฉันอย่างน้อย :)
FryAmTheEggman

ว้าวนี่มันบ้าไปแล้ว ตอนนี้ฉันอ่าน doc.txt แล้ว แต่ฉันอ่านยากมาก!
rubik

@rubik อย่างน้อยก็ไม่ได้ APL: D ประเภทเอกสารมีความถูกต้องไม่ได้ 100% เพราะทั้งภาษานี้จะ mantained โดยหนึ่งคน: isaacg หากคุณมีคำถามอย่าลังเลที่จะถามฉัน / เขาในการแชท :)
FryAmTheEggman

2

CJam, 55

q~:Q__,mqi:L;m*{_~{_@\%}h;\[Qf#_Lf/\Lf%]{~-_*}/+*}%:+2/

รับเมทริกซ์เป็น STDIN ในรูปแบบต่อไปนี้:

[10  8 11 14 12
 21  4 19  7  9
  5 13 23  1 16
 18  3 17  2 15
 24 22 25  6 20]

ลองออนไลน์ได้ที่นี่


ฉันคิดว่าคุณสามารถเขียนโค้ดเมทริกซ์ได้ฟรีและใช้{}เพื่อสร้างบล็อกแทนที่จะใช้ stdin คุณจะทิ้งเมทริกซ์ลงในอาร์เรย์หนึ่งมิติหรือไม่? ฉันคิดว่าคุณสามารถนำเมทริกซ์ที่จัดรูปแบบไปแล้วดูตัวอย่างของ OP (ฉันไม่รู้จัก CJam ดีดังนั้นเอามันไปด้วยเม็ดเกลือ))
FryAmTheEggman

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