直交方向


22

タスク:文字の1つだけで構成される入力が与えられた場合、<>^v印刷可能なASCII文字(スペースからチルダまで)で構成される2番目の入力を、矢印の方向に向けて出力します。

プログラムへの2番目の入力がであると仮定しましょうABC。これがすべきことです:

  • 入力>:プリントABC
  • 入力<:プリントCBA
  • 入力^:print C\nB\nA、または入力を-90°回転します。
  • 入力v:印刷A\nB\nC、または入力を90°回転します。

テストケース

input => \n output
---
">", "thanks!" =>
thanks!
---
"<", "Hello, World!" =>
!dlroW ,olleH
---
"^", "This is text." =>
.
t
x
e
t

s
i

s
i
h
T
---
"v", "Tokyo" =>
T
o
k
y
o
---
"<", ">>>" =>
>>>

これはであるため、バイト単位の最短プログラムが優先されます。


完全なコードまたは機能?
ハイパーニュートリノ

1
@AlexL。いずれかのafaik
Downgoat

入力はすべて1つの文字列としてOKですか?>ABC
デジタル外傷

@DigitalTraumaはい、大丈夫です。
コナーオブライエン

いいえ、私はそれが重要ではないことを暗示しています。>オリエンテーションのテストケースはありません。
mbomb007

回答:


14

MATL10 6バイト

Martinのおかげで4バイト節約されました!

19\qX!

オンラインでお試しください!

19\            % implicitly take input (a character) and compute mod-19 of its ASCII code
   q           % subtract 1. Gives 17, 2, 3, 4 for the characters '^<v>' respectively.
               % These numbers correspond to 1, 2, 3, 4 modulo 4, and so are the numbers
               % of 90-degree rotations required by each character
    X!         % implicitly take input (string). Rotate the computed number of times
               % in steps of 90 degrees. Implicitly display

旧バージョン、モジュロ演算なし:10バイト

'^<v>'=fX!

オンラインでお試しください!

'^<v>'         % push string
      =        % implicitly take input (a char) and test for equality
       f       % find index of matching character
        X!     % implicitly take input (string). Rotate that number of times
               % in steps of 90 degrees. Implicitly display

1
くそー、私は13バイトを本当に誇りに思っていましたが、入力に3バイト、回転に6バイトが必要です...まあ...あなたはmod 11トリックで何かを保存することもできます(逆に回転する必要があります) 。
マーティンエンダー

@MartinBüttnerいいね!私の場合(あなたのですか?)、mod 19の方が良いと思います。1を直接引くと1,2,3,4(mod 4)が得られるからです。ヒントをありがとう!
ルイスメンドー

6
4バイトより短く、どのような地球上の...
マーティン・エンダー

2
私は公式にMATLを「めちゃくちゃ短い言語のリスト」に載せています。
コナーオブライエン

12

Python 3、64 51 48バイト

xnorのおかげで6バイト節約されました。

Lynnのおかげで7バイト節約されました。

pythonのDSMとMorganのおかげで3バイト節約されまし

lambda c,s:'\n'[c<'?':].join(s[::1|-(c in'<^')])

この関数は、からの文字の1つを<>^v最初の引数として受け入れ、文字列を2番目の引数として回転させる必要があります。


より読みやすいバージョンは次のとおりです。

lambda c, s: ('\n' if c in '^v' else '').join(s[::-1 if c in'<^' else 1])

PPCGへようこそ!それが役立つ場合は、2つの別々の入力も許可されます。(私はpythonを知らない、これは単なる推測です。)
コナーオブライエン

たぶんs[1|-(c in'<^')]sep='\n'*(c in'^v')
リン

印刷ではなく、sepでlambda使用すれば、すべてを行うことができると思いますjoin
-xnor

なぜそれをcwにしたのですか?
コナーオブライエン

1
私はこの答えが大好きです。これは私のお気に入りの答えです。

8

Haskell、57バイト

f">"=id
f"<"=reverse
f"v"=init.((:"\n")=<<)
f _=f"<".f"v"

使用例:f "v" "ABC"-> "A\nB\nC"

方向>はidendity関数であり、<引数を反転vし、文字列内の各文字に改行を追加し、最後の文字を削除してから^v続き<ます。


6

Japt、9バイト

VzUc %B+1

