Bu piramidi kur


21

Piramidin

İnşa etmeni istediğim piramit tamamen küplerden oluşuyor. 24 katmana sahiptir, ve N inci üst tabaka, N içeren 2 küp K kare ile bir N düzenlenmiş. Piramit şöyle gözüküyor:

Piramit

Piramidi inşa etmek için bir küp kaynağa ihtiyacınız olacak. Buna benzer şekilde 70'e 70 karede düzenlenmiş 4900 küp verilir:

Kare

(Tamam, meydanın resminin tamamen gereksiz olduğunu itiraf ediyorum.)

1 2 + 2 2 + 3 2 + ... + 24 2 = 70 2'den beri, piramidi oluşturmak için tam olarak doğru küp sayısına sahipsiniz. Tek yapman gereken bana her küpün nereye gitmesi gerektiğini söylemek.

Senin görevin

Kare içindeki küpler ile piramitteki küpler arasında rastgele bir seçim yapmalısınız. (Cevabınız, kullandığınız 4900! Farklı tekliflerden hangisini kullandığınızı söylemesi iyi olurdu.)

Ardından, aşağıdakileri yapan bir işlev veya program yazın:

  • Bir küpün 70'e 70 karedeki konumu göz önüne alındığında (bir çift koordinat olarak (X,Y)),
  • Konumunu piramitte çıkar (üçlü koordinat olarak (A,B,C)).

Giriş ve çıkış koordinatlarının tümü 0 indeksli veya 1 indeksli olabilir. 1 indeksli farz edersek, girişiniz (X,Y)1 ile 70 arasında bir tam sayı (A,B,C)olacaktır. Çıktınız bir tamsayı olacaktır; Aüstten sayma (1 ile 24 arasında) (B,C)katman olmalı ve o kattaki o küpün koordinatları ( 1 ile 24 arasında) olmalıdır A.

Örneğin:

  • Piramidin üst küpünün koordinatları vardır (1,1,1).
  • Piramidin bazın dört köşesi vardır koordinatları (24,1,1), (24,1,24), (24,24,1)ve (24,24,24).
  • Karenin köşelerini piramidin köşelerine yerleştirmeye karar verirseniz, girişte (70,1)çıktı verebilirsiniz (24,24,1).

(X,Y)Girdi olarak yalnızca geçerli koordinatlar verileceğini varsayabilirsiniz . Doğruluk tamamen aşağıdaki kural tarafından belirlenir: iki farklı geçerli giriş her zaman iki farklı geçerli işlem vermelidir.

Bu : en kısa kod kazanır.

Yanıtlar:


7

Jöle , 15 14 bayt

24p;€$€Ẏ
ḅ70ị¢

Çevrimiçi deneyin!

Bu oldukça basittir: Piramit içindeki küplerin koordinatlarının listesini gerçek bir liste olarak oluştururuz. O zaman tek yapmamız gereken kare içindeki giriş koordinatlarını, temel dönüşüm yoluyla yapılması önemsiz olan listedeki bir endekse sokmak.

Bu gönderi tam bir program olarak çalışır (koordinatları [x, y]ilk komut satırı argümanı ile alarak ve standart çıktıda çıktı alarak) veya dolaylı olarak adlandırılan bir işlev olarak çalışır 2Ŀ.

açıklama

Listeyi oluşturmak

241 ile 24 arasında yer alan bir aralık olarak yorumlanan sayı ile başlıyoruz (çünkü onu bir listemiş gibi kullanmaya çalışıyoruz). Sonra üzerinde yineliyoruz; Programdaki son şey budur. Her bir eleman için, n listesinin:

  • Biz çiftleri listesini oluşturmak x , y , her eleman .. 1 gelir , n ; pelemanların iki grup verilen çiftlerinin listesini oluşturur ve yalnızca bir değer (burada mevcuttur çünkü n ), örtülü olarak hem bu nedenle .. 1'den bir liste haline hem setleri için kullanılır n .
  • Biz eklemek n (yine anda elimizdeki tek değer) listenin her bir elemanına ( ;€).
  • İkinciyi , bu işlemlerin her ikisini de n'ye uygulayabilmek için (yani iki talimat içeren bir döngü oluşturmak için), $iki talimatı bir grup halinde gruplamak için kullanırız .

Sonunda, listeyi tek bir aşamada düzleştirmek, sırayla tüm koordinatları içeren bir liste almak için kullanıyoruz. Bu şekilde başlar:

[1, 1, 1], [1, 1, 2], [1, 2, 2], [2, 1, 2], [2, 2, 2], [1, 1, 3], [1 , 2, 3], [1, 3, 3], [2, 1, 3], [2, 2, 3], [2, 3, 3], [3, 1, 3], [3, 2 , 3], [3, 3, 3], [1, 1, 4], [1, 2, 4], [1, 3, 4], [1, 4, 4], [2, 1, 4 ], [2, 2, 4], [2, 3, 4], [2, 4, 4], [3, 1, 4], [3, 2, 4], [3, 3, 4], [3, 4, 4], [4, 1, 4], [4, 2, 4], [4, 3, 4], [4, 4, 4],…

ve [24, 24, 24] ile biter.

Listenin endekslenmesi

