แปลงอินพุตเป็นทิศทาง


15

ท้าทาย

รับอินพุตในรูปแบบ<n1>, <n2>ที่ตัวเลขสามารถเป็น -1, 0 หรือ 1 ให้ส่งกลับทิศทางที่สำคัญ ตัวเลขที่เป็นบวกจะเคลื่อนที่ไปทางทิศตะวันออกในแกน x และทิศใต้ในแกน y ส่วนตัวเลขเชิงลบจะเลื่อนไปทางทิศตะวันตกในแกน x และทิศเหนือในแกน y

เอาท์พุทจะต้องอยู่ในรูปแบบSouth East, ,North East Northมันเป็นกรณี ๆ ไป

ถ้าใส่เป็น 0, 0, That goes nowhere, silly!โปรแกรมของคุณจะต้องกลับ

ตัวอย่างอินพุต / ขาออก:

1, 1 -> South East

0, 1 -> South

1, -1 -> North East

0, 0 -> That goes nowhere, silly!

นี่คือคำตอบที่สั้นที่สุดในหน่วยไบต์ชนะ



1
ตัวอย่างบางส่วนที่มี W, NW และ SW เป็นสิ่งจำเป็น
seshoumara

@seshoumara ฉันอยู่ในมือถือดังนั้นจึงไม่มี backticks แต่ NW จะเป็น -1, -1
Matias K

1
อนุญาตให้ใช้ช่องว่างต่อท้ายได้หรือไม่
Arjun

เอ่อ ... แน่นอนฉันเดา ตราบใดที่มันดูเหมือนกัน
Matias K

คำตอบ:


12

Japt , 55 51 ไบต์

`
SÆ 
NÆ° `·gV +`
E†t
Wƒt`·gU ª`T•t goƒ Í2€e, Ðéy!

คำอธิบาย

                      // Implicit: U, V = inputs
`\nSÆ \nNÆ° `       // Take the string "\nSouth \nNorth ".
·                     // Split it at newlines, giving ["", "South ", "North "].
gV                    // Get the item at index V. -1 corresponds to the last item.
+                     // Concatenate this with
`\nE†t\nWƒt`·gU       // the item at index U in ["", "East", "West"].
ª`T•t goƒ Í2€e, Ðéy!  // If the result is empty, instead take "That goes nowhere, silly!".
                      // Implicit: output result of last expression

ลองออนไลน์!


อืมฉัน ... ... มันทำงานบนโลกนี้ได้อย่างไร? Japtive มีบางสิ่งที่แปลกใหม่ที่เข้ามาแทนที่ตัวละครคู่ธรรมดาหรือไม่?
HyperNeutrino

@HyperNeutrino ใช่ Japt ใช้ไลบรารีการบีบอัด shocoซึ่งแทนที่อักขระตัวพิมพ์เล็กทั่วไปด้วยไบต์เดียว
ETHproductions

โอเคนั่นเจ๋งจริงๆ! ฉันจะตรวจสอบดูว่าฉันสามารถใช้ประโยชน์จากมันได้หรือไม่
HyperNeutrino

9

งูหลาม 101 87 ไบต์

ทางออกที่ไร้เดียงสาจริงๆ

lambda x,y:['','South ','North '][y]+['','West','East'][x]or'That goes nowhere, silly!'

ขอบคุณ @Lynn ที่ประหยัดได้ 14 ไบต์! การเปลี่ยนแปลง: การใช้เมธอด string.split ทำให้ใช้งานได้จริงนานกว่า; _; และยังมีดัชนีเชิงลบอยู่ในหลาม


5
คุณสามารถลดมันลงได้ถึง 87 เช่นนี้:lambda x,y:('','South ','North ')[y]+('','East','West')[x]or'That goes nowhere, silly!'
Lynn

2
ฉันพบวิธีที่เป็นระเบียบเพื่อหาเส้นทาง แต่น่าเสียดายที่ดูเหมือนว่ามันจะไม่เหมาะกับความท้าทายนี้ คิดว่าฉันจะแบ่งปันมันต่อไป (อาจจะเป็นคนที่มีฝีมือมากกว่าที่ฉันสามารถหาวิธีจัดการกับปัญหาของมันได้เช่นเมื่อ x หรือ y = 0): lambda x,y:'North htuoS'[::x][:6]+'EastseW'[::y][:4]แก้ไข: ตอนนี้มันอาจจะยาวเกินไป แต่คุณสามารถทำการแบ่งส่วนที่สอง[:6*x**2]ได้ เช่นเดียวกันสำหรับสตริง East / West หากคุณสามารถหลีกเลี่ยงข้อผิดพลาดในการแบ่งครั้งแรก
โคล

