Menggulung Dadu

16

Menggulung Dadu

Jadi, saya melempar dadu beberapa waktu lalu dan memikirkan tantangan.

Diberikan kubus dengan jaring yang diambil dari input dan daftar gerakan, cari kotak di bagian bawah di bagian akhir.

Peta Kubus

Saya akan menggunakan gambar ini untuk contoh di sini.

Memasukkan

Anda menerima string dengan daftar gerakan. String hanya berisi huruf ASCII kapital N, S, W, dan E. Ini terkait dengan menggulung kubus satu langkah ke arah itu.

Dalam gambar, satu N akan membuat wajah bagian bawah 6. Dalam gambar ini, Utara jauh dari kamera, Selatan menuju, Timur kanan, dan Barat kiri.

Anda juga menerima string dalam format berikut: 1P 2P 3P 4P 5P 6P, di mana setiap P adalah posisi dari N, S, W, E, T, dan B. T & B berada di bagian bawah dan atas.

Angka-angka adalah wajah dengan nomor itu, dan surat itu mewakili posisi wajah itu. Jika tidak jelas, jaring akan selalu dipesan dengan nomor tersebut, jadi 1P 2P 3P 4P 5P 6P, tidak pernah 2B 1T 3N 4S 5W 6E.

Posisi dalam gambar adalah 1S 2B 3E 4W 5T 6N.

Keluaran

Program Anda harus menampilkan angka yang mewakili sisi bawah.

Uji Kasus

(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

Peraturan Lainnya

Anda juga dapat mengasumsikan kubus berada di bidang datar yang tak terbatas, mungkin dengan semacam gesekan.

Celah standar tidak diizinkan, meskipun saya tidak dapat menemukannya.

Untuk input yang tidak valid, kode Anda dapat melakukan apa pun kecuali memulai kiamat.

Karena program ini harus sesuai dengan dadu saya, itu harus sekecil mungkin. Saya menghitung dalam byte, dengan beberapa pengecualian untuk bahasa seperti Folder .

Rɪᴋᴇʀ
sumber
2
Apakah test case pertama dengan (nothing) -> 2rata - rata tidak ada jaring disediakan, atau haruskah ada jaring di suatu tempat?
Sp3000
2
" Dalam gambar, satu N akan membuat bagian bawah 2 " bukankah bagian bawah sudah 2?
paulvs
@ Sp3000, diedit, internet harus disediakan tetapi kode Anda harus mampu menangani perintah gerakan.
Rɪᴋᴇʀ
1
Anda mengukur ukuran dadu Anda dalam byte?
Cyoce
@Cyoce Tidak, hanya teks di setiap wajah. Jadi wajah dengan 🍄 di atasnya akan menjadi 4 byte. Untuk tantangan ini, saya ingin dapat mencocokkan kode yang Anda tulis pada dadu saya. Untuk melakukan itu, saya perlu kode kecil.
Rɪᴋᴇʀ

Jawaban:

8

CJam, 43 40 37 34 byte

Terima kasih kepada Dennis karena telah membantu saya menghemat 6 byte.

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

Uji di sini.

Penjelasan

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.

Adapun cara pemetaan karakter instruksi ke permutasi bekerja, berikut adalah tabel praktis:

   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]

Saya sudah memasukkan 5%kolom karena itulah yang dilakukan pengindeksan siklik ke dalam string secara implisit. Untuk empat permutasi kita dapat melihat bahwa masing-masing dari mereka meninggalkan dua (berlawanan) sisi tidak tersentuh dan secara siklikal mengubah empat lainnya.

Martin Ender
sumber
Bagaimana Anda mewakili permutasi sebagai karakter Unicode itu? Bagaimana Ĕ mewakili permutasi N [2 1 4 0 3 5]? Saya sudah menatapnya berjam-jam.
paulvs
1
@ paulvs Kode karakter Ĕis 276. 6e!memberi Anda daftar semua 720 permutasi dari [0 1 2 3 4 5]. Dan 276kebetulan indeks [2 1 4 0 3 5]dalam daftar itu.
Martin Ender
Saya berharap lebih banyak orang akan menjawab, tetapi Anda adalah yang terpendek. Selamat.
Rɪᴋᴇʀ
5

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

termasuk +1 untuk -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}

Dengan komentar:

                                    # 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.


File input:

, 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

Jalankan dengan

perl -p dice.pl < input.txt

Keluaran: 262223564


  • pembaruan 158 Menggunakan $N, $S, $E, $Wvariabel global alih-alih %t = {N=>, S=>, E=>, $W=>}menyimpan 8 byte.

  • Update 154 Sejak persyaratan adalah bahwa program keluaran angka, tidak mencetak baris baru print "$h{B}\n"menghemat 4 bytes: print $h{B}.

  • perbarui 144 Hemat 10 byte dengan melakukan

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

    dari pada

    ($s,@i)=split /,? |\n/;    %h=reverse map{split//}@i;
    
  • pembaruan 139 Memindahkan regex untuk perintah ke akhir untuk menghilangkan variabel, menghemat 6 byte.

  • perbarui 135 Hemat 4 byte, @l[0..3,0]bukan @l[1..3],$l[0].

  • perbarui 134 Hemat 1 byte dengan menggunakan penugasan @l=split//,$$_sebagai nilai.

  • perbarui 132 Hemat 2 byte dengan melakukan /^\w+/ && $&alih - alih /^(\w+)/ && $1.

  • perbarui 129 Hemat 3 byte dengan menggunakan -palih-alih -ndan menetapkan $ _ untuk dicetak.

  • Update 116 Simpan 13 byte dengan menulis ulang split//, /^\w+/ && $&ke dalam /^\w+/g.

Kenney
sumber
4

Python 2, 204 byte

Kupikir sudah waktunya untuk menanggapi pertanyaanku sendiri.

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']

Tidak terlalu pendek, tetapi bekerja.

Jalankan sebagai:

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

Sunting : Menghitung byte salah. Sekarang lebih lama. :(

Rɪᴋᴇʀ
sumber
BTW, terima kasih xnor untuk python macro.
Rɪᴋᴇʀ