Giriş koordinatlarını bir sayı 70 tamsayısı olarak yorumlayarak sayıya dönüştürerek başlarız: ḅ70. Bu bize 71 ila 4970 dahil bir değer verir; Tüm bu değerler benzersiz mod 4900'dür. Listeye dizini ekler , bu sayede bize 70. elementi (yani cevap için önceki elementi) veren [1, 1]71. elementi, [1, 2]72. elementini veririz [70, 70]. [1, 1]). Son olarak, sadece bir ihtiyaç ¢endeksine (; ne olduğunu bu durumda, önceki çizgi ile belirtilen liste hangi liste bize ¢yapar, hiçbir argüman önceki çizgi çalıştırın).



6

PHP, 75 82 78 bayt

0 dizinli :

P = X * 70 + Y ayarını yapın, ardından doğru katmana doğru yürürken P'yi A 2 ile azaltın . A-1; P / A; P% A - bitti.

(ters: A'yı doğru katmana artırırken: P = P + A 2 sonra P = P + A * B + C -> X = P / 70, Y = P% 70)

for($p=$argv[1]*70+$argv[2];$p>=++$a**2;$p-=$a**2);echo$a-1,_,$p/$a|0,_,$p%$a;

Çalıştır php -nr '<code>' <X> <Y>; A_B_C yazdırır.

1 indeksli, 82 bayt :

for($p=$argv[1]*70+$argv[2]-71;$p>++$a**2;$p-=$a**2);echo$a,_,$p/$a+1|0,_,$p%$a+1;

1
P yerine X * 70 + Y ayarını yapmamalı mıydın?
Misha Lavrov

4

Python, 80 73 72 bayt

İlk başvuru, çok sert olmayın q:

0 endeksli

lambda x,y:[(a-1,b//a,b%a)for a in range(25)for b in range(a*a)][70*x+y]

Tüm piramit koordinatlarıyla bir 4900 uzunluk listesi oluşturur ve her giriş için farklı bir liste girişi döndürür.

Çevrimiçi deneyin!


Siteye hoş geldiniz ve ilk mesajınız güzel! Burada çözümünüzü golf yapmaya çalışmak isteyen Python golfçüleri var ve umarız PPCG'den hoşlanırsınız!
caird coinheringaahing

Sen kısaltabilir a**2için a*abir bayt kaydedin.
Luke

Vay, bu basit bir tane. Teşekkürler.
PattuX


3

C 89 , 87 , 82 , 71 bayt

Xnor'ın Python çözümü aldı ve linebreak

p(x,y){for(x=-70*y-x,y=1;x<0;x+=++y*y);printf("%d %d %d",~-y,x/y,x%y);}

0 endeksli

z;p(x,y){for(x+=y*70+1,y=z=0;z<x;z+=++y*y);z-=x;printf("%d %d %d\n",y-1,z/y,z%y);}

1 endeksli

z;p(x,y){for(x+=~-y*70,y=z=1;z<x;z+=++y*y);z-=x-y;printf("%d %d %d\n",y,z/y,z%y+1);}

1 indeksli versiyonda z / y + 1 olması gerektiğini düşünüyorum.
Titus

@Titus Neden olduğunu bilmiyorum, OP'nin sorusuyla aynı şekilde uyuyor
PrincePolka

2

Toplu iş, 103 bayt

@set/an=%1*70+%2,i=0
:l
@set/an-=i*i,j=i,i+=1,k=n%%i,l=n/i
@if %l% geq %i% goto l
@echo %j% %k% %l%

0 endeksli. Yukarıdan başlayarak her katman boyunca çalışır.


2

J, 37 bayt

FrownyFrog sayesinde -4 bayt

(a:-.~,(<:,&.>{@;~&i.)"0 i.25){~70&#.

Jelly yönteminin J'ye oldukça açık bir şekilde çevrilmesi 0 dizin oluşturma kullanır. İlk piramit kare ilk. Tabanın sağ alt köşesi sonuncudur.

Kodun çoğunluğu, üçlü endekslenmiş listeyi sabit olarak üretmek için kullanılan bir levhadır. 2 eleman girişine dayanarak bu listedeki doğru elemanı bulmak, basitçe 70 tabanından çeviri yapmaktır.70&#.

Çevrimiçi deneyin!


(#~~:&a:)->a:-.~
FrownyFrog

@ FrownyFrog Teşekkürler. J'de bana sıkça olduğu gibi, bu numarayı daha önce kullandım ve bu durumda unuttum. BTW, bu sorundan ilham alan bu soruyla ilginizi çekebilir .
Jonah

1

Kabuğu , 13 bayt

!foEG▲π3Π4B70

Çevrimiçi deneyin! Endeksler 1'den başlar.

açıklama

Diğer bazı cevaplar gibi, piramit koordinatlarının tam listesini de yapıyorum ve basitçe indeksliyorum. Bunu [A,B,C], sayıların 1 ile 24 arasında olduğu (her bir baytı kaydetmek için 4! Olarak ifade edilmiştir) tüm üçlüyü listeleyerek ve hangilerini tutacağım A >= max(B,C).

!foEG▲π3Π4B70  Implicit input: a list of two numbers.
          B70  Interpret in base 70.
!              Modular index into the following list:
        Π4      Factorial of 4: 24
      π3        Take range and 3-fold Cartesian power: [[1,1,1],[1,1,2],..,[24,24,24]]
 f              Filter by
  oE            all values are equal
    G▲          in cumulative reduce by maximum.
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.