Quine Challenge I


12

Вызов

В этой задаче вы должны написать программу, которая будет вводить целое число N (-1e9 <= N <0 && 0 <N <= + 1e9) , а затем вычислять T = (abs (N)% M + 1) , если N положительно, затем выведите T-й символ с начала, иначе выведите T-й символ с конца вашего источника.

M - размер вашего источника в байтах.

Пример: если ваш источник:abcd efg/hi

Входные данные:

 2

Выход:

 c

Вход :

-3

Выход:

g 

Вход :

-9249678

Выход:

b 

Вход :

-11

Выход:

i 

Ограничения

  • Не используйте операцию FILE
  • Вы можете использовать любой язык на ваш выбор
  • Старайтесь избегать или, вернее, не использовать 1-байтовые представления, так как это портит все удовольствие.
  • Самое короткое решение побеждает!

РЕДАКТИРОВАТЬ: формулировка проблемы была изменена таким образом, чтобы решения могли оцениваться с использованием случайных тестовых данных (и одинаковых данных для всех решений), поэтому, пожалуйста, обновите свое решение соответствующим образом, извините за неудобства (если таковые имеются).


В приведенном примере теста, если входное значение равно 5 или -7, выходное значение должно содержать один пробел: "" (без кавычек).
Quixotic

Что если N равно 0?
aaaaaaaaaaaa

@eBusiness: Спасибо за указание на это, я изменил формулировку проблемы, я не думаю, что $ 0 $ может произойти сейчас :-)
Quixotic

3
Это Сорт продолжает быть странное отображение, теперь символ пропускается при скачке от 0 до 1: -2 -> / -1 -> h 0 -> i 1 -> b 2 -> c. Но, по крайней мере, теперь карта единодушна.
аааааааааааа

1
Я думаю, что &&в первом предложении должно быть ||?
Пауло Эберманн

Ответы:


12

Сборка x86 (32-битный Linux, AT & T синтаксис): 548

Нет новой строки в конце файла:

pushl 8(%esp)
call atoi
mov $274,%ebx
cmp $0,%eax
jg a
dec %eax
a:cdq
idiv %ebx
cmp $0,%edx
jge p
add %ebx,%edx
p:add $s,%edx
cmp $s+273,%edx
jl l
push $34
mov %esp,%edx
l:mov $4,%eax
mov $1,%ebx
mov %edx,%ecx
mov $1,%edx
int $128
mov $0,%ebx
mov $1,%eax
int $128
s:.ascii "pushl 8(%esp)
call atoi
mov $274,%ebx
cmp $0,%eax
jg a
dec %eax
a:cdq
idiv %ebx
cmp $0,%edx
jge p
add %ebx,%edx
p:add $s,%edx
cmp $s+273,%edx
jl l
push $34
mov %esp,%edx
l:mov $4,%eax
mov $1,%ebx
mov %edx,%ecx
mov $1,%edx
int $128
mov $0,%ebx
mov $1,%eax
int $128
s:.ascii "

Я скомпилировал это с gcc -nostartfiles -m32 qc1.S -o qc1

Проверка, положительные числа:

$ for i in $(seq 548 1095); do ./qc1 $i; done | cmp - qc1.S && echo Good
Good

Проверка, отрицательные числа:

$ for i in $(seq -1095 -548); do ./qc1 $i; done | cmp - qc1.S && echo Good
Good

Edit получил это право о странной схеме нумерации. Я думаю. Это не изменило длину.


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

Хех, довольно круто. И что забавно, несмотря на то, что языки настолько разные, это похоже на моё 44-символьное решение GolfScript.
аааааааааааа

1
@Debanjan: я действительно не могу обернуться вокруг схемы нумерации. Не могли бы вы предоставить правильные линии проверки? (постановка задачи была бы хорошим местом)
JB

+1, это ваш второй «недействительный» ответ здесь (код-гольф), за который стоит проголосовать :)
Eelvex

@Eelvex: для записи, другой был действителен на момент публикации.
JB

10

Что бы вы знали, HQ9 + возвращается!

Q

Не нужно беспокоиться об индексации, когда есть только один символ на выбор!


Требуется ли какой-либо вклад?
Quixotic

@Debanjan: конечно:echo '-1' | hq9+ qc1
JB