@Lynn lambda x,y:('North ','South ')[y+1]+('West','East')[x+1]or'That goes nowhere, silly!'สั้นกว่า 2 ไบต์
Dead Possum

@ ลินน์โอ้ขอบคุณ! (ฉันลืมเกี่ยวกับดัชนีติดลบ!)
HyperNeutrino

@DeadPossum ที่จะไม่ทำงานเพราะมันจะกลับมาสำหรับSouth East (0, 0)ขอบคุณแม้ว่า!
HyperNeutrino

6

PHP, 101 ไบต์

[,$b,$a]=$argv;echo$a|$b?[North,"",South][1+$a]." ".[West,"",East][1+$b]:"That goes nowhere, silly!";

เป็นเวลานานแล้วที่ฉันตั้งโปรแกรมใน PHP แต่จะรู้ได้อย่างไรว่าทิศเหนือใต้ตะวันตกและตะวันออกเป็นสตริงที่ไม่มีเครื่องหมายคำพูดล้อมรอบ เป็นเพราะสตริงว่างที่ใช้ร่วมกันอาร์เรย์เดียวกันหรือไม่ ถ้าใช่นี่หมายความว่าคุณไม่สามารถมีอาร์เรย์ที่มีชนิดต่างกันในเวลาเดียวกัน (เช่นอาร์เรย์ที่มีทั้งสตริงและจำนวนเต็ม)
Kevin Cruijssen

1
@KevinCruijssen North เป็นค่าคงที่php.net/manual/en/language.constants.phpหากค่าคงที่ไม่มีอยู่มันจะถูกตีความเป็นสตริง อาร์เรย์ใน PHP สามารถมีประเภทที่แตกต่างกัน สตริงสามารถระบุได้สี่วิธีphp.net/manual/en/language.types.string.php
JörgHülsermann

6

Perl 6 , 79 ไบต์

{<<'' East South North West>>[$^y*2%5,$^x%5].trim||'That goes nowhere, silly!'}

ลองมัน

ขยาย:

{ # bare block lambda with placeholder parameters 「$x」 and 「$y」

  << '' East South North West >>\ # list of 5 strings
  [                               # index into that with:

    # use a calculation so that the results only match on 0
    $^y * 2 % 5, # (-1,0,1) => (3,0,2) # second parameter
    $^x % 5      # (-1,0,1) => (4,0,1) # first parameter

  ]
  .trim  # turn that list into a space separated string implicitly
         # and remove leading and trailing whitespace

  ||     # if that string is empty, use this instead
  'That goes nowhere, silly!'
}

6

JavaScript (ES6), 106 100 97 93 ไบต์

มันเป็นวิธีการที่ง่ายมาก มันประกอบไปด้วยผู้ประกอบการประกอบไปด้วยไม่กี่คนซ้อนกัน -

f=a=>b=>a|b?(a?a>0?"South ":"North ":"")+(b?b>0?"East":"West":""):"That goes nowhere, silly!"

กรณีทดสอบ

f=a=>b=>a|b?(a?a>0?"South ":"North ":"")+(b?b>0?"East":"West":""):"That goes nowhere, silly!"

console.log(f(1729)(1458));
console.log(f(1729)(-1458));
console.log(f(-1729)(1458));
console.log(f(-1729)(-1458));
console.log(f(0)(1729));
console.log(f(0)(-1729));
console.log(f(1729)(0));
console.log(f(-1729)(0));


a!=0สามารถถูกแทนที่ด้วยเพียงaเพราะ 0 เป็นเท็จและค่าอื่น ๆ ทั้งหมดเป็นความจริง นอกจากนี้การป้อนข้อมูลในไวยากรณ์การแก้ปัญหาสั้นลงและอาร์เรย์ appoach ก็สั้นลงเช่นกัน
ลุค

@ ลุคขอบคุณสำหรับคำแนะนำ! ฉันได้แก้ไขคำตอบแล้ว ตอนนี้ฉันกำลังตี PHP และ Python อยู่! ทั้งหมดเป็นเพราะคุณ !!! ขอบคุณ!
Arjun

บันทึกไบต์อื่นด้วยการทำf=a=>b=>และเรียกใช้ฟังก์ชันเช่นf(1729)(1458); ซึ่งเป็นcurrying syntaxที่ @Luke ที่กล่าวถึง
Tom

