Định hướng trực giao


22

Nhiệm vụ: Đưa ra một đầu vào bao gồm chính xác một trong các ký tự <>^v, xuất đầu vào thứ hai bao gồm các ký tự ASCII có thể in (từ dấu cách sang dấu ngã), được định hướng bằng mũi tên.

Giả sử đầu vào thứ hai của chương trình là ABC. Đây là những gì nó nên làm:

  • Đầu vào >: in ABC.
  • Đầu vào <: in CBA.
  • Đầu vào ^: in C\nB\nAhoặc đầu vào xoay -90 °.
  • Đầu vào v: in A\nB\nChoặc đầu vào xoay 90 °.

Các trường hợp thử nghiệm

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
---
"<", ">>>" =>
>>>

Đây là một , vì vậy chương trình ngắn nhất tính bằng byte sẽ thắng.


Mã đầy đủ hay chức năng?
HyperNeutrino

1
@AlexL. Bạn có thể viết afaik
Downgoat

Là đầu vào tất cả dưới dạng một chuỗi OK? >ABC
Chấn thương kỹ thuật số

@DigitalTrauma Vâng, điều đó tốt.
Conor O'Brien

Không, tôi ngụ ý rằng nó không quan trọng. Bạn không có trường hợp thử nghiệm cho >định hướng.
mbomb007

Câu trả lời:


14

MATL , 10 6 byte

4 byte được lưu nhờ Martin!

19\qX!

Hãy thử trực tuyến!

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

Phiên bản cũ, không có thao tác modulo: 10 byte

'^<v>'=fX!

Hãy thử trực tuyến!

'^<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
Chết tiệt tôi thật sự tự hào về 13 byte của tôi, nhưng cần 3 byte cho đầu vào và 6 về luân ... oh well ... có lẽ bạn cũng có thể tiết kiệm một cái gì đó với mod 11lừa (bạn sẽ phải xoay theo chiều ngược lại mặc dù) .
Martin Ender

@ MartinBüttner Ý kiến ​​hay! Trong trường hợp của tôi (trong bạn?) Tôi nghĩ mod 19 tốt hơn, bởi vì sau đó trừ đi 1 trực tiếp sẽ cho 1,2,3,4 (mod 4). Cảm ơn vì tiền hỗ trợ!
Luis Mendo

6
Ngắn hơn 4 byte, những gì trên trái đất ...
Martin Ender

2
Tôi chính thức đưa MATL vào "danh sách ngôn ngữ cực kỳ ngắn".
Conor O'Brien

12

Python 3, 64 51 48 byte

Đã lưu 6 byte nhờ xnor.

Đã lưu 7 byte nhờ Lynn.

Saved 3 byte nhờ DSM và Morgan từ rất trăn.

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

Hàm chấp nhận một trong các ký tự <>^vlà đối số thứ nhất và chuỗi cần được xoay làm đối số thứ hai.


Đây là một phiên bản dễ đọc hơn:

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

Chào mừng đến với PPCG! Nếu nó giúp, bạn cũng được phép lấy hai đầu vào riêng biệt. (Tôi không biết trăn, đây chỉ là phỏng đoán.)
Conor O'Brien

Có lẽ s[1|-(c in'<^')]sep='\n'*(c in'^v')
Lynn

Tôi nghĩ rằng bạn có thể làm tất cả mọi thứ như lambdathể bạn sử dụng joinvới sep của bạn chứ không phải in.
xnor

Tại sao bạn làm cho nó cw?
Conor O'Brien

1
Tôi thích câu trả lời này, đây là câu trả lời yêu thích của tôi.
con mèo

8

Haskell, 57 byte

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

Ví dụ sử dụng: f "v" "ABC"-> "A\nB\nC".

Hướng >là chức năng idendity, <đảo ngược của nó đối số, vgắn thêm một dòng mới cho mỗi nhân vật trong chuỗi và giọt cuối cùng và ^được vtheo sau <.


6

Japt, 9 byte

VzUc %B+1

Lấy cảm hứng từ câu trả lời của @ DonMuesli, mặc dù tôi chỉ nhận thấy chiếc CJam sử dụng chính xác cùng một kỹ thuật. Kiểm tra nó trực tuyến!

Làm thế nào nó hoạt động

           // 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 công việc tốt Bạn đã vượt qua jolf hơn 200% o_O
Conor O'Brien

Nhưng tôi đang bị lỗi? Error: Japt.stdout must be sent to an HTMLElementv.v.
Conor O'Brien

@ CᴏɴᴏʀO'Bʀɪᴇɴ Không chắc tại sao điều đó xảy ra, nhưng nó xảy ra rất nhiều> :( Tải lại luôn khắc phục điều này cho tôi.
ETHproductions 27/2/2016

Chắc chắn, vấn đề là cố định. Tôi rất ấn tượng!
Conor O'Brien

Tôi biết rằng các chức năng xoay này cuối cùng sẽ hữu ích +1
Downgoat

4

CJam, 13 byte

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

Đầu vào là ký tự định hướng theo sau bởi chuỗi được xoay.

Kiểm tra nó ở đây.

Giải trình

Yay cho phép thuật modulo. Lấy bốn ký tự modulo 11 ánh xạ chúng tới:

> 7 
v 8 
< 5
^ 6

Đây là tất cả các modulo 4 riêng biệt và quan trọng hơn là chúng đang tăng lên gọn gàng : 3, 0, 1, 2. Điều đó có nghĩa là chúng ta chỉ có thể sử dụng kết quả của việc mod 11xác định mức độ thường xuyên xoay (mà không cần một thông báo rõ ràng mod 4, vì dù sao bốn lần quay là không có tác dụng phụ). Thông thường chúng ta phải bù các số này bằng 1, sao cho >thực sự sinh ra 8và trở thành số không, nhưng cách tôi xoay chúng, thực sự đảo ngược chuỗi trên ứng dụng đầu tiên để chúng ta luôn có được một vòng quay miễn phí.

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

Julia, 51 byte

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

Đây là một hàm chấp nhận a Charvà một chuỗi và trả về một chuỗi.

Hãy dlà ký tự biểu thị hướng và slà chuỗi. Nếu dcòn lại hoặc lên, chúng tôi sử dụng ngược lại s, nếu không chúng tôi sử dụng snhư được đưa ra. Chúng tôi xây dựng một dấu phân cách dưới dạng chuỗi rỗng nếu dtrái hoặc phải hoặc một dòng mới nếu dlên hoặc xuống. Truyền chuỗi và dấu phân cách đến join, sẽ chèn dấu phân cách giữa mỗi ký tự của chuỗi và trả về một chuỗi.

Xác nhận tất cả các trường hợp kiểm tra trực tuyến



3

JavaScript (ES6), 76 67 65 byte

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

Cảng của @Alex A.'s Julia trả lời. Chỉnh sửa: Đã lưu 9 byte nhờ @ETHproductions. Đã lưu hai byte riêng biệt nhờ @ edc65.


/[v^]/.test(a)=>'Z'<a
Sản phẩm điện tử

+1? "Đảo ngược": thiên tài "cắt lát"
edc65

@ edc65 Rất tiếc, tôi vô tình sao chép một phiên bản cũ; ?:phiên bản nhàm chán ngắn hơn 1 byte.
Neil

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

3

Perl, 54 51 + 1 = 52 byte

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

Yêu cầu -ncờ và miễn phí -M5.010| -E. Có đầu vào như sau direction\nline::

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

Tôi thích điều đó $/x/[v^]/giống như một sự thay thế.

Làm thế nào nó hoạt động:

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

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

Điều này sẽ hoàn toàn vô nghĩa đối với những người không quen thuộc với PowerShell. Hãy đi qua nó.

Đưa đầu vào param([char]$a,$b), với một diễn viên rõ ràng cho nhân vật cho $a. Phần còn lại của chương trình là một tuyên bố. Chúng ta sẽ bắt đầu với nửa đầu, cho đến -join.

Chúng tôi đang tạo một mảng động mới (...,...)và lập chỉ mục vào đó $a%7-eq6. Các giá trị ASCII cho v>11662, tương ứng, và 116%7 = 62%7 = 6, và đó là những hai hướng đó "nâng cao" xuống và bên phải. Vì vậy, nếu đó -eq$true, chúng ta sẽ lấy giá trị thứ hai $b[0..$c], hoặc một mảng các ký tự $bcho đến cuối . Chúng tôi nhận được giá trị $ctừ giá trị đầu tiên, $b[($c=$b.length)..0]được chọn nếu char đầu vào là ^hoặc <(nghĩa là nó đi qua chuỗi ngược). Điều quan trọng cần lưu ý là ngay cả khi giá trị thứ hai được chọn, $cgiá trị vẫn được tính toán và lưu trữ, vì vậy chúng ta có thể sử dụng lại nó như một phím tắt như thế này.

