आयतों में आयतें

Oct 17 2020

इस कोड गोल्फ चुनौती आप दो धनात्मक पूर्णांक दे देंगे nऔर kइनपुट के रूप में और आप पूर्णांक निर्देशांक के साथ आयतों के चारों तरफ छू कोने के साथ तैयार किया जा सकता की संख्या की गिनती है \$n \times k\$ आयत $$ \{(x,y) : 0 \leq x \leq n, 0 \leq y \leq k\}. $$ यही है, वहाँ होना चाहिए:

  • कम से कम एक शीर्ष के साथ एक \$x\$-कॉर्डिनेट ऑफ़ \ _$0\$,
  • कम से कम एक शीर्ष के साथ एक \$x\$-कॉर्डिनेट ऑफ़ \ _$n\$,
  • कम से कम एक शीर्ष के साथ एक \$y\$-कॉर्डिनेट ऑफ़ \ _$0\$, तथा
  • कम से कम एक शीर्ष के साथ एक \$y\$-कॉर्डिनेट ऑफ़ \ _$k\$।

उदाहरण

वहाँ हैं \$a(5,7) = 5\$पूर्णांक के साथ आयतें एक \ के सभी चार पक्षों को छूती हैं$5 \times 7\$ आयत:

टेबल

की (सममित) तालिका के निचले त्रिकोण \$a(n,k)\$के लिए \$n,k \leq 12\$ है

n\k| 1  2  3  4  5   6   7   8   9  10  11  12
---+----------------------------------------------
 1 | 1  .  .  .  .   .   .   .   .   .   .   .
 2 | 1  2  .  .  .   .   .   .   .   .   .   .
 3 | 1  1  5  .  .   .   .   .   .   .   .   .
 4 | 1  1  1  6  .   .   .   .   .   .   .   .
 5 | 1  1  1  3  9   .   .   .   .   .   .   .
 6 | 1  1  1  1  1  10   .   .   .   .   .   .
 7 | 1  1  1  1  5   1  13   .   .   .   .   .
 8 | 1  1  1  1  1   1   5  14   .   .   .   .
 9 | 1  1  1  1  1   5   1   1  17   .   .   .
10 | 1  1  1  1  1   3   1   3   1  18   .   .
11 | 1  1  1  1  1   1   5   1   5   5  21   .
12 | 1  1  1  1  1   1   1   1   5   1   1  22

यह एक कोड-गोल्फ चुनौती है, इसलिए सबसे छोटा कोड जीतता है।

जवाब

6 ovs Oct 17 2020 at 22:56

05AB1E , 10 8 बाइट्स

LDI-*`¢O

इसे ऑनलाइन आज़माएं!

टिप्पणी की :

          # implicit input: [n, k]
L         # for both values take the [1..x] range
          #   [[1,...,n], [1,...,k]]
 D        # duplicate this list
  I       # push the input [n,k]
   -      # subtract this from the ranges
          #   [[1-n,...,n-n], [1-k,...,k-k]]
          #  =[[-n+1,...,0], [-k+1,...,0]]
    *     # multiply with the ranges
          #   [[1*(-n+1),...,n*0], [1*(-k+1),...,k*0]]
     `    # push all lists of this list on the stack
      ¢   # count the occurences of each value of one list in the other
       O  # sum those counts
14 ovs Oct 17 2020 at 22:06

पायथन 2 , 66 59 बाइट्स

lambda n,k:sum(a%n*(n-a%n)==a/n*(k-a/n)for a in range(n*k))

इसे ऑनलाइन आज़माएं!

प्रत्येक संभव आयत के अंदर \$n \times k\$-दंगे को दो पूर्णांकों द्वारा निर्दिष्ट किया जा सकता है, \$0 \le a \lt n\$और \$0 \le b \lt k\$:

एक आयत दी सत्यापित करने के लिए \$a\$और \$b\$, यह जांचने के लिए पर्याप्त है कि क्या एक कोण एक सही कोण है। ऐसा करने के लिए मैं \ के डॉट उत्पाद लेता हूं$\binom{b}{0}-\binom{0}{a}=\binom{-b}{a}\$और \$\binom{k-b}{n}-\binom{0}{a}=\binom{k-b}{n-a}\$यह देखने के लिए कि क्या कोण \ _ पर है$\binom{0}{a}\$ एक समकोण है:

$$ \langle \left( \begin{matrix} -b \\ a \\ \end{matrix}\right), \left(\begin{matrix} k-b \\ n-a \\ \end{matrix} \right) \rangle = 0 \\\Leftrightarrow a\cdot(n-a)-b\cdot(k-b)=0 \\\Leftrightarrow a\cdot(n-a)=b\cdot(k-b) $$

4 Noodle9 Oct 18 2020 at 00:41

सी (जीसीसी) , 63 61 बाइट्स

सेविंग के लिए 2 धन्यवाद !!!

s;a;f(n,k){for(s=a=n*k;a--;)s-=a%n*(n-a%n)!=a/n*(k-a/n);a=s;}

इसे ऑनलाइन आज़माएं!

पोर्ट ऑफ OVS के अजगर जवाब ।

4 TomerShetah Oct 18 2020 at 13:19

स्काला , 65 64 60 51 बाइट्स

n=>k=>0 to n*k-1 count(a=>a%n*(n-a%n)==a/n*(k-a/n))

इसे ऑनलाइन आज़माएं!

  • -1 उपयोगकर्ता के लिए धन्यवाद !
  • -4 ओव्स के लिए धन्यवाद !
  • -9 Kjetil के लिए धन्यवाद !
3 Neil Oct 17 2020 at 22:18

चारकोल , 21 बाइट्स

NθNηIΣEθ№Eη×λ⁻ηλ×ι⁻θι

इसे ऑनलाइन आज़माएं! लिंक कोड के वर्बोज़ संस्करण के लिए है। स्पष्टीकरण: गणना \$ x(n-x) \$के लिए \$ 0 \le x < n \$और \$ y(n-y) \$के लिए \$ 0 \le y < k \$और दोनों सूचियों में एक पूर्णांक दिखाई देने वाले समय की संख्या को गिना जाता है, जो निर्देशांक \ के साथ समांतरभुज से मेल खाती है$ (x, 0), (0, y), (n - x, 0), (0, k - y) \$ 90 डिग्री कोण वाले:

NθNη

इनपुट \$ n \$और \$ k \$।

IΣ

सभी मैचों के कुल योग का आउटपुट मिला।

Eη×λ⁻ηλ

गणना \$ y(n-y) \$के लिए \$ 0 \le y < k \$।

Eθ№...×ι⁻θι

गणना \$ x(n-x) \$के लिए \$ 0 \le x < n \$ और गिनें कि प्रत्येक पूर्णांक दूसरी सूची में कितनी बार दिखाई देता है।

3 Arnauld Oct 17 2020 at 22:05

जावास्क्रिप्ट (ईएस 6),  63 58  56 बाइट्स

@ ब्वॉयज के लिए 2 बाइट्स को सहेजा गया

(n,y=x=0)=>g=k=>(x=x||++y*k--&&n)&&(y*k==--x*(n-x))+g(k)

इसे ऑनलाइन आज़माएं!

2 Neil Oct 18 2020 at 09:14

रेटिना , 45 बाइट्स

\d+
*
L$w`(_+) (_+) $.`*$1=$.2*$' m`^(.*)=\1$

इसे ऑनलाइन आज़माएं! लिंक में परीक्षण सूट शामिल है। अंतरिक्ष-पृथक इनपुट लेता है। स्पष्टीकरण:

\d+
*

इनपुट्स को यूनीरी में बदलें।

L$w`(_+) (_+)

सभी सबस्ट्रिंग का मिलान करें _ _। यह \ $ 0 \ le x <n \ $ और \ $ 0 \ le y <k \ $ के सभी जोड़े से मेल खाता है जो स्ट्रिंग के आरंभ और अंत में बेजोड़ भागों द्वारा दर्शाए गए हैं $`और $'क्रमशः \ n n - x हैं \ $ और \ $ k - y \ $ क्रमशः $1और द्वारा प्रतिनिधित्व किया $2जाता है।