คุณสามารถใช้แทนa|b a||bสมมติว่าการป้อนข้อมูลเท่านั้นประกอบด้วย -1, 0 หรือ 1 (ซึ่งเป็นที่ชัดเจนกับผม), คุณสามารถใช้ทดแทนa>0และb>0ด้วยและ~a ~b
Arnauld

นอกจากนี้คุณไม่จำเป็นต้องใช้วงเล็บเหล่านี้: a?(...):""/b?(...):""
Arnauld

4

แบตช์ 156 ไบต์

@set s=
@for %%w in (North.%2 South.-%2 West.%1 East.-%1)do @if %%~xw==.-1 call set s=%%s%% %%~nw
@if "%s%"=="" set s= That goes nowhere, silly!
@echo%s%

การforวนซ้ำทำหน้าที่เป็นตารางการค้นหาเพื่อกรองเมื่อพารามิเตอร์ (อาจถูกทำให้เป็นโมฆะ) เท่ากับ -1 และต่อคำที่ตรงกันเข้าด้วยกัน หากไม่มีการเลือกอะไรข้อความโง่จะถูกพิมพ์แทน


4

JavaScript (ES6), 86 ไบต์

a=>b=>["North ","","South "][b+1]+["West","","East"][a+1]||"That goes nowhere, silly!"

คำอธิบาย

เรียกว่าด้วยไวยากรณ์การแกง ( f(a)(b)) สิ่งนี้ใช้ดัชนีอาร์เรย์ ถ้าทั้งคู่aและbเป็น 0 ผลลัพธ์จะเป็นสตริงว่างเปล่า ในกรณีนั้นสตริงหลัง||จะถูกส่งกลับ

ลองมัน

ลองกรณีทดสอบทั้งหมดที่นี่:

let f=
a=>b=>["North ","","South "][b+1]+["West","","East"][a+1]||"That goes nowhere, silly!"

for (let i = -1; i < 2; i++) {
    for (let j = -1; j < 2; j++) {
        console.log(`${i}, ${j}: ${f(i)(j)}`);
    }
}


3

GNU sed , 100 + 1 (แฟล็ก r) = 101 ไบต์

s:^-1:We:
s:^1:Ea:
s:-1:Nor:
s:1:Sou:
s:(.*),(.*):\2th \1st:
s:0...?::
/0/cThat goes nowhere, silly!

ด้วยการออกแบบ sed จะเรียกใช้งานสคริปต์หลาย ๆ ครั้งตามที่มีบรรทัดอินพุตดังนั้นจึงสามารถทำกรณีทดสอบทั้งหมดได้ในการรันครั้งเดียวหากจำเป็น ลิงค์ TIO ด้านล่างทำเช่นนั้น

ลองออนไลน์!

คำอธิบาย:

s:^-1:We:                         # replace '-1' (n1) to 'We'
s:^1:Ea:                          # replace '1' (n1) to 'Ea'
s:-1:Nor:                         # replace '-1' (n2) to 'Nor'
s:1:Sou:                          # replace '1' (n2) to 'Sou'
s:(.*),(.*):\2th \1st:            # swap the two fields, add corresponding suffixes
s:0...?::                         # delete first field found that starts with '0'
/0/cThat goes nowhere, silly!     # if another field is found starting with '0',
                                  #print that text, delete pattern, end cycle now

พื้นที่รูปแบบที่เหลือในตอนท้ายของรอบจะถูกพิมพ์โดยปริยาย


2

05AB1E , 48 45 43 ไบต์

õ'†Ô'…´)èUõ„ƒÞ „„¡ )èXJ™Dg_i“§µ—±æÙ,Ú¿!“'Tì

ลองออนไลน์!

คำอธิบาย

õ'†Ô'…´)                                       # push the list ['','east','west']
        èU                                     # index into this with first input
                                               # and store the result in X
          õ„ƒÞ „„¡ )                           # push the list ['','south ','north ']
                    èXJ                        # index into this with 2nd input
                                               # and join with the content of X
                       ™                       # convert to title-case
                        Dg_i                   # if the length is 0
                            “§µ—±æÙ,Ú¿!“       # push the string "hat goes nowhere, silly!"
                                        'Tì    # prepend "T"


2

Japt , 56 ไบต์

N¬¥0?`T•t goƒ Í2€e, Ðéy!`:` SÆ NÆ°`¸gV +S+` E†t Wƒt`¸gU

ลองออนไลน์! | ชุดทดสอบ

คำอธิบาย:

N¬¥0?`Tt go Í2e, Ðéy!`:` SÆ NÆ°`¸gV +S+` Et Wt`¸gU
Implicit U = First input
         V = Second input

N´0?`...`:` ...`qS gV +S+` ...`qS gU
N¬                                                     Join the input (0,0 → "00")
  ¥0                                                   check if input is roughly equal to 0. In JS, "00" == 0
    ?                                                  If yes:
      ...                                               Output "That goes nowhere, silly!". This is a compressed string
     `   `                                              Backticks are used to decompress strings
          :                                            Else:
           ` ...`                                       " South North" compressed
                 qS                                     Split on " " (" South North" → ["","South","North"])
                   gV                                   Return the string at index V
                     +S+                                +" "+ 
                        ` ...`                          " East West" compressed
                              qS gU                     Split on spaces and yield string at index U

คำแนะนำ: 00คือว่าเช่นเดียวกับ0เป็นหลักเสริมจะถูกนำออก;)
ETHproductions

1
ทางออกที่ดีที่สุดอันดับสองยังไม่มีการโหวต ฉันโหวตให้คุณ
Arjun

1

เรติน่า , 84 82 81 ไบต์

บันทึก 1 ไบต์ขอบคุณ @seshoumara สำหรับการแนะนำ0...?แทนที่จะเป็น0\w* ?

(.+) (.+)
$2th $1st
^-1
Nor
^1
Sou
-1
We
1
Ea
0...?

^$
That goes nowhere, silly!

ลองออนไลน์!


ผลลัพธ์ผิด OP ต้องการตัวเลขที่เป็นบวกเพื่อย้าย S ในแกน y และจำนวนลบเพื่อย้าย N.
seshoumara

@seshoumara ใช่แล้วแก้ไขเป็น bytecount อันเดียวกัน (แค่ต้องสลับNorและSou)
Kritixi Lithos

ตกลง. นอกจากนี้คุณยังสามารถโกน 1 0...?ไบต์โดยใช้
seshoumara

@seshoumara ขอบคุณสำหรับคำแนะนำ :)
Kritixi Lithos


1

PHP, 95 ไบต์

สิ่งนี้จะแสดงองค์ประกอบของอาเรย์และหากไม่มีสิ่งใดเพียงแสดงข้อความ "ค่าเริ่มต้น"

echo['North ','','South '][$argv[1]+1].[East,'',West][$argv[2]+1]?:'That goes nowhere, silly!';

สิ่งนี้มีไว้เพื่อให้ทำงานด้วยการ-rตั้งค่าสถานะรับ coordenates เป็นอาร์กิวเมนต์ที่ 1 และ 2


1

C # , 95 102 ไบต์


แข็งแรงเล่นกอล์ฟ

(a,b)=>(a|b)==0?"That goes nowhere, silly!":(b<0?"North ":b>0?"South ":"")+(a<0?"West":a>0?"East":"");

Ungolfed

( a, b ) => ( a | b ) == 0
    ? "That goes nowhere, silly!"
    : ( b < 0 ? "North " : b > 0 ? "South " : "" ) +
      ( a < 0 ? "West" : a > 0 ? "East" : "" );

อ่านได้ไม่ดี

// A bitwise OR is perfomed
( a, b ) => ( a | b ) == 0

    // If the result is 0, then the 0,0 text is returned
    ? "That goes nowhere, silly!"

    // Otherwise, checks against 'a' and 'b' to decide the cardinal direction.
    : ( b < 0 ? "North " : b > 0 ? "South " : "" ) +
      ( a < 0 ? "West" : a > 0 ? "East" : "" );

รหัสเต็ม

using System;

namespace Namespace {
    class Program {
        static void Main( string[] args ) {
            Func<Int32, Int32, String> f = ( a, b ) =>
                ( a | b ) == 0
                    ? "That goes nowhere, silly!"
                    : ( b < 0 ? "North " : b > 0 ? "South " : "" ) +
                      ( a < 0 ? "West" : a > 0 ? "East" : "" );

            for( Int32 a = -1; a <= 1; a++ ) {
                for( Int32 b = -1; b <= 1; b++ ) {
                    Console.WriteLine( $"{a}, {b} = {f( a, b )}" );
                }
            }

            Console.ReadLine();
        }
    }
}

