サイコロを転がす


16

サイコロを転がす

だから、私はさっきサイコロを転がしていて、挑戦を考えていました。

入力と動きのリストから取得されたネットを持つキューブが与えられたら、最後の下部にある正方形を見つけます。

キューブマップ

ここでは例としてこの画像を使用します。

入力

動きのリストで文字列を受け取ります。文字列には大文字のASCII文字N、S、W、およびEのみが含まれます。これらは、キューブをその方向に1ステップ移動することに対応します。

写真では、1つのNが底面を6にします。この画像では、北がカメラから離れ、南が向かっており、東が右、西が左です。

また、次の形式の文字列を受け取ります。1P2P 3P 4P 5P 6P。ここで、各PはN、S、W、E、T、およびBの位置です。TおよびBは下と上です。

数字はその数字の顔であり、文字は顔の位置を表します。明確でない場合、ネットは常に数字で順序付けられるため、1P 2P 3P 4P 5P 6P、決して2B 1T 3N 4S 5W 6E。

画像内の位置は1S 2B 3E 4W 5T 6Nです。

出力

プログラムは、下側を表す数値を出力する必要があります。

テストケース

(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

その他の規則

また、立方体が無限の平面上にあり、おそらく何らかの摩擦があると仮定することもできます。

標準の抜け穴は、私が見つけられなくても許可されていません。

無効な入力の場合、コードは黙示録を開始する以外は何でもできます。

このプログラムは私のサイコロに収まるはずなので、できるだけ小さくする必要があります。Foldersのような言語の場合を除き、バイト単位でカウントします。


2
の最初のテストケースは、(nothing) -> 2ネットが提供されていないことを意味しますか、それともどこかにネットがあるはずですか?
Sp3000

2
写真では、1つのNは底面を2にします」、底面はすでに 2ではありませんか?
paulvs

@ Sp3000、編集、ネットを提供する必要がありますが、コードは移動コマンドを処理できません。
Rɪᴋᴇʀ

1
サイコロのサイズをバイト単位で測定しますか?
チョイス

@Cyoceいいえ、各面のテキストのみ。したがって、🍄の付いた面は4バイトになります。この挑戦のために、私はあなたが私のサイコロに書いたコードに適合できるようにしたい。そのためには、小さなコードが必要です。
Rɪᴋᴇʀ

回答:


8

CJam、43 40 37 34バイト

6バイトの節約を手伝ってくれたDennisに感謝します。

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

ここでテストしてください。

説明

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.

命令文字の順列へのマッピングがどのように機能するかについて、便利な表を次に示します。

   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%、文字列への周期的なインデックス付けが暗黙的に行うことなので、列を含めました。4つの順列では、それぞれが2つの(反対の)辺をそのままにして、他の4つを周期的に順列していることがわかります。


順列をそれらのUnicode文字としてどのように表現しますか?ĔはN [2 1 4 0 3 5]の順列をどのように表しますか?私は何時間もそれを見つめてきた。
paulvs

1
@paulvsの文字コードはĔです2766e!すべての 720の順列のリストを提供します[0 1 2 3 4 5]。そして、276たまたま[2 1 4 0 3 5]そのリストのインデックスになっています。
マーティンエンダー

もっと多くの人に答えてもらいたいと思いましたが、あなたは最短でした。おめでとうございます。
Rɪᴋᴇʀ

5

Perlの、166 158 154 144 139 135 134 132 116バイト

+1を含む -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}

コメント付き:

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


入力ファイル:

, 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

で実行

perl -p dice.pl < input.txt

出力: 262223564


  • アップデート158 8バイト$N, $S, $E, $W%t = {N=>, S=>, E=>, $W=>}節約する代わりにグローバル変数を使用します。

  • 更新154要件はプログラムが数値を出力することであるため、改行print "$h{B}\n"を印刷しないと4バイト節約されますprint $h{B}

  • 更新144することで10バイト節約

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

    の代わりに

    ($s,@i)=split /,? |\n/;    %h=reverse map{split//}@i;
    
  • update 139コマンドの正規表現を最後に移動して変数を削除し、6バイトを節約します。

  • 更新135の@l[0..3,0]代わりに4バイトを保存します@l[1..3],$l[0]

  • 更新134@l=split//,$$_値として割り当てを使用して1バイトを保存します。

  • 更新132の/^\w+/ && $&代わりに行うことにより、2バイトを節約します/^(\w+)/ && $1

  • update 129印刷に$ _の-p代わりに使用し-n、割り当てて3バイトを保存します。

  • 更新116に書き換えsplit//, /^\w+/ && $&て13バイトを保存します/^\w+/g



4

Python 2、204バイト

私自身の質問に答える時だと思った。

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

それほど短くはありませんが、動作します。

として実行:

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

編集:バイト数が間違っています。長くなりました。:(


ところで、Pythonマクロをありがとうございます。
Rɪᴋᴇʀ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.