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это размер стека, а 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.