Clarks Dreieck


10

Ok, ich war in letzter Zeit auf einem Dreieckskick, also hier ist noch einer.

Clark's Triangle ist ein Dreieck, bei dem der Eintrag ganz links in jeder Zeile 1 ist und der Eintrag ganz rechts aus Vielfachen von 6 besteht, die mit zunehmender Zeilennummer zunehmen. Hier ist eine Visualisierung

     1 6
    1 . 12
   1 . . 18
  1 . . . 24
 1 . . . . 30
1 . . . . . 36

Genau wie bei Pascals Dreieck sind alle anderen Einträge die Summe der Zahlen oben rechts und oben links.

Hier sind die ersten Zeilen ausgefüllt

          1   6
        1   7  12
      1   8  19  18
    1   9  27  37  24
  1  10  36  64  61  30
1  11  46  100 125 91  36

Aufgabe

Bei einer gegebenen Zeilennummer (von oben beginnend) und einer Spaltennummer (beginnend mit dem ersten Nicht-Null-Element in dieser Zeile) wird der Wert in dieser bestimmten Zelle ausgegeben. Beide Eingänge können entweder 1 oder 0 indiziert sein (Sie können mischen und anpassen, wenn Sie dies wünschen). Außerhalb der Grenzen des Dreiecks ist undefiniert und Sie können tun, was Sie möchten, wenn Sie nach diesen Werten gefragt werden.

Dies ist . Ziel ist es, die Anzahl der Bytes in Ihrer Lösung zu minimieren.

OEIS A046902


1
Können wir eine Lösung mit Null in der ersten Zeile erstellen? wie in der OEIS-Sequenz
Jörg Hülsermann

1
@ JörgHülsermann Da dies für das hier definierte Dreieck nicht möglich ist, können Sie tun, was Sie wollen.
Ad-hoc-Garf-Jäger

Antworten:


7

MATL , 15 Bytes

[lBB]i:"TTY+]i)

Die erste Eingabe ist eine 0-basierte Zeile. Die zweite ist eine 1-basierte Spalte.

Probieren Sie es online aus!

Erläuterung

[lBB]   % Push [1 6 6]
i       % Input: row number (0-based)
:"      % Repeat that many times
  TT    %   Push [1 1]
  Y+    %   Convolution, increasing size. This computes the sum of overlapping
        %   pairs, including the endpoints. So for example [1 6 6] becomes
        %   [1 7 12 6], which will later become [1 8 19 18 6], ...
]       % End
i       % Input: column number (1-based)
)       % Use as index. Implicit display


5

CJam , 22 18 Bytes

-4 Bytes dank Martin Ender

X6_]ri{0X$+.+}*ri=

Eingabe ist (0-based row) (0-based column)

Probieren Sie es online aus!

Erläuterung

X6_]  e# Push the list [1 6 6]. This is the first row, but each row will have an extra 6 at
      e# the end, which is out of bounds.
ri    e# Push the first input as an integer.
{     e# The following block calculates the next row given a row on top of the stack:
 0X$+ e#  Copy the top list on the stack and prepend 0.
 .+   e#  Element-wise addition with the list before prepending 0. This adds each element of
      e#  with the one to its left, except the initial 1 gets added to 0 and the final number
      e#  gets added to the out-of-bounds 6. The out-of-bounds 6 is unchanged since one list
      e#  is longer.
}*    e# Run this block (row index) times.
ri=   e# Get the (column index)th item of the final list.

Eine andere Technik, um paarweise Summen zu erhalten, besteht darin, eine Kopie nach links zu verschieben und zu verwenden .+. Normalerweise hat dies das Problem, dass das nachfolgende Element beibehalten wird, ohne es zu summieren (was das Entfernen von Bytes kostet), aber in diesem Fall werden tatsächlich Bytes gespart, da Sie dann nicht 6bei jeder Iteration ein hinzufügen müssen . Sie können noch mehr Bytes speichern, da das Verschieben nach links kostenlos ist, wenn Sie nur 0eine Kopie voranstellen :X6_]ri{0X$+.+}*ri=
Martin Ender

_0\+stattdessen 0X$+ist die gleiche Byteanzahl, wenn Sie es vorziehen.
Martin Ender

@MartinEnder Oh, ich verstehe, du bekommst am Ende jeder Reihe eine zusätzliche 6, die außerhalb der Grenzen liegt, also spielt es keine Rolle. Clever, danke.
Business Cat

4

C #, 157 Bytes

