Преобразовать ввод в направление

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 Я на мобильном телефоне, поэтому никаких минусов, но NW будет -1, -1
Матиас К
1
Разрешены ли пробелы?
Арджун
Ухх ... Конечно, наверное. Пока это выглядит одинаково.
Матиас К

Ответы:

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

Попробуйте онлайн!

ETHproductions
источник
Хм ... я ... ??? Как на земле это работает? У Japt есть какие-то причудливые вещи, которые заменяют обычные пары символов?
HyperNeutrino
@HyperNeutrino Да, Japt использует библиотеку сжатия shoco, которая заменяет общие пары строчных символов одним байтом.
ETHproductions
Хорошо, это действительно круто! Я посмотрю на это, посмотрю, смогу ли я извлечь из этого пользу.
HyperNeutrino
9

Python, 101 87 байт

Действительно наивное решение.

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

Спасибо @Lynn за сохранение 14 байтов! Изменения: использование метода string.split фактически увеличивает его; _; А также, отрицательные индексы существуют в Python.

HyperNeutrino
источник
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]Правка: теперь это, вероятно, будет слишком длинным, но вы можете сделать вторую нарезку [:6*x**2], аналогично для строки восток / запад, если вы можете обойти ошибку при первом разрезании.
Коул
@ Линн lambda x,y:('North ','South ')[y+1]+('West','East')[x+1]or'That goes nowhere, silly!'короче на 2 байта
Мертвый Опоссум
@ Линн О, спасибо! (Я забыл об отрицательных показателях!)
HyperNeutrino
@DeadPossum That не будет работать , потому что он вернется 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, но откуда он знает, что Север, Юг, Запад и Восток - это строки без двойных кавычек вокруг них? Это из-за пустой строки, которая разделяет тот же массив? Если да, значит ли это, что вы не можете иметь массив с разными типами одновременно (например, массив со строкой и целым числом)?
Кевин Круйссен,
1
@KevinCruijssen North - это константа php.net/manual/en/language.constants.php Если константа не существует, она будет интерпретирована как строка. Массив в PHP может содержать разные типы. Строки могут быть указаны четырьмя способами: php.net/manual/en/language.types.string.php
Йорг Хюльсерманн
6

Perl 6 , 79 байт

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

Попытайся

Expanded:

{ # 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!'
}
Брэд Гилберт b2gills
источник
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 ложно, а все остальные значения верны. Кроме того, получение ввода в синтаксисе каррирования короче, и доступ к массиву также короче.
Лука
@Luke Спасибо за предложение! Я отредактировал ответ. Теперь я бьюсь над решениями PHP и Python! Все из-за тебя!!! Благодарность!
Арджун,
Сохраните другой байт, выполнив f=a=>b=>и вызвав функцию как f(1729)(1458); это то, currying syntaxчто @Luke упомянул.
Том
Вы можете безопасно использовать a|bвместо a||b. Предполагая, что вход состоит только из -1, 0 или 1 (что мне неясно), вы можете заменить a>0и b>0на ~aи ~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)). Это использует индексы массива. Если оба 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

Оставшееся пространство шаблона в конце цикла печатается неявно.

seshoumara
источник
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"
Emigna
источник
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
Второе лучшее решение, пока нет upvote. Я поддерживаю тебя.
Арджун
1

Retina , 84 82 81 байт

1 байт сохранен благодаря @seshoumara за предложение 0...?вместо0\w* ?

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

^$
That goes nowhere, silly!

Попробуйте онлайн!

Kritixi Lithos
источник
Вывод неверный. OP хочет, чтобы положительные числа
двигали
@seshoumara правый, фиксированный его же ByteCount (только пришлось свопа Norи Sou)
Kritixi Lithos
Ok. Кроме того, вы можете побрить 1 байт с помощью 0...?.
Сешумара
@seshoumara Спасибо за совет :)
Kritixi Lithos
1

Swift 151 байт

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 байт.

Это просто отображает элемент массива, а если ничего нет, просто отображает сообщение «по умолчанию».

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

Это предназначено для запуска с -rфлагом, принимая координаты в качестве 1-го и 2-го аргументов.

Исмаэль Мигель
источник
1

C # , 95 102 байта


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 читаемый

// 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- Исходное решение.

Примечания

Я призрак, бу!

auhmaan
источник
1
Это фрагмент кода, который вам нужно обернуть в функцию, т.е. добавить (a,b)=>{...}бит
TheLethalCoder
Вы можете использовать выделки , чтобы сохранить байты a=>b=>, возможно , не нужно ()вокруг a|b, вы можете быть в состоянии использовать интерполированные строки , чтобы получить строку построена красивее, а
TheLethalCoder
Полностью забыл обернуть в функцию: S. Для ()всего a|b, мне это нужно, в противном случае Operator '|' cannot be applied to operands of type 'int' and 'bool'. Я также попробовал интерполированные строки, но не дал много, хотя из-за ""выдачи мне ошибок.
auhmaan
1

Scala, 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
corvus_192
источник
1

C 103 байта

f(a,b){printf("%s%s",b?b+1?"South ":"North ":"",a?a+1?"East":"West":b?"":"That goes nowhere, silly!");}
Steadybox
источник
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!"
Бизнес Кот
источник
0

Röda , 100 байт

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

Попробуйте онлайн!

Это тривиальное решение, похожее на некоторые другие ответы.

fergusq
источник