Zarları Yuvarlamak


16

Zarları Yuvarlamak

Bir süre önce zar atıyordum ve bir meydan okuma düşündüm.

Girişten alınan bir ağ ve hareketlerin bir listesi olan küp göz önüne alındığında, sonunda alttaki kareyi bulun.

Küp Haritası

Bu görüntüyü buradaki örnekler için kullanacağım.

Giriş

Bir hareket listesi içeren bir dize alırsınız. Dize yalnızca büyük ASCII N, S, W ve E harflerini içerir. Bunlar, küpün bu yönde bir adım döndürülmesine karşılık gelir.

Resimde, bir N alt yüzü 6 yapacaktı. Bu görüntüde, Kuzey kameradan uzakta, Güney doğru, Doğu sağda ve Batı solda.

Ayrıca aşağıdaki biçimde bir dize alırsınız: 1P 2P 3P 4P 5P 6P, burada her P, N, S, W, E, T ve B'den bir konumdur. T & B alt ve üsttür.

Sayılar bu sayıya sahip yüzdür ve harf yüzün bulunduğu konumu temsil eder. Net değilse, net her zaman sayıya göre sıralanacaktır, bu nedenle 1P 2P 3P 4P 5P 6P, asla 2B 1T 3N 4S 5W 6E.

Görüntüdeki konum 1S 2B 3E 4W 5T 6N'dir.

Çıktı

Programınız alt tarafı temsil eden bir sayı çıkarmalıdır.

Test Durumları

(nothing), 1S 2B 3E 4W 5T 6N -> 2
N, 1S 2B 3E 4W 5T 6N -> 6
NS, 1S 2B 3E 4W 5T 6N -> 2
NWS, 1S 2B 3E 4W 5T 6N -> 2
NWSNWS, 1S 2B 3E 4W 5T 6N -> 2
NWSS, 1S 2B 3E 4W 5T 6N -> 3
NNNNNN, 1S 2B 3E 4W 5T 6N -> 5
SNWEEWS, 1N 2T 3E 4W 5B 6S, 6
SNEEWS, 1N 2T 3W 4S 5B 6E, 4

Diğer Kurallar

Ayrıca, küpün muhtemelen bir çeşit sürtünme ile sonsuz düz bir düzlemde olduğunu varsayabilirsiniz.

Standart boşluklar, bulamıyorum bile, izin vermedi.

Geçersiz giriş için, kodunuz kıyameti başlatmak dışında herhangi bir şey yapabilir.

Bu program zarlarıma uyması gerektiğinden, olabildiğince küçük olmalıdır. Klasörler gibi diller için bazı istisnalar dışında bayt sayıyorum .


2
İlk test durumu (nothing) -> 2hiçbir ağın sağlanmadığı anlamına mı geliyor yoksa orada bir ağ mı olmalı?
Sp3000

2
" Resimde, bir N alt yüzü 2 yapar " alt yüzü zaten 2 değil mi?
paulvs

@ Sp3000, düzenlendi, net sağlanmalı, ancak kodunuz hiçbir hareket komutunu işleyememelidir.
Rɪᴋᴇʀ

1
Zarınızın boyutunu bayt cinsinden mi ölçtünüz?
Cyoce

@Cyoce Hayır, her yüzdeki metin. Üzerinde with olan yüz 4 bayt olur. Bu meydan okuma için, benim zar üzerine yazdığınız kodu sığdırmak istiyorum. Bunu yapmak için küçük bir koda ihtiyacım var.
Rɪᴋᴇʀ

Yanıtlar:


8

CJam, 43 40 37 34 bayt

Dennis'e 6 bayt kurtarmama yardım ettiği için teşekkürler.

lW%3/$1f=q{i8%"ÉĔɠƂ!"=i\m!=}/c

Burada test edin.

açıklama

lW%    e# Read the first line and reverse it.
S/     e# Split it around spaces.
$      e# Sort it. This puts the faces in order [B E N S T W].
1f=    e# Select the second character from each face, which is the number.
q      e# Read the remainder of the input (the instructions).
{      e# For each instruction...
  i8%  e#   Convert the character (NWSE) to an integer and take modulo 8.
  "ÉĔɠƂ!"=i
       e#   Use that to (cyclically) index this string and convert *that* character
       e#   to an integer.
  \    e#   Swap with the list of faces.
  m!   e#   Generate all permutations of the faces.
  =    e#   Select the permutation corresponding to the above integer.
}/     e# At the end of the loop, the bottom face will be the first character.
c      e# Convert the string to a character, which discards everything but the bottom face.

Talimat karakterlerinin permütasyonlarla eşleştirilmesine ilişkin olarak, burada kullanışlı bir tablo bulunmaktadır:

   i   8%  5%  ""=   i   [0 1 2 3 4 5]m!=

N  78   6   1   Ĕ   276  [2 1 4 0 3 5]
W  87   7   2   ɠ   608  [5 0 2 3 1 4]
S  83   3   3   Ƃ   386  [3 1 0 4 2 5]
E  69   5   0   É   201  [1 4 2 3 5 0]

