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


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

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


Хм ... я ... ??? Как на земле это работает? У 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.


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!'
}

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

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


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
Второе лучшее решение, пока нет 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!

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


Вывод неверный. 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- Исходное решение.

Примечания

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


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

1

C 103 байта

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

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.