Поскольку вы даете пример 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-подхода.
Это будет работать для диапазона от -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.
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;
}
}
Хакерский, но правильный.
Еще одно решение обмана. Мы используем язык, допускающий перегрузку операторов. Затем мы заставляем 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
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
Однострочник JavaScript:
function f(n) { return ((f.f = !f.f) * 2 - 1) * n; }
Другой способ - сохранить состояние в один бит и перевернуть его, заботясь о двоичном представлении в случае отрицательных чисел ... Предел: 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;
}
}
}
number f( number n)
{
static count(0);
if(count > 0) return -n;
return n;
}
f(n) = n
f(f(n)) = f(n) = -n
Как насчет этого:
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)))
C ++
struct Value
{
int value;
Value(int v) : value(v) {}
operator int () { return -value; }
};
Value f(Value input)
{
return input;
}
Аналогично решению с перегрузкой функций в Python:
def f(number):
if type(number) != type([]):
return [].append(number)
else:
return -1*number[0]
Альтернатива: статические датамеры
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.
int f(int n) { static int x = 0; result = -x; x = n; return result; }
Это FIFO с одной записью и отрицанием. Конечно, это не работает для максимального отрицательного числа.
Отличный вопрос!
Это заняло у меня около 35 секунд, чтобы подумать и написать:
int f(int n){
static int originalN=0;
if (n!=0)
originalN=n;
return n-originalN;
}
Я считаю, что это отвечает всем требованиям. Нигде не сказано, что параметры должны быть 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;
}
}
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();
}
Еще одно решение Javascript, использующее короткие замыкания.
function f(n) {return n.inv || {inv:-n}}
f(f(1)) => -1
f(f(-1)) => 1
Перегрузка 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();
}
Подумал, что попробую это, не глядя сначала на ответы других людей:
#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 (что совпадает с -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 )
int f(int x){
if (x < 0)
return x;
return ~x+1; //two's complement
}
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
Разве вспоминание вашего последнего состояния не является достаточно хорошим ответом?
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))
}
Я еще не смотрел другие ответы, полагаю, побитовые методы были подробно обсуждены.
Я подумал, что придумаю что-нибудь злое в 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(); }
int f(int n)
{
static long counter=0;
counter++;
if(counter%2==0)
return -n;
else
return n;
}
Tcl:
proc f {input} {
if { [string is integer $input] } {
return [list expr [list 0 - $input]]
} else {
return [eval $input]
}
}
% f [f 1]
-1
По аналогии с некоторыми другими ответами ... если это целое число, вернуть команду, которая возвращает отрицательное значение этого числа. Если это не число, оцените его и верните результат.
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)));
}
}
И это работает (при условии, что я понимаю вопрос правильно)