Vì vậy, giờ chúng ta đã có một loạt các ký tự tiến hoặc lùi. Chúng tôi sau đó -joinnhững ký tự đó cùng với kết quả của một chỉ số mảng động khác. Lần này chúng tôi chọn dựa trên việc giá trị ASCII cho $abên dưới 90(thực sự rất nhiều giá trị sẽ hoạt động, tôi đã chọn giá trị này chỉ vì). Kể từ ><cả hai đều có một giá trị thấp hơn 90, những -lt$false, vì vậy chúng tôi chọn chuỗi rỗng "", và do đó các char-mảng chỉ đơn giản là nối. Mặt khác, chúng tôi chọn ký tự dòng mới "`n"để nối mảng char cùng với dòng mới.

Chuỗi kết quả này được để lại trên đường ống và đầu ra là ẩn.

Thí dụ

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

2

C, 123 119 117 114 byte

Chơi gôn

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);}

Chương trình thử nghiệm, với các giải thích và mã hơi vô căn cứ:

#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;
}

Lời khuyên chào mừng!


2

Võng mạc , 60 byte

Cần chơi gôn ...

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

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

Đầu vào là tất cả dưới dạng một chuỗi, ví dụ ^ABC.

  • Nếu ^hoặc <, đảo ngược chuỗi
  • Chèn dòng mới sau mỗi ký tự
  • Nếu <hoặc >, xóa các dòng mới

Hãy thử trực tuyến.


retina.tryitonline.net/, tiết kiệm một byte (và thoát khỏi nguồn cấp dữ liệu theo dõi bổ sung)
Martin Ender

2

APL Dyalog , 15 byte

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

làm cho chuỗi thành 1 cột bảng
⍣(‍... )lặp lại ( n ) lần nhận được chuỗi đầu vào
⎕UCSchuyển đổi sang UCS điểm mã
11|còn lại phân chia khi chia cho 11
⌽∘⍉xoay -90 ° (flip-transpose)

Phương pháp thay thế (cùng chiều dài):

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

được đánh giá đầu vào (vì vậy người ta phải nhập, ví dụ '^' hoặc tên của một chương trình / biến trả về ký tự mong muốn)
'<^>v'⍳vào chuỗi


1

Jolf, 22 byte

Hãy thử nó ở đây! Bạn nên thay thế ƒbằng \x9f. Đưa sting, sau đó là nhân vật định hướng.

.‘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 byte

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

Xây dựng các chuỗi cần thiết và có được chỉ mục anằm trong. indexOfĐược sử dụng vì ^là mã thông báo regex. Cảm ơn ETHproductions cho sửa lỗi và cạo byte!


f("v","abc")trả lại c\nb\nacho tôi
Sản phẩm ETH

Đây là một byte 84 byte phù hợp với tôi:(a,b)=>[b,(c=[...b].reverse()).join``,[...b].join`\n`,c.join`\n`]["><v^".indexOf(a)]
ETHproductions 27/2/2016

@ETHproductions Cảm ơn! Tôi quên clà theo nghĩa đen d.
Conor O'Brien

Vì hứng thú, tôi đã thử lập chỉ mục một đối tượng ... và hóa ra nó có cùng độ dài!
Neil

1

JavaScript (ES6) 71

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

Kiểm tra

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 byte

66 cộng một cho -p

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

Đầu vào là một chuỗi có ký tự đầu tiên xác định hướng.


1

DUP , 48 byte

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

Try it here.

Lambda ẩn danh có cả đối số và đầu vào STDIN. Sử dụng:

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

Giải trình

[                                               ] {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

Nghiêm túc, 41 byte

,' 9uc#;+"? R #'{}j #R'{}j"fs,"><v^"í@E£ƒ

Lấy chuỗi làm đầu vào đầu tiên và hướng (><v^ ) làm đầu vào thứ hai.

Hãy thử trực tuyến!


1

D, 198 byte

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


Ít chơi gôn hơn:

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;
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.