Извините, это не имеет особого смысла для меня, у меня есть одно подобное решение в PHP, но разве это решение не портит все удовольствие? Спасибо,
Quixotic

Вы не должны принимать это, если не думаете, что оно подходит, вы знаете! Вам даже не нужно это поднимать. Вы можете даже downvote его, хотя I «d лично не ценят ;-)
JB

Нет, речь идет не о принятии или отклонении, я просто высказал мнение, и я бы хотел проголосовать за него, так как узнаю что-то новое :-)
Quixotic

5

Ruby 1.9, 66 символов

z=gets.to_i;s="z=gets.to_i;s=%p;$><<(s%%s)[z%%66]";$><<(s%s)[z%66]

На самом деле, нет особой разницы с обычной мукой.

  • Редактировать: теперь следует новым спецификациям.

5

GolfScript 26 символов

{':f`f'+1/\~.1<- 26%=}:f`f

Квины были веселее до изобретения динамических языков.

Изменить: для нытиков, вот "настоящая" quine GolfScript, без `и ~ используется только для анализа ввода.

Инвалиды GolfScript 44 символа

'"\x27"\+1/\~.1<- 22%='"\x27"\+1/\~.1<- 22%=

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


1
Я не знаю GolfScript, но ваш комментарий подталкивает меня к мысли, что ваш код склоняется к категории ограничений «Операция ФАЙЛ». Хотите расширить свои внутренности?
JB

Волшебство происходит с помощью оператора `, в основном я определяю функцию, сохраняю ее в переменной, преобразовываю функцию в собственное строковое представление (` делает это), а затем запускаю функцию, которая может тривиально завершить задачу поскольку у него есть свои внутренние особенности в последовательности.
aaaaaaaaaaaa

+1: to Quines were more fun before the invention of dynamic languages.:-)
Quixotic

3
Ну, я уверен, что, черт возьми, не буду пробовать это на ассемблере ...
JB

6
Сотрите это. Я сделал попробовать это на языке ассемблера.
JB

2

Lenguage, 4 байта

Исходный код состоит из 4 нулевых байтов. Независимо от ввода, вывод должен, таким образом, быть нулевым байтом, который выполняется одной .инструкцией.


0

Smalltalk, 94 90 59 52

например, в классе Object скомпилируйте:

q:n|s|s:=thisContext method source.^s at:n\\s size+1

затем отправьте q: <n> любому объекту; здесь целое число:

проверка:

1 q: 0 -> q
1 q: 1 ->:
1 q: 2 -> n
...
1 q: -1 ->)
1 q: -2 ->)
1 q: -3 -> 1

или лучше:
(от 0 до: 100) собрать: [: n | 1 q: n] as: String
->')q:n|s m|s:=thisContext method source.m:=s size.^s at:(n>=0ifTrue:n-1\\m+1ifFalse:m-(0-n\\m))q:n|s m|'

(-1 downTo: -500) собирать: [: n | 1 q: n] as: String
->')m\\n-0(-m:eslaFfi1+m\\1-n:eurTfi0=>n(:ta s^.ezis s=:m.ecruos dohtem txetnoCsiht=:s|m s|n:q))m\\n-0('

объяснение не-Smalltalkers:
thisContext - текущий фрейм стека, который может быть запрошен для его метода , который может быть запрошен для его источника .


0

Рунические чары , 17 байт

"3X4+kSq:l͍iS%%@

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

Просто использует стандартный quine для генерации программной строки, а затем использует строковый оператор по модулю 1, чтобы получить символ с заданным индексом (который изначально поддерживает отрицательные и положительные знаки, поведение под влиянием Python).

  1. Команда ,«делить» разрезает строку на куски (достаточно логично, чтобы не *дублировать времена строки x), +объединяет и -удаляет xсимволы с конца (достаточно логично, что инверсия +). Таким образом, %команда играет роль charAt(x): единственной оставшейся базовой строковой операции (после того, как стекоподобные операции обрабатываются теми же командами, которые работают со стеком; например, lэто размер стека, а также длина строки).

0

JavaScript (ES6), 28 байт

f=n=>("f="+f).substr(n%28,1)

Модифицированная квинна.

Значение больше 28 обрабатывается %28, значение меньше 0 обрабатывается .substr().

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