Проектная функция f (f (n)) == -n [закрыто]

Поскольку вы даете пример sed в одном из комментариев, я предполагаю, что вы хотите получить чистое решение bash?

while read input; do
  for field in tag tag1; do
    case $input in
      *"<$field>"*"</$field>"* )
        pre=${input#*"<$field>"}
        suf=${input%"</$field>"*}
        # Where are we supposed to be getting the replacement text from?
        input="${input%$pre}SOMETHING${input#$suf}"
        ;;
    esac
  done
  echo "$input"
done

Это совершенно неинтеллектуально и, очевидно, работает только на хорошо сформированном входе с начальным тегом и конечным тегом в одной строке, вы не можете иметь несколько экземпляров одного и того же тега в одной строке, список тэгов для замещения жестко закодирован и т. д.

I не может представить ситуацию, когда это было бы действительно полезно, и предпочтительнее либо сценария, либо надлежащего XML-подхода.

839
задан 13 revs, 9 users 27% 6 July 2015 в 02:21
поделиться

91 ответ

Это будет работать для диапазона от -1073741823 до 1073741822:

int F(int n)
{
    if(n < 0)
    {
        if(n > -1073741824)
            n = -1073741824 + n;
        else n = -(n + 1073741824);
    }
    else
    {
        if(n < 1073741823)
            n = 1073741823 + n;
        else n = -(n - 1073741823);
    }
    return n;
}

Он работает, взяв доступный диапазон 32-битного целого числа со знаком и разделив его на две части. Первая итерация функции помещает n за пределы этого диапазона. Вторая итерация проверяет, не выходит ли он за пределы этого диапазона - если да, то возвращает его обратно в этот диапазон, но делает его отрицательным.

По сути, это способ сохранить дополнительный «бит» информации о значении n.

1
ответ дан 22 November 2019 в 21:11
поделиться
int f(const int n)  {
    static int last_n;

    if (n == 0)
        return 0;
    else if (n == last_n)
        return -n;
    else
    {
        last_n = n;
        return n;
    }
}

Хакерский, но правильный.

1
ответ дан 22 November 2019 в 21:11
поделиться

Еще одно решение обмана. Мы используем язык, допускающий перегрузку операторов. Затем мы заставляем f (x) возвращать то, что перегружено == , чтобы всегда возвращать истину. Это кажется совместимым с описанием проблемы, но явно противоречит духу загадки.

Пример Ruby:

class Cheat
  def ==(n)
     true
  end
end

def f(n)
  Cheat.new
end

Что дает нам:

>> f(f(1)) == -1
=> true

, но также (не слишком удивительно)

>> f(f(1)) == "hello world"
=> true
1
ответ дан 22 November 2019 в 21:11
поделиться

Some were similar but just thought I would write down my first idea (in C++)

#include <vector>

vector<int>* f(int n)
{
  returnVector = new vector<int>();
  returnVector->push_back(n);
  return returnVector;
}

int f(vector<int>* n) { return -(n->at(0)); }

Just using overloading to cause f(f(n)) to actually call two different functions

1
ответ дан 22 November 2019 в 21:11
поделиться

Однострочник JavaScript:

function f(n) { return ((f.f = !f.f) * 2 - 1) * n; }
1
ответ дан 22 November 2019 в 21:11
поделиться

Другой способ - сохранить состояние в один бит и перевернуть его, заботясь о двоичном представлении в случае отрицательных чисел ... Предел: 2 ^ 29

int ffn (int n) {

    n = n ^ (1 << 30); //flip the bit
    if (n>0)// if negative then there's a two's complement
    {
        if (n & (1<<30))
        {
            return n;
        }
        else
        {
            return -n;
        }
    }
    else
    {
        if (n & (1<<30))
        {
            return -n;
        }
        else
        {
            return n;
        }
    }


}
1
ответ дан 22 November 2019 в 21:11
поделиться
int f(int n) {
    return ((n>0)? -1 : 1) * abs(n);
}
1
ответ дан 22 November 2019 в 21:11
поделиться
number f( number n)
{
  static count(0);
  if(count > 0) return -n;
  return n;
}

f(n) = n

f(f(n)) = f(n) = -n
1
ответ дан 22 November 2019 в 21:11
поделиться

Как насчет этого:

do
    local function makeFunc()
        local var
        return function(x)
            if x == true then
                return -var
            else
                var = x
                return true
            end
        end

    end
    f = makeFunc()
end
print(f(f(20000)))
1
ответ дан 22 November 2019 в 21:11
поделиться
f(n) { return IsWholeNumber(n)? 1/n : -1/n }
1
ответ дан 22 November 2019 в 21:11
поделиться

C ++

struct Value
{
  int value;
  Value(int v) : value(v) {}
  operator int () { return -value; }
};


Value f(Value input)
{
  return input;
}
1
ответ дан 22 November 2019 в 21:11
поделиться

Аналогично решению с перегрузкой функций в Python:

def f(number):
 if type(number) != type([]):
  return [].append(number)
 else:
  return -1*number[0]

Альтернатива: статические датамеры

1
ответ дан 22 November 2019 в 21:11
поделиться

Python 2.6:

f = lambda n: (n % 2 * n or -n) + (n > 0) - (n < 0)

I realize this adds nothing to the discussion, but I can't resist.

1
ответ дан 22 November 2019 в 21:11
поделиться
int f(int n)
{
   static int x = 0;
   result = -x;
   x = n;
   return result;
}

Это FIFO с одной записью и отрицанием. Конечно, это не работает для максимального отрицательного числа.

1
ответ дан 22 November 2019 в 21:11
поделиться

На Python

f=lambda n:n[0]if type(n)is list else[-n]
1
ответ дан 22 November 2019 в 21:11
поделиться

Отличный вопрос!

Это заняло у меня около 35 секунд, чтобы подумать и написать:

int f(int n){
    static int originalN=0;
    if (n!=0)
        originalN=n;
    return n-originalN;
}
1
ответ дан 22 November 2019 в 21:11
поделиться

Я считаю, что это отвечает всем требованиям. Нигде не сказано, что параметры должны быть 32-битными знаковыми целыми числами, только то, что значение 'n', которое вы передаете, должно быть.

long long f(long long n)
{
    int high_int = n >> 32;
    int low_int  = n & 0xFFFFFFFF;

    if (high_int == 0) {
        return 0x100000000LL + low_int;
    } else {
        return -low_int;
    }
}
0
ответ дан 22 November 2019 в 21:11
поделиться

Scala:

def f(x: Any): Any = x match {
  case i: Int => new { override def hashCode = -i }
  case i @ _  => i.hashCode
}

То же самое в Java:

public static Object f(final Object x) {
  if(x instanceof Integer) {
    return new Object() {
      @Override 
      public int hashCode() {
        return -(Integer)x;
      }
    };
  }
  return x.hashCode();
}
1
ответ дан 22 November 2019 в 21:11
поделиться

Еще одно решение Javascript, использующее короткие замыкания.

​function f(n) {return n.inv || {inv:-n}}

f(f(1)) => -1
f(f(-1)) => 1
1
ответ дан 22 November 2019 в 21:11
поделиться

Перегрузка C #:

string f(int i) {
  return i.ToString();
}

int f(string s) {
  return Int32.Parse(s) * -1;
}

или

object f(object o) {
  if (o.ToString.StartsWith("s"))
    return Int32.Parse(s.Substring(1)) * -1;
  return "s" + i.ToString();
}
0
ответ дан 22 November 2019 в 21:11
поделиться

Подумал, что попробую это, не глядя сначала на ответы других людей:

#include <stdio.h>
#include <limits.h>
#include <stdlib.h>

int f(int n) {
    if(n > 0) {  
        if(n % 2)
            return -(++n);
        else {
            return (--n);

        }
    }
    else {
        if(n % 2)
            return -(--n);
        else {
            return (++n);

        }
    }
}

int main(int argc, char* argv[]) {
    int n;
    for(n = INT_MIN; n < INT_MAX; n++) {
        int N = f(f(n));

        if(N != -n) {
            fprintf(stderr, "FAIL! %i != %i\n", N, -n);
        }
    }
    n = INT_MAX;
    int N = f(f(n));
    if(N != -n) {
        fprintf(stderr, "FAIL! n = %i\n", n);
    }
    return 0;
}

Вывод: [ничего]

1
ответ дан 22 November 2019 в 21:11
поделиться

Как насчет

int f(int n)
{
    return -abs(n);
}
-4
ответ дан 22 November 2019 в 21:11
поделиться

Я думал, что самый большой Диапазон возможных намекает на модульное арифметическое решение. В некоторых модульных основаниях М есть число, которое в квадрате совпадает с М-1 (что совпадает с -1). Например, если M = 13, 5 * 5 = 25, 25 mod 13 = 12 (= -1)
В любом случае вот код Python для M = 2 ** 32-3.

def f(x):
    m=2**32-3;
    halfm=m//2;
    i_mod_m=1849436465
    if abs( x ) >halfm:
        raise "too big"
    if x<0:
        x+=m
    x=(i_mod_m*x) % m
    if (x>halfm):
        x-=m
    return x;

Обратите внимание, что есть 3 значения, которые он не будет работать для 2 ** 31-1, - (2 ** 31-1) и - (2 ** 31 )

-1
ответ дан 22 November 2019 в 21:11
поделиться
int f(int x){
    if (x < 0)
        return x;
    return ~x+1; //two's complement
}
-1
ответ дан 22 November 2019 в 21:11
поделиться

PHP, without using a global variable:

function f($num) {
  static $mem;

  $answer = $num-$mem;

  if ($mem == 0) {
    $mem = $num*2;
  } else {
    $mem = 0;
  }

  return $answer;
}

Works with integers, floats AND numeric strings!

just realized this does some unnecessary work, but, whatever

-1
ответ дан 22 November 2019 в 21:11
поделиться

Разве вспоминание вашего последнего состояния не является достаточно хорошим ответом?

int f (int n)
{
    //if count 
    static int count = 0;

    if (count == 0)
        { 
            count = 1;
            return n;
        }

    if (n == 0)
        return 0;
    else if (n > 0)
    {
        count = 0;
        return abs(n)*(-1);
    } 
    else
    {
        count = 0;
        return abs(n);
    }
}

int main()
{
    int n = 42;
    std::cout << f(f(n))
}
-1
ответ дан 22 November 2019 в 21:11
поделиться

Я еще не смотрел другие ответы, полагаю, побитовые методы были подробно обсуждены.

Я подумал, что придумаю что-нибудь злое в C ++, которое, надеюсь, не обман:

struct ImplicitlyConvertibleToInt
{
    operator int () const { return 0; }
};

int f(const ImplicitlyConvertibleToInt &) { return 0; }

ImplicitlyConvertibleToInt f(int & n)
{
    n = 0; // The problem specification didn't say n was const
    return ImplicitlyConvertibleToInt();
}

Весь тип ImplicitlyConvertibleToInt и перегрузка необходимы, потому что временные объекты не могут быть привязаны к не- ссылка на константу.

Конечно, глядя на это сейчас, неясно, выполняется ли f (n) перед -n .

Возможно, лучшее решение с такой степенью зла это просто:

struct ComparesTrueToInt
{
    ComparesTrueToInt(int) { } // implicit construction from int
};
bool operator == (ComparesTrueToInt, int) const { return true; }

ComparesTrueToInt f(ComparesTrueToInt ct) { return ComparesTrueToInt(); }
-2
ответ дан 22 November 2019 в 21:11
поделиться
int f(int n)
{
  static long counter=0;
  counter++;
  if(counter%2==0)
    return -n;
  else
    return n;
}
0
ответ дан 22 November 2019 в 21:11
поделиться

Tcl:

proc f {input} {
    if { [string is integer $input] } {
      return [list expr [list 0 - $input]]
    } else {
      return [eval $input]
    }
}

% f [f 1]
-1

По аналогии с некоторыми другими ответами ... если это целое число, вернуть команду, которая возвращает отрицательное значение этого числа. Если это не число, оцените его и верните результат.

0
ответ дан 22 November 2019 в 21:11
поделиться

Менее 50 символов (C #)

int f(int n) { return (n <= 0) ? n : f(-n); }

Или проще для чтения:

static int f(int n) { 
  if (n <= 0)
    return n;
  else 
    return f(-n);
}

Для проверки

static void Main(string[] args) {
    for (int n = int.MinValue; n < int.MaxValue; n+=1) {
        Console.Out.WriteLine("Value: " + n + " Result: " + f(f(n)));
    }
}

И это работает (при условии, что я понимаю вопрос правильно)

-2
ответ дан 22 November 2019 в 21:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: