入力を方向に変換


15

チャレンジ

<n1>, <n2>numberが-1、0、または1 の形式の入力を指定すると、対応する基本方向を返します。正の数値はx軸で東に移動し、y軸で南に移動し、負の数値はx軸で西に移動し、y軸で北に移動します。

出力は次の形式でなければなりませんSouth EastNorth EastNorth。大文字と小文字が区別されます。

入力が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私は携帯なので、ノーバッククォートの上だけど、NWは次のようになり-1、-1
マティアスK

1
末尾のスペースは許可されますか?
アルジュン

うーん...確かに、私は推測する。同じように見える限り。
マティアスK

回答:


12

Japt55 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

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


ええと...私は... ??? これは一体どのように機能しますか?Japtには、一般的な文字ペアに代わる派手なものがありますか?
ハイパーニュートリノ

@HyperNeutrinoはい、Japtはshoco圧縮ライブラリを使用して、一般的な小文字のペアを単一バイトに置き換えます。
-ETHproductions

さて、それは本当にクールです!それを調べて、それを利用できるかどうかを確認します。
ハイパーニュートリノ

9

Python、 101 87バイト

本当に素朴なソリューション。

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

14バイトを節約してくれた@Lynnに感謝します!変更:string.splitメソッドを使用すると、実際にはそれが長くなります; _; また、Pythonには負のインデックスが存在します。


5
次のように87に減らすことができます。lambda x,y:('','South ','North ')[y]+('','East','West')[x]or'That goes nowhere, silly!'
リン

2
私はいくつかの方向性を得るためのきちんとした方法を見つけましたが、残念ながらこの挑戦にはうまくいかないようです。私はとにかくそれを共有したいと考え出し(おそらく誰かのずる私はその問題などに対処する方法を見つけ出すことができるよりは、xまたはy = 0):lambda x,y:'North htuoS'[::x][:6]+'EastseW'[::y][:4]編集:それはおそらく今、あまりにも長くなりますが、2番目のスライスを作ることができ[:6*x**2]、同様に、最初のスライスでエラーを回避できる場合は、東/西の文字列についても同様です。
コール

@Lynnはlambda x,y:('North ','South ')[y+1]+('West','East')[x+1]or'That goes nowhere, silly!'2バイトだけ短いです
デッドポッサム

@リンああ、ありがとう!(負のインデックスを忘れてしまった!)
HyperNeutrino

それが返されますので@DeadPossumそれは動作しませんSouth Eastのために(0, 0)。ありがとう、結構です!
ハイパーニュートリノ

6

PHP、101バイト

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

PHPでプログラミングしてから長い時間が経ちましたが、北、南、西、東が二重引用符のない文字列であることをどのように認識していますか?これは、同じ配列を共有する空の文字列のためですか?はいの場合、これはまた、異なるタイプの配列を一度に持つことができないことを意味します(文字列と整数の両方を持つ配列のように)?
ケビンCruijssen

1
@KevinCruijssen Northは定数php.net/manual/en/language.constants.phpです。定数が存在しない場合、文字列として解釈されます。PHPの配列には、さまざまな型を含めることができます。文字列は、4つの方法で指定することができますphp.net/manual/en/language.types.string.php
イェルクHülsermann

6

Perl 6 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!=0a0は偽であり、他のすべての値は真実であるため、just に置き換えることができます。また、カリー化構文での入力の取得は短くなり、配列アプローチも短くなります。
ルーク

@ルーク提案をありがとう!答えを編集しました。今、私はPHPとPythonのソリューションを破っています!すべてのあなたのため!ありがとう!
アルジュン

次のf=a=>b=>ような関数を実行して呼び出すことにより、別のバイトを保存しますf(1729)(1458)。これはcurrying syntax@Lukeが言及していること。
トム

a|b代わりに安全に使用できますa||b。入力が-1、0、または1だけで構成されていると仮定すると(これは不明確です)、a>0and b>0~aandで置き換えることができます~b
アーナルド

また、これらの括弧は必要ありません: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))で呼び出します。これは配列インデックスを使用します。両方の場合ab0で、結果はfalsy空の文字列です。その場合、の後の文字列||が返されます。

それを試してみてください

ここですべてのテストケースを試してください。

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は入力行と同じ回数だけスクリプトを実行するため、必要に応じて1回の実行ですべてのテストケースを実行できます。以下の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

05AB1E48 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 bytes

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

Try it online! | Test Suite

Explanation:

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

Hint: 00 is exactly the same as 0, as the extra digit gets removed ;)
ETHproductions

1
The second-best solution yet no upvote. I upvote for you.
Arjun

1

Retina, 84 82 81 bytes

1 byte saved thanks to @seshoumara for suggesting 0...? instead of 0\w* ?

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

^$
That goes nowhere, silly!

Try it online!


The output is wrong. OP wants positive numbers to move S in the y-axis and negative numbers to move N.
seshoumara

@seshoumara Right, fixed it for same bytecount (just had to swap Nor and Sou)
Kritixi Lithos

Ok. Also, you can shave 1 byte by using 0...?.
seshoumara

@seshoumara Thanks for the tip :)
Kritixi Lithos

1

Swift 151 bytes

func d(x:Int,y:Int){x==0&&y==0 ? print("That goes nowhere, silly!") : print((y<0 ? "North " : y>0 ? "South " : "")+(x<0 ? "West" : x>0 ? "East" : ""))}

1

PHP, 95 bytes.

This simply displays the element of the array, and if there's nothing, just displays the "default" message.

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

This is meant to run with the -r flag, receiving the coordenates as the 1st and 2nd arguments.


1

C#, 95 102 bytes


Golfed

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

Ungolfed readable

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

Full code

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

Releases

  • v1.1 - + 7 bytes - Wrapped snippet into a function.
  • v1.0 -  95 bytes - Initial solution.

Notes

I'm a ghost, boo!


1
That's a code snippet you need to wrap it in a function i.e. add the (a,b)=>{...} bit
TheLethalCoder

You can use currying to save a byte a=>b=>, might not need the () around the a|b, you might be able to use interpolated strings to get the string built up nicer as well
TheLethalCoder

Completely forgot to wrap into a function :S. For the () around the a|b, I do need it, otherwise Operator '|' cannot be applied to operands of type 'int' and 'bool'. I've also tried the interpolated strings, but didn't give much though due to the "" giving me errors.
auhmaan

1

Scala, 107 bytes

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

Try it online

To use this, declare this as a function and call it:

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

How it works

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

1

C, 103 bytes

f(a,b){printf("%s%s",b?b+1?"South ":"North ":"",a?a+1?"East":"West":b?"":"That goes nowhere, silly!");}

0

Java 7, 130 bytes

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

Explanation:

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

Test code:

Try it here.

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

Output:

South East
South 
North East
That goes nowhere, silly!

0

CJam, 68 bytes

"
South 
North 

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

Try it online! or verify all test cases

Prints one trailing space on [0 -1] or [0 1] (North or South).

Explanation

"\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!"

0

Röda, 100 bytes

f a,b{["That goes nowhere, silly!"]if[a=b,a=0]else[["","South ","North "][b],["","East","West"][a]]}

Try it online!

This is a trivial solution, similar to some other answers.

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