5%Dize döngüsel dizinleme örtük olarak yaptığı için sütun dahil ettik . Dört permütasyon için her birinin iki (zıt) tarafa dokunmamış olduğunu ve diğer dördüne döngüsel olarak izin verdiğini görebiliriz.


Permütasyonları bu Unicode karakterleri olarak nasıl temsil ediyorsunuz? Ĕ N'nin permütasyonunu nasıl temsil eder [2 1 4 0 3 5]? Saatlerdir bakıyorum.
paulvs

1
@paulvs karakter kod Ĕolduğunu 276.6e!Size bir listesini verir bütün içinde 720 permütasyon [0 1 2 3 4 5]. Ve bu listedeki 276dizin olur [2 1 4 0 3 5].
Martin Ender

Daha fazla insanın cevap vermesini diledim, ama en kısaydın. Tebrikler.
Rɪᴋᴇʀ

5

Perl, 166 158 154 144 139 135 134 132 116 bayt

için +1 içerir -p

s/(\d)(.)/$h{$2}=$1/eg;$N='NTSB',$S='STNB',$E='ETWB',$W='WTEB';map{@h{@l}=@h{(@l=$$_=~/./g)[1..3,0]}}/\w/g;$_=$h{B}

Yorumlarla:

                                    # example input: "NS, 1S 2B 3E 4W 5T 6N"
s/(\d)(.)/$h{$2}=$1/eg;             # construct %h ( S=>1, B=>2, E=>3, W=>4, B=>2, N=>6 )

                                    # = Transformations =
$N='NTSB',                          # N becomes T, T becomes S, S becomes B, B becomes N
$S='STNB',
$E='ETWB',
$W='WTEB';

map {                               # iterate the moves "NS"
    @h{ @l } =                      # LHS: bulk-assign new values; @l defined in RHS
      @h{                           # RHS: init @l, transform
          (@l=$$_=~/./g)            # get transform, put ('N','T','S','B') in @l for LHS
          [1..3,0]                  # construct a rotated slice for RHS
    }    
} /\w/g;                            # match the movements in list context

$_=$h{B}                            # assign the bottom face to output.


Giriş dosyası:

, 1S 2B 3E 4W 5T 6N
N, 1S 2B 3E 4W 5T 6N
NS, 1S 2B 3E 4W 5T 6N
NWS, 1S 2B 3E 4W 5T 6N
NWSNWS, 1S 2B 3E 4W 5T 6N
NWSS, 1S 2B 3E 4W 5T 6N
NNNNNN, 1S 2B 3E 4W 5T 6N
SNWEEWS, 1N 2T 3E 4W 5B 6S
SNEEWS, 1N 2T 3W 4S 5B 6E

Şununla koş:

perl -p dice.pl < input.txt

Çıktı: 262223564


  • güncellemek 158 Kullanma $N, $S, $E, $Wglobal değişkenler yerine %t = {N=>, S=>, E=>, $W=>}8 bayt kaydeder.

  • Güncelleme 154 şartı yana Program çıktısı bir sayı, yeni satır baskı yapmadığı olmasıdır print "$h{B}\n"4 bayt kaydeder: print $h{B}.

  • 144 yaparak 10 bayt kaydet

    ($s)=/^(\w+),/;            s/(\d)(.)/$h{$2}=$1/eg;
    

    onun yerine

    ($s,@i)=split /,? |\n/;    %h=reverse map{split//}@i;
    
  • güncelleme 139 Değişkeni ortadan kaldırmak için komutun normal ifadesini sonuna kadar taşıyın ve 6 bayt kaydedin.

  • 135@l[0..3,0] yerine 4 bayt kaydet @l[1..3],$l[0].

  • güncelleştirme 134 Atamayı @l=split//,$$_değer olarak kullanarak 1 bayt kaydedin .

  • güncelleme 132/^\w+/ && $& Bunun yerine yaparak 2 bayt kaydedin /^(\w+)/ && $1.

  • güncelleme 129 kullanarak Kaydet 3 bayt -pyerine -nve baskı için $ _ atama.

  • Güncelleme 116 kaydet 13 yeniden yazarak bayt split//, /^\w+/ && $&içine /^\w+/g.



4

Python 2, 204 bayt

Kendi soruma cevap verme zamanının geldiğini düşündüm.

def x(p,m):
    d={p[3*i-2]:i for i in range(1,7)}
    for j in m:n=2if j in'NE'else-2;x='BSTN'if j in'NS'else'BETW';d[x[0]],d[x[1]],d[x[2]],d[x[3]]=d[x[1+n]],d[x[(2+n)%4]],d[x[(3+n)%4]],d[x[0+n]]
    print d['B']

Çok kısa değil, ama çalışıyor.

Olarak çalıştırmak:

x('1B 2T 3N 4S 5W 6E','SNEEWS')
#Output: 4

Düzenleme : Sayılan bayt sayısı yanlış. Şimdi daha uzun. :(


BTW, python makrosu için teşekkürler xnor.
Rɪᴋᴇʀ
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.