ข่าว

  • v1.1 -+ 7 bytes - ตัวอย่างข้อมูลที่ห่อไว้ในฟังก์ชั่น
  • v1.0 -  95 bytes- โซลูชั่นเริ่มต้น

หมายเหตุ

ฉันเป็นผีโห่!


1
เป็นข้อมูลโค้ดที่คุณต้องใช้ในการทำงานเช่นเพิ่ม(a,b)=>{...}บิต
TheLethalCoder

คุณสามารถใช้ currying เพื่อบันทึก byte a=>b=>, อาจไม่จำเป็นต้องใช้()คำสั่งa|b, คุณอาจจะสามารถใช้ interpolated strings เพื่อสร้าง string ที่สร้างขึ้นที่ดีกว่าได้เช่นกัน
TheLethalCoder

ลืมห่อฟังก์ชันโดยสิ้นเชิง: S สำหรับ()รอบฉันไม่ต้องการมันเป็นอย่างอื่นa|b Operator '|' cannot be applied to operands of type 'int' and 'bool'ฉันได้ลองใช้สตริงที่สอดแทรก แต่ไม่ได้ให้อะไรมากนักเนื่องจาก""ข้อผิดพลาดที่ทำให้ฉัน
auhmaan

1

สกาลา 107 ไบต์

a=>b=>if((a|b)==0)"That goes nowhere, silly!"else Seq("North ","","South ")(b+1)+Seq("West","","East")(a+1)

ลองออนไลน์

หากต้องการใช้สิ่งนี้ให้ประกาศสิ่งนี้เป็นฟังก์ชั่นและเรียกมันว่า:

val f:(Int=>Int=>String)=...
println(f(0)(0))

มันทำงานอย่างไร

a =>                                // create an lambda with a parameter a that returns
  b =>                              // a lambda with a parameter b
    if ( (a | b) == 0)                // if a and b are both 0
      "That goes nowhere, silly!"       // return this string
    else                              // else return
      Seq("North ","","South ")(b+1)    // index into this sequence
      +                                 // concat
      Seq("West","","East")(a+1)        // index into this sequence


0

Java 7, 130 ไบต์

String c(int x,int y){return x==0&y==0?"That goes nowhere, silly!":"North xxSouth ".split("x")[y+1]+"WestxxEast".split("x")[x+1];}

คำอธิบาย:

String c(int x, int y){               // Method with x and y integer parameters and String return-type
  return x==0&y==0 ?                  //  If both x and y are 0:
     "That goes nowhere, silly!"      //   Return "That goes nowhere, silly!"
    :                                 //  Else:
     "North xxSouth ".split("x"[y+1]  //   Get index y+1 from array ["North ","","South "] (0-indexed)
     + "WestxxEast".split("x")[x+1];  //   Plus index x+1 from array ["West","","East"] (0-indexed)
}                                     // End of method

รหัสทดสอบ:

ลองที่นี่

class M{
  static String c(int x,int y){return x==0&y==0?"That goes nowhere, silly!":"North xxSouth ".split("x")[y+1]+"WestxxEast".split("x")[x+1];}

  public static void main(String[] a){
    System.out.println(c(1, 1));
    System.out.println(c(0, 1));
    System.out.println(c(1, -1));
    System.out.println(c(0, 0));
  }
}

เอาท์พุท:

South East
South 
North East
That goes nowhere, silly!

0

CJam , 68 ไบต์

"
South 
North 

East
West"N/3/l~W%.=s_Q"That goes nowhere, silly!"?

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

พิมพ์หนึ่งช่องว่างต่อท้ายบน[0 -1]หรือ[0 1]( NorthหรือSouth)

คำอธิบาย

"\nSouth \nNorth \n\nEast\nWest"  e# Push this string
N/                                e# Split it by newlines
3/                                e# Split the result into 3-length subarrays,
                                  e#  gives [["" "South " "North "]["" "East" "West"]]
l~                                e# Read and eval a line of input
W%                                e# Reverse the co-ordinates
.=                                e# Vectorized get-element-at-index: accesses the element
                                  e#  from the first array at the index given by the 
                                  e#  y co-ordinate. Arrays are modular, so -1 is the last
                                  e#  element. Does the same with x on the other array.
s                                 e# Cast to string (joins the array with no separator)
_                                 e# Duplicate the string
Q"That goes nowhere, silly!"?     e# If it's non-empty, push an empty string. If its empty, 
                                  e#  push "That goes nowhere, silly!"

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.