ปฐมนิเทศมุมฉาก


22

ภารกิจ:กำหนดอินพุตที่ประกอบด้วยหนึ่งในอักขระอย่าง<>^vแน่นอนเอาต์พุตอินพุตที่สองประกอบด้วยอักขระ ASCII ที่พิมพ์ได้ (จาก space ไปจนถึง tilde) โดยวางลูกศร

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 ได้
Downgoat

อินพุตทั้งหมดเป็นสตริงเดียวหรือไม่ตกลง? >ABC
Digital Trauma

@ DigitalTrauma ใช่มันไม่เป็นไร
Conor O'Brien

ไม่ฉันหมายความว่ามันไม่สำคัญ คุณไม่มีกรณีทดสอบสำหรับการ>วางแนว
mbomb007

คำตอบ:


14

MATL , 10 6 ไบต์

บันทึกได้ 4 ไบต์ขอบคุณ Martin!

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เคล็ดลับ (คุณต้องหมุนอีกทางหนึ่ง) .
Martin Ender

@ MartinBüttnerความคิดที่ดี! ในกรณีของฉัน (ในของคุณ?) ฉันคิดว่า mod 19 ดีกว่าเพราะการลบ 1 จะให้ 1,2,3,4 (mod 4) โดยตรง ขอบคุณสำหรับทิป!
Luis Mendo

6
4 ไบต์สั้นสิ่งที่อยู่ในแผ่นดิน ...
มาร์ตินเอนเดอร์

2
ฉันใส่ MATL อย่างเป็นทางการใน "รายการภาษาที่สั้นอย่างบ้าคลั่ง"
Conor O'Brien

12

Python 3, 64 51 48 ไบต์

บันทึก 6 ไบต์ขอบคุณ xnor

บันทึกแล้ว 7 ไบต์ขอบคุณ Lynn

ที่บันทึกไว้ 3 ไบต์ขอบคุณที่ DSM และมอร์แกนจากดังนั้นหลาม

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กับ sep แทนที่จะพิมพ์
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"

ทิศทาง>เป็นฟังก์ชั่น idendity ที่<ฝืนมันอาร์กิวเมนต์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*

อินพุตคืออักขระปฐมนิเทศตามด้วยสตริงที่จะหมุนโดยตรง

ทดสอบที่นี่

คำอธิบาย

Yay สำหรับ modulo magic การรับตัวละครทั้งสี่แบบโมดูโล 11 จับคู่กับ:

> 7 
v 8 
< 5
^ 6

สิ่งเหล่านี้ล้วนเป็นแบบโมดูโล 4 ที่แตกต่างและที่สำคัญพวกเขากำลังเพิ่มขึ้นอย่างเป็นระเบียบ: 3, 0, 1, 2. นั่นหมายความว่าเราสามารถใช้ผลลัพธ์ของการmod 11เพื่อกำหนดความถี่ในการหมุน (โดยไม่จำเป็นต้องมีความชัดเจนmod 4เนื่องจากการหมุนสี่ครั้งเป็นแบบไม่มี op) โดยปกติเราจะต้องชดเชยจำนวนเหล่านี้ด้วย 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":"")

นี่คือฟังก์ชั่นที่ยอมรับCharและสตริงและส่งคืนสตริง

อนุญาตdเป็นตัวอักษรแสดงทิศทางและsเป็นสายอักขระ หากdซ้ายหรือสูงกว่าเราจะใช้การกลับด้านsมิฉะนั้นเราจะใช้sตามที่กำหนด เราสร้างตัวคั่นเป็นสตริงว่างถ้าdซ้ายหรือขวาหรือขึ้นบรรทัดใหม่ถ้าdขึ้นหรือลง ส่งผ่านสตริงและตัวคั่นไปjoinซึ่งจะแทรกตัวคั่นระหว่างอักขระแต่ละตัวของสตริงและส่งคืนสตริง

ตรวจสอบกรณีทดสอบทั้งหมดออนไลน์



3

JavaScript (ES6), 76 67 65 ไบต์

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

พอร์ตของ @Alex A. คำตอบของ Julia แก้ไข: บันทึกแล้ว 9 ไบต์ด้วย @ETHproductions บันทึกสองไบต์แยกต่างหากขอบคุณ @ edc65


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

+1? "reverse": "slice" อัจฉริยะ
edc65

@ edc65 อ๊ะฉันบังเอิญคัดลอกเวอร์ชั่นเก่าไปแล้ว ?:รุ่นที่น่าเบื่อสั้นกว่า 1 ไบต์
Neil

(/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-array จึงถูกต่อกัน มิฉะนั้นเราจะเลือกอักขระขึ้นบรรทัดใหม่"`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
^.¶?

^ABCการป้อนข้อมูลเป็นสิ่งที่เป็นหนึ่งสตริงเช่น

  • หาก^หรือ<ย้อนกลับสตริง
  • แทรกบรรทัดใหม่หลังจากตัวละครทุกตัว
  • หาก<หรือ>ลบบรรทัดใหม่

ลองออนไลน์


retina.tryitonline.net/ ......บันทึกเป็นไบต์ (และกำจัด linefeed ต่อท้ายเพิ่มเติม)
Martin Ender

2

Dyalog APLขนาด 15 ไบต์

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

ทำให้สตริงลงในตาราง 1 คอลัมน์
⍣(‍)ทำซ้ำ ( n ) คูณรับ string input
⎕UCSแปลงเป็น
11|ส่วนที่เหลือของรหัสจุด UCS เมื่อหารด้วย 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ถูกนำมาใช้เพราะ^เป็น regex โทเค็น ขอบคุณ 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
Conor O'Brien

ฉันพยายามทำดัชนีวัตถุ ... และมันกลับกลายเป็นความยาวเท่ากัน!
Neil

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 บวกหนึ่งสำหรับ -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.