using System.Linq;(b,c)=>{var f=new[]{1,6};for(;c>0;c--){int s=f.Length;f=new int[s+1].Select((e,i)=>i<1?1:i==s?f[s-1]+6:f[i-1]+f[i]).ToArray();}return f[b];

Probieren Sie es online aus


3

Python 2 , 67 Bytes

a,b=input()
x=[1,6]
exec"x=map(sum,zip([0]+x,x+[6]));"*a
print x[b]

Probieren Sie es online aus!

Brute-Force-Ansatz, berechnen Sie die adritte Zeile und drucken Sie dann die bdritte Zahl. Beide Eingaben basieren auf 0


3

Python 3 , 64 60 52 Bytes

f=lambda r,c:c<2or c>r and r*6or f(r-1,c-1)+f(r-1,c)

Probieren Sie es online aus!

Rekursive Lösung mit 1-Indexierung. Gibt "True" anstelle von 1 aus, um Golf zu spielen.


Dank an:

  • @totallyhuman zum Speichern von 4 Bytes!
  • @ Rod zum Speichern von 8 Bytes!


2
52 Bytes ersetzen das if / else durch boolesche Operatoren und durch eine flexiblere Ausgabe
Rod

@ Rod, das ist eine geniale Lösung. Ich versuche immer noch, meinen Kopf darum zu wickeln, warum es funktioniert. Ich bin hier noch ziemlich neu (dies ist nur meine zweite Antwort auf der Website), daher bin ich mir hinsichtlich des Protokolls nicht sicher: Soll ich Ihre Überarbeitung in meine Antwort aufnehmen, obwohl Sie von Python 3 auf 2 gewechselt sind?
Chase Vogeli

3
@icosahedron die Python-Version ist in diesem Fall irrelevant, so dass Sie nichts dagegen haben müssen. Im Allgemeinen wird das Wechseln zwischen Python-Versionen zum Ausnutzen von Funktionen als OK angesehen.
Uriel

@ Uriel danke für die Klarstellung.
Chase Vogeli


1

Mathematica, 32 Bytes

b=Binomial;b[#,#2-1]6+b[#-1,#2]&

Eingang

[Zeile, Spalte]
[1-indiziert, 0-indiziert]


1

JavaScript (ES6), 38 Byte

f=(r,c)=>c?r>c?f(--r,c)+f(r,--c):r*6:1

Absturz für negative Spalten und Rückgabe eines Vielfachen von sechs für negative Zeilen oder übergroße Spalten.


1

C # (.NET Core) , 44 Byte

f=(c,r)=>c<=1?1:c>r?6*r:f(c-1,r-1)+f(c,r-1);

Nimmt Spalte dann Zeile, beide 1-indiziert. Kann Zeile und Spalte durch Vertauschen der Eingaben übernehmen : (r,c). Gibt row * 6für Koordinaten außerhalb der Grenzen rechts (dh column > row + 1) und 1für Koordinaten außerhalb der Grenzen links (dh column < 1) zurück.


1

PHP , 64 Bytes

rekursive Funktion

Zeilen 1-Indizierung Spalten 0-Indizierung

Die Ausgabe für Zeile = 0 und Spalte = 0 ist wie in der OEIS-Sequenz 0

function f($r,$c){return$c-$r?$c?f($r-=1,$c-1)+f($r,$c):1:$r*6;}

Probieren Sie es online aus!

PHP , 126 Bytes

Zeilen 1-Indizierung Spalten 0-Indizierung

Die Ausgabe für Zeile = 0 und Spalte = 0 ist wie in der OEIS-Sequenz 0

for(;$r<=$argv[1];$r++)for($z++,$c=~0;++$c<$z;)$t[+$r][$c]=$c<$r?$c?$t[$r-1][$c-1]+$t[$r-1][$c]:1:$r*6;echo$t[$r-1][$argv[2]];

Probieren Sie es online aus!


0

R , 77 Bytes

Reduce(function(x,y)zoo::rollsum(c(0,x,6),2),double(scan()-1),c(1,6))[scan()]

Benötigt die zooBibliothek; liest aus stdin (die Eingaben sind durch zwei Zeilenumbrüche getrennt) und gibt den Wert mit NAeiner Auswahl außerhalb der Grenzen zurück.

Probieren Sie es online aus!


0

Gelee , 13 Bytes

,"’U0¦c/x6,1S

Ein monadischer Link, der eine Liste von [row, entry](0-Indizierung für Einträge, 1-Indizierung für Zeilen) erstellt und den Wert zurückgibt.

Probieren Sie es online aus!

Wie?

,"’U0¦c/x6,1S - Link: list of numbers, [row, entry]
  ’           - decrement     -> [row-1, entry-1]
 "            - zip with:
,             -   pair        -> [[row, row-1], [entry, entry-1]]
     ¦        - sparse application of:
   U          -   upend
    0         - for indexes: 0 -> [[row, row-1], [entry-1, entry]]
       /      - reduce by:
      c       -   choose       -> [(row choose entry-1), (row-1 choose entry)]
         6,1  - 6 paired with 1 = [6,1]
        x     - times        i.e. [a, a, a, a, a, a, a, b]
            S - sum            -> 6*(row choose entry-1) + (row-1 choose entry)
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.