JavaScript использует литерал простого объекта:
var x = { intValue: 5, strValue: "foo" };
Это создает законченный объект.
JavaScript использует основанную на прототипе объектную ориентацию и обеспечивает способность расширить типы во времени выполнения:
String.prototype.doubleLength = function() {
return this.length * 2;
}
alert("foo".doubleLength());
объект делегирует весь доступ к атрибутам, которые это не содержит само к его "прототипу", другому объекту. Это может использоваться для реализации наследования, но на самом деле более мощно (даже если более громоздкий):
/* "Constructor" */
function foo() {
this.intValue = 5;
}
/* Create the prototype that includes everything
* common to all objects created be the foo function.
*/
foo.prototype = {
method: function() {
alert(this.intValue);
}
}
var f = new foo();
f.method();
Предполагая, что вы можете использовать побитовые операторы, вы можете проверить, что общего у чисел с одинаковым выводом, в этом случае я предпочел использовать ввод 0–31, потому что это проще ( вы можете просто вычесть 1 из фактических значений)
Что у вас есть?
0x0000 -> 1
0x0001 -> 1
0x0010 -> 1
0x0011 -> 1
0x0100 -> 2
0x0101 -> 2
0x0110 -> 2
0x0111 -> 2
0x1000 -> 1
0x1001 -> 1
0x1010 -> 1
0x1011 -> 1
0x1100 -> 2
...
Это довольно просто, если вы заметите, что третий бит всегда равен 0
, тогда как на выходе должен быть 1
и наоборот это всегда 1
, когда вывод должен быть 2
так:
char codify(char input)
{
return ((((input-1)&0x04)>>2 == 1)?(2):(1));
}
EDIT
Как было предложено в комментарии, он должен работать также с
char codify(char input)
{
return ((input-1 & 0x04)?(2):(1));
}
, потому что на некоторых языках (например, C) 0
будет оценивать как false
, а любое другое значение - как true
. Я не уверен, работает ли он и на C #, потому что я никогда не программировал на этом языке. Конечно, это не зависящий от языка ответ, но он
JavaScript
Моей первой мыслью было
output = ((input - 1 & 4) >> 2) + 1;
, но код дрхирша отлично работает в JavaScript:
output = input - 1 & 4 ? 2 : 1;
и смешное (связанное с ответом FogleBird):
output = -~((input - 1) % 8 > 3);
Использование Python:
output = 1
for i in range(1, 32+1):
print "%d. %d" % (i, output)
if i % 4 == 0:
output = output == 1 and 2 or 1
char codify(char input)
{
return (((input-1) & 0x04)>>2) + 1;
}
В Groovy:
def codify = { i ->
return (((((i-1)/4).intValue()) %2 ) + 1)
}
Затем:
def list = 1..16
list.each {
println "${it}: ${codify(it)}"
}
Принятый ответ return ((((input-1) & 0x04) >> 2 == 1)? (2) :( 1));
использует ветку, а я бы только что написано:
return 1 + ((input-1) & 0x04) >> 2;
Многие говорят, что это невозможно, я бы пошел еще дальше и сказал бы, что это не имеет смысла.
Статический член - это то, что не относится ни к какому экземпляру, а только к классу .
Виртуальный член - это то, что не связано напрямую ни с одним классом, а только с экземпляром.
Таким образом, статический виртуальный член - это то, что не связано ни с одним экземпляром или классом.
любым способом, известным во время компиляции:// binary 1111 0000 1111 0000 1111 0000 1111 0000
const uint32_t lu_table = 0xF0F0F0F0;
// select 1 bit out of the table
if (((1 << (input-1)) & lu_table) == 0) {
return 1;
} else {
return 2;
}
Изменяя константу, вы можете обрабатывать любой шаблон вывода, который хотите. Очевидно, что в вашем случае есть шаблон, который означает, что это, вероятно, можно сделать быстрее (поскольку сдвиг не требуется), но все остальные уже сделали это. Кроме того, чаще всего таблица поиска представляет собой массив, но здесь это не обязательно.
В Haskell:
vec2graph :: Int -> Char
vec2graph n = (cycle "11112222") !! (n-1)
Это довольно просто:
if (input == "1") {Console.WriteLine(1)};
if (input == "2") {Console.WriteLine(1)};
if (input == "3") {Console.WriteLine(1)};
if (input == "4") {Console.WriteLine(1)};
if (input == "5") {Console.WriteLine(2)};
if (input == "6") {Console.WriteLine(2)};
if (input == "7") {Console.WriteLine(2)};
if (input == "8") {Console.WriteLine(2)};
и т. д.
HTH
Это зависит от языка, который вы используете.
В VB.NET вы можете сделать что-то вроде этого:
for i as integer = 1 to 32
dim intAnswer as integer = 1 + (Math.Floor((i-1) / 4) mod 2)
' Do whatever you need to do with it
next
Это может показаться сложным, но это только потому, что я поместил это в строку sigle.
Java, использующая операцию по модулю ('%'), чтобы задать циклическое поведение (0,1,2 ... 7), а затем тернарный, если 'округлить' до 1 (?) или 2 (:) в зависимости от возвращаемого значения. ...
public static void main(String[] args) {
for (int i=1;i<=32;i++) {
System.out.println(i+"="+ (i%8<4?1:2) );
}
Производит:
1 = 1 2 = 1 3 = 1 4 = 2 5 = 2 6 = 2 7 = 2 8 = 1 9 = 1 10 = 1 11 = 1 12 = 2 13 = 2 14 = 2 15 = 2 16 = 1 17 = 1 18 = 1 19 = 1 20 = 2 21 = 2 22 = 2 23 = 2 24 = 1 25 = 1 26 = 1 27 = 1 28 = 2 29 = 2 30 = 2 31 = 2 32 = 1
Python
def f(x):
return int((x - 1) % 8 > 3) + 1
Or:
def f(x):
return 2 if (x - 1) & 4 else 1
Or:
def f(x):
return (((x - 1) & 4) >> 2) + 1
In Perl:
#!/usr/bin/perl
use strict; use warnings;
sub it {
return sub {
my ($n) = @_;
return 1 if 4 > ($n - 1) % 8;
return 2;
}
}
my $it = it();
for my $x (1 .. 32) {
printf "%2d:%d\n", $x, $it->($x);
}
Or:
sub it {
return sub {
my ($n) = @_;
use integer;
return 1 + ( (($n - 1) / 4) % 2 );
}
}
Вы можете использовать комбинацию целочисленного деления и по модулю 2 (четно-нечетное): есть блоки по четыре, и 1-й, 3-й, 5-й блок и так далее должны привести к 1, 2-й, 4-й, 6-й и так далее в 2.
s := ((n-1) div 4) mod 2;
return s + 1;
div
предполагается целочисленным делением.
РЕДАКТИРОВАТЬ: Разумеется, преобразовал первый мод в div
в C:
char output = "11112222"[input-1 & 7];
или
char output = (input-1 >> 2 & 1) + '1';
, или по идее FogleBird:
char output = input - 1 & 4 ? '2' : '1';
, или по идее Стива Джессопа:
char output = '2' - (0x1e1e1e1e >> input & 1);
или
char output = "12"[input-1>>2&1];
Приоритет оператора C - зло . Используйте мой код как плохие примеры: -)