@DonMuesliの答えに触発されましたが、CJamの1つがまったく同じ手法を使用していることに気づきました。オンラインでテストしてください!

使い方

           // Implicit: U = arrow char, V = text
  Uc %B    // Take the char code of U, mod 11.
           // This converts ">", "v", "<", and "^" to 7, 8, 5, and 6, respectively.
Vz     +1  // Add one and rotate V by 90° clockwise that many times.

o_oいいね!200%以上o_Oによってjolfをアウトゴルフしました
コナーオブライエン

しかし、エラーが発生していますか?Error: Japt.stdout must be sent to an HTMLElementなど
コナーオブライエン

CᴏɴᴏʀO'Bʀɪᴇɴ@わからないことがなぜ起こるか、それは>たくさん起こる:(リロードいつも私のためにこれを修正。
ETHproductions

案の定、問題は修正されました。私は感銘を受けて!
コナーオブライエン

これらの回転関数が最終的に有用になることはわかっていました+1
Downgoat

4

CJam、13バイト

l(iB%{W%z}*N*

入力は、回転する文字列が直接続く方向文字です。

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

説明

モジュロマジックのイェーイ。11を法とする4文字を取得すると、次のようにマッピングされます。

> 7 
v 8 
< 5
^ 6

これらはすべて4を法とする個別の値であり、さらに重要なことには、これらはきちんと増加しています3, 0, 1, 2。つまり、の結果を使用して、mod 11どのくらいの頻度で回転するかを決定できることを意味します(mod 4とにかく4つの回転はノーオペレーションなので、明示的なを必要としません)。通常、これらの数値を1ずつオフセットする必要があるため、>実際には結果が得られ8ず、操作は行われませんが、私がそれらを回転させる方法では、最初のアプリケーションで文字列を実際に反転させ、常に1つの回転を無料で取得します。

l    e# Read input.
(i   e# Pull off the first character and convert to its character code.
B%   e# Modulo 11.
{    e# That many times...
 W%  e#   Reverse... on the first iteration this reverses the string. Afterwards
     e#   we'll have an Nx1 or 1xN grid of characters on the stack, where
     e#   this reverses the rows instead.
 z   e#   Transpose. On the first iteration, this simply wraps the string in
     e#   array, turning it into a grid without changing its orientation further
     e#   beyond the reversal that just happened. On subsequent iterations, a
     e#   transpose combined with reversing the rows rotates the grid 90 degrees
     e#   clockwise.
}*
N*   e# Join with linefeeds.


3

ジュリア、51バイト

f(d,s)=join(d"<^"?reverse(s):s,d"^v"?"\n":"")

これは、Char文字列と文字列を受け取り、文字列を返す関数です。

ましょうd方向を示すs文字と文字列になります。場合はd左またはアップされ、我々はの逆を使用してsそれ以外の場合は、我々が使用し、s与えられました。d左または右の場合は空の文字列としてセパレータを構築し、d上または下の場合は改行を構築します。に文字列と区切り文字を渡すと、文字列のjoin各文字の間に区切り文字が挿入され、文字列が返されます。

すべてのテストケースをオンラインで検証する


3

Bash + GNUユーティリティ、67

(egrep -q '>|v'<<<$1&&cat||rev)|(egrep -q '<|>'<<<$1&&cat||fold -1)

私はあなたが後にスペースを必要と推測していないだろう-qさんが、あなたがやる

3

JavaScript(ES6)、76 67 65バイト

(a,b)=>(/v|>/.test(a)?[...b]:[...b].reverse()).join(a>`>`?`
`:``)

@Alex A.のJulia回答のポート。編集:@ETHproductionsのおかげで9バイト保存されました。@ edc65のおかげで2バイトを別々に保存しました。


/[v^]/.test(a)=>'Z'<a
ETHproductions

+1?「リバース」:「スライス」の天才
-edc65

@ edc65おっと、誤って古いバージョンをコピーしました。退屈な?:バージョンは1バイト短くなりました。
ニール

(/v|>/.test(a)?[...b]:[...b].reverse())...65
edc65

3

Perl、54 51 + 1 = 52バイト

@.=<>=~/./g;@.=reverse@.if/[<^]/;$,=$/x/[v^]/;say@.

-nフラグと無料が必要です-M5.010| -E。次のように入力しますdirection\nline

$ perl -nE'@.=<>=~/./g;@.=reverse@.if/[<^]/;$,=$/x/[v^]/;say@.' <<< $'^\nhello'
o
l
l
e
h

私はそれ$/x/[v^]/が置換のように見えるのが好きです。

使い方:

                                                    # -n read first line into $_
@.=<>=~/./g;                                        # Read next line and split
            @.=reverse@.if/[<^]/;                   # Reverse `@.` if matches 
                                                    # `<` or `^`
                                 $,=                # An array will be concatena-
                                                    # ted with the value of 
                                                    # `$,` when printed. 
                                     $/             # Contains a newline
                                        /[v^]/      # boolean 
                                       x            # "\n" x 1 -> "\n"
                                                    # "\n" x 0 -> ""
                                              say@. # Print the array

2

PowerShell、84バイト

param([char]$a,$b)($b[($c=$b.length)..0],$b[0..$c])[$a%7-eq6]-join("","`n")[90-lt$a]

これは、PowerShellに慣れていない人にとっては完全に意味不明です。それを見ていきましょう。

入力を受け取りparam([char]$a,$b)、明示的に文字にキャストします$a。プログラムの残りは1つのステートメントです。前半から始めましょう-join

新しい動的配列(...,...)を作成し、にインデックスを付けてい$a%7-eq6ます。ASCII値のためv>している11662、それぞれ、および116%7 = 62%7 = 6、それらがダウンし、右に「増やす」という二つの方向です。それがあれば、-eqである$true、私たちは第2の値、取るよ$b[0..$c]、またはの文字の配列$b終わりまでに$c最初の値から値を取得します$b[($c=$b.length)..0]。これは、入力文字が^またはの場合に選択されます<(つまり、文字列を逆方向に通過します)。重要なのは、2番目の値を選択しても、$c値は計算されて保存されるため、このようなショートカットとして再利用できることです。

そのため、文字の配列が前後に移動しました。次に、-joinこれらの文字と別の動的配列インデックスの結果を組み合わせます。今回は、のASCII値$aが以下であるかどうかに基づいて選択しています90(多くの値が機能するため、これを選択したのはその理由だけです)。ため><の両方が以下の値を有する90-ltであり$false、我々は、空の文字列を選択するように""、したがってチャーアレイが単に連結されます。それ以外の場合は、改行文字を選択し"`n"てchar-arrayを改行と結合します。

この結果の文字列はパイプラインに残り、出力は暗黙的です。

PS C:\Tools\Scripts\golfing> .\orthogonal-orientation.ps1 "^" "TimmyD"
D
y
m
m
i
T

2

C、123の 119 117 114バイト

ゴルフ:

f(char*d,char*a){char*b=a,c=*d%21,s[3]={0,c&8?10:0};while(*++b);while(*s=c&4?*a++:*--b)printf(s);if(c&16)puts(b);}

テストプログラム、説明とやや手付かずのコード:

#include <stdio.h>
#include <stdlib.h>

// c     c%21   
// <    10010     => if(c&8), vertical; if(c&16), horizontal
// >    10100     => if(c&4), backwards
// ^    01010
// v    01101
int f(char*d,char*a){
    char *b=a,c=*d%21,s[3]={0,c&8?10:0};
    while(*++b);     // b = a + strlen(a) - 1; this is shorter
    while(*s=c&4?*a++:*--b)printf(s);
    if(c&16)puts(b); // single trailing newline if horizontal
}

int main() {
    char *c="<>^v";
    for(;*c;c++) { 
        printf("--- %c ---\n", *c); 
        f(c,"hello world!"); 
    }
    return 0;
}

ヒントを歓迎します!


2

網膜、60バイト

ゴルフが必要...

$
¶
+`^([<^].*)(.)(¶.*)
$1$3$2
¶

.
$&¶
+`([<>].*)¶
$1
^.¶?

入力はすべて1つの文字列として^ABCです(例:)。

  • ^またはの場合<、文字列を逆にします
  • すべての文字の後に改行を挿入する
  • <またはの場合>、改行を削除します

オンラインでお試しください。


retina.tryitonline.net/…1バイトを保存します(そして、追加の後続の改行を取り除きます)
Martin Ender

2

Dyalog APL、15バイト

⌽∘⍉⍣(11|⎕UCS⍞)⍪

1列のテーブルにメイクストリング
⍣(‍... )リピート(N)回 列入力取得
⎕UCSUCSコードポイントに変換を
11|11で割ったときの分割休息
⌽∘⍉回転-90°(フリップ転置)

別の方法(同じ長さ):

⌽∘⍉⍣('<^>v'⍳⎕)⍪

評価された入力を取得します(たとえば、 '^'または必要な文字を返すプログラム/変数の名前を入力する必要があります)
'<^>v'⍳文字列へのインデックス


1

Jolf、22バイト

ここで試してみてください!に置き換える必要がƒあり\x9fます。刺し傷を取り、次に指向性キャラクターを取ります。

.‘I_IγƒGIE_γ’ i"><v^"i
 ‘                      golfy array
  I                     the input
   _I                   input reversed
      ƒGIE              split by "" and join by newlines
     γ                  γ = that
          _γ            gamma reversed
.            _i"><v^"i  get the respective index

1

JavaScriptのES6、91の 83 84バイト

(a,b)=>[b,(c=[...b].reverse()).join``,[...b].join`
`,c.join`
`]["><v^".indexOf‌​(a)]

必要な文字列を作成し、a存在するインデックスを取得します。indexOfこれ^は、正規表現トークンであるため使用されます。ETHproductionsのバグ修正と削られたバイトに感謝します!


f("v","abc")c\nb\na私に戻ります。
ETHproductions

ここに私のために働く84バイトのものがあります:(a,b)=>[b,(c=[...b].reverse()).join``,[...b].join`\n`,c.join`\n`]["><v^".indexOf(a)]
ETHproductions

@ETHproductionsありがとう!私cは文字通り忘れていましたd
コナーオブライエン

興味深いことに、オブジェクトのインデックスを作成しようとしましたが、その長さはまったく同じでした。
ニール

1

JavaScript(ES6)71

(a,b)=>([...b].map(c=>(a>'A'?c+=`
`:0,r=/v|>/.test(a)?r+c:c+r),r=''),r)

テスト

F=(a,b)=>([...b].map(c=>(a>'A'?c+=`
`:0,r=/v|>/.test(a)?r+c:c+r),r=''),r)  

console.log=x=>O.textContent+=x+'\n';

for(d of '<>^v') console.log(d+'\n'+F(d,'ABCDE')+'\n')
<pre id=O></pre>


1

Perl 5、67バイト

66プラス1 -p

$_=reverse if/^[<^]/;$&?s/.$//:s/.//;$&=~/[v^]/&&s/(.)(?=.)/$1\n/g

入力は、最初の文字が方向を定義する単一の文字列です。


1

DUP、48バイト

[`5/%$$a:4<&[1$][1_]?\1-[$;$][,^+a;2>['
,][]?]#]

Try it here.

引数とSTDIN入力の両方を受け取る匿名ラムダ。使用法:

0"asdf"[`5/%$$a:4<&[1$][1_]?\1-[$;$][,^+a;2>['
,][]?]#]! {make sure to put one of <>^v in STDIN}

説明

[                                               ] {lambda}
 `5/%$$a:                                         {store STDIN char (mod 5) to a}
         4<&                                      {is 0<a<4?}
            [  ][  ]?                             {conditional}
             1$                                     {if so, push 2 1's}
                 1_                                 {otherwise, push -1}
                                                    {determines whether to output in reverse or not}
                     \1-                          {swap, -1}
                        [   ][                ]#  {while loop}
                         $;$                        {if there is a char at index}
                              ,                     {output that char}
                               ^+                   {increment/decrement index}
                                 a;2>               {check if a>2}
                                     [    ][]?      {conditional}
                                      '\n,          {if so, output newline}


1

D、198バイト

import std.stdio,std.array,std.algorithm;void main(string[]a){auto x=a[2].split("");char[]y;if(canFind(["^","<"],a[1]))x.reverse;if(canFind(["v","^"],a[1]))y=x.join("\n");else y=x.join("");y.write;}

:c


少ないゴルフ:

import std.stdio;
import std.array;
import std.algorithm;

void main(string[]a) {

  auto x=a[2].split("");
  string y;

  if(canFind(["^","<"],a[1]))
    x.reverse;

  if(canFind(["v","^"], a[1]))
    y=join(x,"\n");

  else
    y=join(x,"");

  y.write;
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.