Ортогональна орієнтація


22

Завдання: Дано вхід, що складається з точно одного з символів <>^v, виведіть другий вхід, що складається з друкованих символів ASCII (від простору до тильди), орієнтований стрілкою.

Припустимо, другий вхід до програми є ABC. Це те, що він повинен робити:

  • Введення >: друк ABC.
  • Введення <: друк CBA.
  • Вхід ^: друк 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
---
"<", ">>>" =>
>>>

Це , тому виграє найкоротша програма в байтах.


Повний код або функція?
HyperNeutrino

1
@AlexL. Ви можете написати або
afaik

Чи все введене як один рядок? >ABC
Цифрова травма

@DigitalTrauma Так, це добре.
Conor O'Brien

Ні, я маю на увазі, що це не має значення. У вас немає тестового випадку для >орієнтації.
mbomb007

Відповіді:


14

MATL , 10 6 байт

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 Гарна ідея! У моєму випадку (у вашому?) Я вважаю, що мод 19 кращий, тому що тоді віднімання 1 безпосередньо дає 1,2,3,4 (мод 4). Дякую за пораду!
Луїс Мендо

6
На 4 байти коротше, що на землі ...
Мартін Ендер

2
Я офіційно ставлю MATL до "списку мов, що шалено короткий".
Conor O'Brien

12

Пітон 3, 64 51 48 байт

Збережено 6 байт завдяки xnor.

Збережено 7 байт завдяки Лінні.

Збережено 3 байти завдяки DSM та Morgan від так python.

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

Функція приймає одного з символів <>^vяк перший аргумент, а рядок, який потрібно повернути як другий аргумент.


Ось більш читаема версія:

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

Ласкаво просимо до PPCG! Якщо це допоможе, ви також можете взяти два окремі входи. (Мені невідомо пітона, це лише здогадка.)
Conor O'Brien

Можливо s[1|-(c in'<^')]іsep='\n'*(c in'^v')
Лінн

Я думаю, що ти міг би зробити все це як би, lambdaякщо використовуєш joinсеп, а не друк.
xnor

Чому ти це зробив?
Conor O'Brien

1
Я люблю цю відповідь, це моя улюблена відповідь.
кіт

8

Haskell, 57 байт

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

Приклад використання: f "v" "ABC" ->"A\nB\nC" .

Напрямок >- це функція ідеалізму, <повертає його аргумент, vдодає новий рядок до кожного символу в рядку і опускає останній ^, vа за ним слідує <.


6

Japt, 9 байт

VzUc %B+1

Натхненний відповіддю @ DonMuesli, хоча я щойно помітив, що CJam використовує абсолютно таку саму техніку. Перевірте це в Інтернеті!

Як це працює

           // 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
Conor O'Brien

Але я отримую помилки? Error: Japt.stdout must be sent to an HTMLElementтощо
Conor O'Brien

@ CᴏɴᴏʀO'Bʀɪᴇɴ Не впевнений, чому це відбувається, але трапляється багато> :( Перезавантаження завжди виправляє це для мене.
ETHproductions

Звичайно, проблема виправлена. Я перебуваю під враженням!
Conor O'Brien

Я знав, що ці функції обертання з часом можуть бути корисними +1
Downgoat

4

CJam, 13 байт

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

Вхід - це орієнтаційний символ, за яким слід безпосередньо обертати рядок.

Перевірте це тут.

Пояснення

Так, для модульної магії. Взявши чотири символи за модулем 11, вони відображають:

> 7 
v 8 
< 5
^ 6

Вони різні за модулю 4 і більше важливо , вони акуратно зростає: 3, 0, 1, 2. Це означає, що ми можемо просто скористатись результатом, mod 11щоб визначити, як часто обертатися (не потребуючи явного mod 4, оскільки чотири обертання все одно не є). Зазвичай нам доведеться змістити ці числа на 1, таким чином, що >насправді поступається 8і стає неоперативним, але те, як я їх обертаю, насправді обертає рядок у першому додатку, щоб ми завжди отримували одне обертання безкоштовно.

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":"")

Це функція, яка приймає a 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. Редагувати: Збережено 9 байт завдяки @ETHproductions. Збережено два байти окремо завдяки @ edc65.


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

+1? "Reverse": "slice" genius
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. Решта програми - одна заява. Почнемо з першого тайму, аж до -join.

Ми створюємо новий динамічний масив (...,...)і індексуємо його за допомогою $a%7-eq6. Значення ASCII для vі >є, 116і 62відповідно, і 116%7 = 62%7 = 6, і це два напрямки, які "збільшуються" вниз і вправо. Отже, якщо -eqце так $true, ми візьмемо друге значення, яке є $b[0..$c], або масив символів $bдо кінця . Ми отримуємо значення $cз першого значення, $b[($c=$b.length)..0]яке вибирається, якщо вхідний знак є ^або <(тобто, він проходить через рядок назад). Важливо відзначити, що навіть якщо вибрано друге значення, $cзначення все одно обчислюється і зберігається, тому ми можемо повторно використовувати його як ярлик, як це.

Отже, тепер у нас є масив символів, який рухається вперед або назад. Потім ми -joinці символи разом з результатом іншого індексу динамічного масиву. Цього разу ми вибираємо, виходячи з того, чи є значення ASCII $aнижче 90(дійсно багато значень спрацювало б, я вибрав це лише тому, що). Оскільки >і в <обох є значення нижче 90, так і -ltє $false, тому ми вибираємо порожній рядок "", і, таким чином, масив char просто об'єднується. В іншому випадку ми вибираємо символ нового рядка, "`n"щоб приєднатися до масиву char разом із новими рядками.

Цей результуюча рядок залишається на конвеєрі, а вихід неявний.

Приклад

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
^.¶?

Введення - це все як один рядок, наприклад ^ABC.

  • Якщо ^або <, оберніть рядок
  • Вставте нові рядки після кожного символу
  • Якщо <або >, видаліть нові рядки

Спробуйте в Інтернеті.


retina.tryitonline.net/… економить байт (і позбавляється від додаткового зворотного каналу )
Мартін Ендер,

2

Діалог APL , 15 байт

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

введіть рядок у таблицю з 1 стовпчиком
⍣(‍)повторіть ( n ) разів отримати рядок введення
⎕UCSперетворити на
11|відпочинок у розділі кодової точки UCS при поділі на 11
⌽∘⍉обертання -90 ° (перевернути)

Альтернативний метод (однакова довжина):

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

отримати оцінений вхід (тому потрібно ввести, наприклад, "^" або ім'я програми / змінної, яка повертає потрібний символ)
'<^>v'⍳в рядок


1

Jolf, 22 bytes

Try it here! You should replace ƒ with \x9f. Takes the sting, then the directional character.

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

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

Constructs the necessary strings and obtains the index of which a lies in. indexOf is used because ^ is a regex token. Thanks to ETHproductions for the bug fix and shaved bytes!


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.
Conor O'Brien

З інтересу я спробував індексувати об’єкт ... і виявився він точно такої ж довжини!
Ніл

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 bytes

66 plus one for -p

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

The input is a single string whose first character defines the orientation.


1

DUP, 48 bytes

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

Try it here.

Anonymous lambda that takes both argument and STDIN input. Usage:

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

Explanation

[                                               ] {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;
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.