$.`*$1=$.2*$'

प्रत्येक जोड़ी के लिए, (unary) उत्पादों की सूची \ $ x (n - x) \ $ और \ $ y (k - y) \ $ ।

m`^(.*)=\1$

समय की गिनती करें कि वे समान हैं।

2 JonathanAllan Oct 18 2020 at 18:34

जेली , 8 बाइट्स

r1×ḶċⱮ/S

एक मोनडिक लिंक जो पूर्णांकों की एक जोड़ी को स्वीकार करता है जो गणना करता है।

इसे ऑनलाइन आज़माएं! या परीक्षण-सूट देखें ।

कैसे?

r1×ḶċⱮ/S - Link [n,k]
r1       - ([n,k]) inclusive range to 1 = [[n,n-1,...,1],[k,k-1,...,1]]
   Ḷ     - lowered range ([n,k]) = [[0,1,...,n-1],[0,1,...,k-1]]
  ×      - multiply = [[n×0,(n-1)×1,...,1×(n-1)],[k×0,(k-1)×1,...,1×(k-1)]]
      /  - reduce by - i.e.: f(A=[n×0,(n-1)×1,...,1×(n-1)], B=[k×0,(k-1)×1,...,1×(k-1)])
     Ɱ   -   map with - i.e.: [f(A,v) for v in B]
    ċ    -     count occurrenes (of v in A)
       S - sum
1 AZTECCO Oct 18 2020 at 13:06

हास्केल , 53 47 बाइट्स

a#b=sum[1|x<-[1..a],y<-[1..b],x*(a-x)==y*(b-y)]

इसे ऑनलाइन आज़माएं!

  • @Ovs के लिए 6 धन्यवाद सहेजे गए

हम उस अभिव्यक्ति का उपयोग करते हैं x/(b-y)==y/(a-x)जिसे x*(a-x)==y*(b-y)मोडुलो चेक से बचने के लिए परिवर्तित किया गया है।

अभिव्यक्ति पक्षों (दूसरे उल्टे) के बीच के अनुपात की गणना करती है जिसे एक मान्य आयत होने के लिए समान होना चाहिए।

1 NahuelFouilleul Oct 18 2020 at 20:33

पर्ल 5 , ( -p -Minteger) 54 बाइट्स

/ /;$_=grep$_%$'*($'-$_%$')==$_/$'*($`-$_/$'),1..$`*$'

इसे ऑनलाइन आज़माएं! एक ही सूत्र का उपयोग करना, और रेंज उत्पाद को अंडाकार के रूप में छोड़कर सीमा 1 से शुरू होती है

KevinCruijssen Oct 19 2020 at 08:27

जावा 8, 75 बाइट्स

n->k->{int r=0,a=n*k;for(;a-->0;)if(a%n*(n-a%n)==a/n*(k-a/n))r++;return r;}

पोर्ट ऑफ @ovs 'पायथन 2 का जवाब है , इसलिए उसे उभारना सुनिश्चित करें!

इसे ऑनलाइन आज़माएं।

Bubbler Nov 11 2020 at 07:58

फोर्थ (gforth) , 72 बाइट्स

: f 0e over 0 do dup 0 do
2dup i - i * swap j - j * = s>f f- loop loop ;

इसे ऑनलाइन आज़माएं!

फिर भी ओव्स पायथन 2 उत्तर का एक और पोर्ट , सिवाय इसके कि यह नेस्टेड छोरों का उपयोग करता है। कई प्रतियों की आवश्यकता होने पर डायरेक्ट लूप काउंटर बहुत सस्ता होता है।

n kमुख्य स्टैक से लेता है और एफपी स्टैक के माध्यम से गिनती लौटाता है।

: f ( n k -- f:cnt )
  0e               \ setup the initial count
  over 0 do        \ outer loop (j): 0 to n-1
    dup 0 do       \ inner loop (i): 0 to k-1
      2dup         \ ( n k n k )
      i - i * swap \ ( n k i*[k-i] n )
      j - j * =    \ ( n k i*[k-i]==j*[n-j] ) Forth boolean is 0/-1
      s>f f-       \ increment count if equal
    loop
  loop
;