Выведите первую позицию в вашей программе для каждого входного символа


43

Вызов

Напишите непустую программу / функцию, pкоторая, учитывая непустую входную строку s, выводит позицию первого вхождения каждого символа sв исходном коде p.

Например, если ваша программа

main() { cout << magic << cin }
^0   ^5   ^10  ^15  ^20  ^25

и он получает вход abcd{, выход должен быть

[1, x, 9, x, 7] (0-based)        [2, x, 10, x, 8] (1-based)

Здесь, xпредставляет любой вывод , который не является допустимым для вывода позиции символа (например, отрицательное число, 0если вы используете индексацию 1 на основе, NaN, Inf, строка potato, число больше длины вашей программы, и т.д.).

ограничения

Чтение исходного кода не допускается (как в правильном квине). Использование комментариев разрешено, но учитывается при подсчете очков.

Ввод и вывод могут быть выполнены в разумном формате, но должны быть однозначными (только дополнительные разделители, нет randпотока и утверждение, что ответ где-то там), согласованным (например, приведенное xвыше значение всегда должно быть одинаковым) и человеком читаемый ; например, строка или массив символов. Вы можете предположить, что ввод представляет собой строку (или массив) печатных символов ASCII; нет необходимости обрабатывать весь набор Unicode.


Пользовательская кодовая страница или непечатаемая ascii в вашем коде?

Если ваш язык использует пользовательскую кодовую страницу (Jelly, APL и т. Д.), Вы должны принять это во внимание (поэтому программа €æÆдолжна выводить данные [1, x, 2]для ввода €%æ). Использование только не-ASCII символов для вывода -1всегда (так как ввод только ASCII) не является допустимым решением. Вы можете предположить, что ваша программа изначально принимает вашу пользовательскую кодовую страницу, т. Е. Если ваша программа имеет метод преобразования символа Aв целое число 65(кодировка ASCII), вы можете предположить, что теперь она преобразует 65-й символ в вашей кодовой странице 65.


Вдохновлен следующей задачей: Позиционная осведомленность


Капитализация имеет значение?
Kritixi Lithos


@KritixiLithos Это действительно так.
Sanchises

Если в моей программе используются только индексы от 0 до 9 , нужен ли мне разделитель или я могу вывести, например 01030708070,?
Деннис

@ Денис Нет, ты не. Это однозначный, последовательный и понятный человеку. Требование разделителя не добавит ничего интересного к этой задаче, поэтому непременно злоупотребляйте своим низким количеством байтов. ;)
Sanchises

Ответы:


24

Python2, 55 байт

a=" )dfi(+m,nprut.';";print map(('a="'+a).find,input())

Начинается со строки, содержащей все символы, используемые в коде, а затем выполняет поиск по индексам.


5
Я не понимаю, как это скучный ответ. Я думаю, что использование стандартного Quine намного менее интересно, чем это. :)
Мартин Эндер

Поскольку это Python 2, разве это не сломается на большинстве входов? Если он сломается, вам придется использовать raw_input.
TidB

@ TidB Хм, наверное нет? какой вклад вы имеете в виду?
Род

@Rod Nevermind, я просто был немного тупым. Это всегда будет работать, когда вы вводите итерацию. Я такой глупый.
TidB

12

Lenguage , 56 623 байта

Ниже приведен шестнадцатеричный дамп первых 256 байтов. Остальные байты могут быть выбраны произвольно.

0000000: 00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f  ................
0000010: 10 11 12 13 14 15 16 17 18 19 1a 1b 1c 1d 1e 1f  ................
0000020: 20 21 22 23 24 25 26 27 28 29 2a 2b 2c 2d 2e 2f   !"#$%&'()*+,-./
0000030: 30 31 32 33 34 35 36 37 38 39 3a 3b 3c 3d 3e 3f  0123456789:;<=>?
0000040: 40 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f  @ABCDEFGHIJKLMNO
0000050: 50 51 52 53 54 55 56 57 58 59 5a 5b 5c 5d 5e 5f  PQRSTUVWXYZ[\]^_
0000060: 60 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f  `abcdefghijklmno
0000070: 70 71 72 73 74 75 76 77 78 79 7a 7b 7c 7d 7e 7f  pqrstuvwxyz{|}~.
0000080: 80 81 82 83 84 85 86 87 88 89 8a 8b 8c 8d 8e 8f  ................
0000090: 90 91 92 93 94 95 96 97 98 99 9a 9b 9c 9d 9e 9f  ................
00000a0: a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 aa ab ac ad ae af  ................
00000b0: b0 b1 b2 b3 b4 b5 b6 b7 b8 b9 ba bb bc bd be bf  ................
00000c0: c0 c1 c2 c3 c4 c5 c6 c7 c8 c9 ca cb cc cd ce cf  ................
00000d0: d0 d1 d2 d3 d4 d5 d6 d7 d8 d9 da db dc dd de df  ................
00000e0: e0 e1 e2 e3 e4 e5 e6 e7 e8 e9 ea eb ec ed ee ef  ................
00000f0: f0 f1 f2 f3 f4 f5 f6 f7 f8 f9 fa fb fc fd fe ff  ................

Вывод в байтах, как обычно для brainfuck et al.

Как это работает

Это простая программа для кошек, в частности ,[.,].

Исходный код содержит все 256-байтовые значения по порядку, поэтому индекс каждого байта в нем соответствует своему значению.


4
Хммм, я думаю, что Lenguage - единственный язык, где люди опережают людей на три порядка ...
Sanchises

2
Lenguage также является единственным языком, который постоянно находит способы мошенничества, которые даже не будут дистанционно конкурировать с другими языками. : P
Деннис

Не было +[,.]бы гораздо лучше?
Sanchises

@Sanchises. Это сэкономит примерно 12 000 байт, но в конце также будет напечатан дополнительный нулевой байт.
Деннис

2
Что ж, я предполагаю, что нулевой байт находится на входе (хотя его функция заключается в завершении строки) и будет на 0-й позиции в вашей программе ...;)
Sanchises

10

Lenguage , 1.22e7 байт

Состоит из 12263215 NULбайтов, (Hex 0x00) .

Выводит a NULдля каждого символа, который не отображается в источнике.

Уловка состоит в том, что вход никогда не будет содержать a NUL, поэтому мы всегда выводим количество NULs, что есть символы на входе.

Это переводит в следующую программу Brainfuck

,[[-].,]

И с поломкой ...

,[[-].,]
,[    ,]    #Basic Input loop.
  [-]       #Zero out the cell.
     .      #Print it (A NUL).

Это просто показывает всю мощь Lenguage как языка игры в гольф. Бойся этого


2
Такая хитрая уловка, ты почти выиграл ... Ты тоже пробовал обратное, то есть 0x00 байтов и 1-индексация?
Sanchises

Я бы с удовольствием, но Brainfuck / Lenguage (или, по крайней мере, переводчик, которого я использую) не может различить EOF и 0x00, поэтому я не смог бы фактически ответить на вызов.
ATaco

Brainfuck et al. обычно разрешается печатать целые числа в байтах, т. е. вы печатаете SOH для 1, NUL для 0.
Деннис

@Sanchises Не могли бы вы подтвердить, что дело здесь?
Деннис

1
Не ,[>.,]будет короче?
Джо Кинг,

8

Желе , 10 9 байт

“ṾiЀƓv”v

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

Как это работает

“ṾiЀƓv”v  Main link. No arguments.

“ṾiЀƓv”   Set the left argument and the return value to s := 'ṾiЀƓv'.
        v  Execute the string s as a monadic Jelly program with argument s.

 Ṿ         Uneval; yield a string representation of s, i.e., r := '“ṾiЀƓv”'.
     Ɠ     Read one line from STDIN and evaluate it like Python would.
  iЀ      Find the index of each character in the input in r.
      v    Eval the list of indices as a monadic Jelly program with argument s.
           Why?
             This is the shortest way to add the character 'v' to the string s,
             meaning that we can use r without having to append anything.
           What?
             The v atom vectorizes at depth 1 for its left argument, meaning that
             it acts on arrays of numbers and/or characters. When fed an array of
             integers, it first converts them to strings, then concatenates the
             strings and evaluates them as a Jelly program. For example, the array
             [1, 2, 3] gets cast to the string '123', then evaluates, yielding 123.
             Something slightly different happens if the array starts with a 0. For
             example, the array [0, 1, 2] gets cast to '012' just as before, but
             Jelly views '0' and '12' as two separate tokens; numeric literals
             cannot start with a 0. Since the Jelly program is monadic, the first
             token – '0' – sets the return value to 0. Since the second token –
             '12' – is also a niladic link, the previous return value is printed
             before changing the return value to 12. Then, the program finishes
             and the last return value is printed implicitly.

8

pbrain, 402 356 340 338 329 байт

[(:<>)+,-.](>>>>>>)+([-]<<[->+>+<<]>>[-<<+>>]>>[-<+<+>>]<[->+<]<[-<->]<)+([-]+++++++[>+++++++++++++<-]>)+([-]+++++[>++++++++<-]>)+(-:<+++[->++++++<]>)+(-:++)+(-:++)+(----:+)+(-:++)+(-:+)+(-:+)+(-:+)+([-]++:++)+([>[->+>+<<]>>[-<<+>>]<:>>+:[[-]>+<]>-[<<<<[-.>]>>>>>>+>>>>>]<<[-]<<+<-]>>>)[-]>>>>>>>,[<<<<<<++<+++++++++++++:>>>>>>,]

Фу, @KritixiLithos и я работаем над этим уже 4 дня.

Печатается, 0x00если входной символ не находится в программе, в противном случае индекс символа (на основе 1) в шестнадцатеричном виде. Попробуйте онлайн!

Объяснение:

[(:<>)+,-.]
All chars listed here; like other submissions 
(>>>>>>)
@KritixiLithos added this part; I don't know what it does but saves the program
+([-]<<[->+>+<<]>>[-<<+>>]>>[-<+<+>>]<[->+<]<[-<->]<)
Comparison ;calculates z=x!=y and puts it in between x and y
Start; X _ _ _ Y
           ^
End;   X Z _ _ Y
         ^
+([-]+++++++[>+++++++++++++<-]>)
Function to add 91 to the tape
+([-]+++++[>++++++++<-]>)
Function to add 40 to the tape
+(-:<+++[->++++++<]>)
Function to add 58 to the tape
+(-:++)
Function to add 60 to the tape
+(-:++)
Function to add 62 to the tape
+(----:+)
Function to add 41 to the tape
+(-:++)
Function to add 43 to the tape
+(-:+)
Function to add 44 to the tape
+(-:+)
Function to add 45 to the tape
+(-:+)
Function to add 46 to the tape
+([-]++:++)
Function to add 93 to the tape
+([>[->+>+<<]>>[-<<+>>]<:>>+:[[-]>+<]>-[<‌​<<<[-.>]>>>>>>+>>>>>]<<[-]<<+<-]>>>)

Эта последняя функция - цикл. Он просматривает выбранные символы [(:<>)+,-.]по порядку и сравнивает ввод с символом. Теперь я собираюсь дать более глубокое объяснение того, как работает этот цикл.

12-n n+2 _ n+2: _ _ _ i _ _ _ _ _ _;  n=loop counter
                  ^                ;  i=input

Стек выглядит так, когда находится в цикле. Цикл будет работать, пока не 12-nбудет 0. Тогда у нас есть счетчик, который есть n+2. Этот счетчик также является номером функции для каждого из выбранных символов. Поэтому , когда n=0, n+2будет соответствующее первому символу, то есть [. >[->+>+<<]>>[-<<+>>]<:делает это, он конвертирует счетчик в символ.

Как только указатель окажется там, где находится курсор, мы сравним символ, полученный из переменной counter, с вводом, сохранив их.

12-n n+2 _ n+2: Z _ _ i _ _ _ _ _ _;  n=loop counter
                ^                  ;  i=input

Zэто 0когда символ равен вводу или другому ненулевому целому числу в противном случае.

Теперь мы придумали оператор if, чтобы проверить это равенство.

[[-]>+<]

Если Zне ноль, то есть символ и ввод не совпадают, мы увеличиваем следующее место в памяти.

После того, как мы выйдем из этого оператора if, мы уменьшим следующую ячейку памяти. Теперь это место памяти содержит !Z. Наконец, используя это, мы выводим индекс символа, если он совпадает с вводом, а затем принудительно покидаем цикл. Иначе, мы продолжаем цикл пока он не закончится или совпадение не будет найдено.

[-]>>>>>>>
Clears first byte; goes to position to start program
,[<<<<<<++<+++++++++++++:>>>>>>,]
Loops inputs


6

Javascript, 34 байта

f=a=>a.map(v=>('f='+f).indexOf(v))

Он принимает входные данные в виде массива строк, xis -1(индексация на основе 0).


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

1
@ mbomb007 Я не могу говорить за все движки JavaScript, но в Firefox Function.toString работает, читая исходный код. В какой-то момент он потерпит крах в отладочных сборках, если источника больше не будет, когда он попытается его прочитать. (Я не пробовал это в последнее время, потому что отладочные сборки в целом такие аварийные.)
Нил

Я не думаю, что это немного отличается от того, как s='s=%s;print s%%s';print s%sв Python. Это не включает f=, так что все в порядке
mbomb007

1
Вы не можете сделать это на самом деле, потому что ввод aдолжен быть строкой. Там нет mapфункции для строк.
Manonthemat

@manonthemat «Вы можете предположить, что входные данные являются строкой (или массивом)»
LarsW


5

Рубин, 41 88 86 71 69 67 61 56 байт

a='p$<.chrs{| #index};"';$<.chars{|c|p"a='#{a}".index c}

Thx Линн за убийство 6 байтов


1
a='p$<.chrsm{| #index};"';p$<.chars.map{|c|"a='#{a}".index c}должен работать тоже, принимая во внимание STDIN.
Линн

4

> <> (Рыба) 70 байт

 #.0+4*a5;!?l|!?f4*b+l1--naolc3*1+0.01?!|~ed+0.0+2e-{:;!?+1:i-1:r}+2:"

Возможно, самый длинный> 1> лайнер, который я когда-либо делал.

Он напечатает вывод для каждого символа, найденного в отдельной строке (0 проиндексирован).

Не найденный символ всегда будет печатать длину кода + 1 (я мог бы изменить это, если в текущем состоянии это будет считаться не в порядке), поэтому в этом случае 71 всегда будет символом «Не найден».

Я найду объяснение, как только у меня будет время.

Некоторые тестовые случаи;

## K = 1 \ n1 \ n71

# "# = 1 \ n69 \ n1

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

> <> язык


Я думаю, что 71 хорошо в качестве выхода для не найден. Это непротиворечивый, однозначный и понятный человеку текст, который, я думаю, важнее, чем «... любой результат, который не является положительным целым числом». Я расширил правила, чтобы отразить это решение.
Sanchises

3

Perl 6 , 50 52 байта

{(('R~.index$_) for}\\'R~'{((\'').index($_) for $_)}

Перевод решения рубинового GB в и решения Python Рода .

Лямбда, которая вводит список символов и выводит список индексов, начинающихся с нуля ( Nilдля несуществующих символов).

РЕДАКТИРОВАТЬ: Исправлен недосмотр - требуется добавить 2 байта :(


3

Clojure, 43 56 48 байтов

Редактировать: Черт, я забыл о 2! Увеличено с 43 до 56.

Редактировать 2: Обновлен пример кода под этим текстом, обновлено количество байтов (не включать (def f ...), но только часть хеш-карты.

{\{ 0\\   1\  3\0   4\1 10\3 14\4 20\2 34 \} 43}

Хэш-карта состоит только из символов 01234{\\}и кодирует их местоположение. В Clojure hash-maps могут использоваться функции, как показано в этом полном примере ( fможет быть заменено определением hash-map):

; Keeping track of the zero-based index:
;      00000000001111111111222222222233333333334444444444
;      01234567890123456789012345678901234567890123456789
(def f {\{ 0\\   1\  3\0   4\1 10\3 14\4 20\2 34 \} 43})

(map f "0123456789{} \\abcdef") ; (4 10 34 14 20 nil nil nil nil nil 0 43 3 1 nil nil nil nil nil nil)
(apply str (keys f))            ; " 01234{\\}"

Я думаю, это имеет значение :)


2

JavaScript, 39 байт

p=s=>[...s].map(c=>`p=${p}`.indexOf(c))

console.log( p('mapP') )


1
не могли бы вы объяснить, [...s]пожалуйста?
Erresen

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

2
Чтение исходного кода не допускается
Арнаулд

2

Pyth, 11 байт

xL_+N"N+_Lx

Программа, которая принимает входные данные "quoted string", с любыми кавычками в строке, с предыдущей \, и печатает список значений с нулевым индексом -1для символов, отсутствующих в источнике.

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

Как это работает

xL_+N"N+_Lx    Program. Input: Q
xL_+N"N+_Lx"Q  Implicit quote closure and implicit input
     "N+_Lx"   Yield the string "N+_Lx"
   +N          Prepend a quote
  _            Reverse
 L          Q  Map over Q:
x               Yield the index of the character in the string
               Implicitly print

2

05AB1E , 19 байтов

"'ìsvDyk,"'"ìsvDyk,

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

Это выводит -1 вместо отсутствующих символов.


Луис Мендо опубликовал это (слегка измененное) на Golf, что вам очень понравилось! добавление "s" и "k" к этой квине приводит и к этому ответу. Тем не менее, я не могу взять кредит на эту тривиальную модификацию ... Луис, вы можете написать мне, если вы хотите опубликовать это, и я просто удалю его. Если вы хотите увидеть мой прогресс, прежде чем найдете этот вопрос, просмотрите изменения. Ну ... В какой-то момент это было очень похоже на его.


@Sanchises работает для меня!
Волшебная Урна Осьминога

Круто, круто, круто!
Sanchises

@MagicOctopusUrn Молодец !!
Луис Мендо

2

SmileBASIC, 128 96 88 86 байт

?R<3+CD,4LINPUT(S$)WHILE""<S$?INSTR("?R<3+CD,4LINPUT(S$)WHILE"+CHR$(34),SHIFT(S$))WEND

Важно понимать, что на самом деле это не сложная задача. Вам нужен только исходный код до последнего уникального символа .

Я помещаю по крайней мере 1 из каждого символа в начале кода: ?R<3+CD,4LINPUT(S$)WHILE"поэтому мне нужно только сохранить копию программы до первой кавычки.


1

Python, 90 88 байт

a,b,d=" ()+.7:[]efilmnor","a,b,d=\"",lambda e:[[b.find(d),a.find(d)+7][d in a]for d in e]

Прецедент:

print(d("a,b(]q"))
#[0, 1, 2, 8, 15, -1]

1

Сложенный , неконкурентный, 36 байтов

Когда я сказал, что этот язык все еще в разработке, я имел в виду это. Видимо, promptраньше потреблял весь стек. Вот почему я не могу иметь хорошие вещи. Попробуй это здесь!

[tostr ':!' + prompt CS index out]:!

Это стандартная структура Quine. По сути, :дублирует функцию [...]в стеке, которая затем выполняется с !. Затем внутренняя часть [...]выполняется с функцией в стеке. Он преобразует его в строку, добавляет :!(саму программу), а затем принимает строку ввода с prompt. CSпреобразует его в символьную строку. Символьная строка немного отличается от обычной строки тем, что в ней есть операторы векторизации. В этом случае, indexвекторизация по вводу, выдача каждого индекса входной строки в программе, наконец, outвставляется.

Для ввода Hello, World!это дает:

(-1 27 -1 -1 2 -1 6 -1 2 5 -1 26 9)

Я попытался использовать тот, который не имеет кавычки (т. Е. Кодировать строку символов, которые появляются в вашем источнике), но в Stacked есть только один тип кавычек, а именно ', поэтому решение такого типа будет длиннее.


1

Шелуха , 12 байт

m€`:'""m€`:'

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

объяснение

Объяснение используется ¨для разделения строк и 'для разделения символов:

m€`:'""m€`:'  -- implicit input, for example: ¨m"a1`¨
      "m€`:'  -- string literal: ¨m€`:'¨
  `:'"        -- append character '"': ¨m€`:'"¨
m             -- map function over each character (example with 'a'):
 €            -- | index of first occurrence (1-indexed): 0
              -- : [1,6,0,0,3]

1

Java 8, 172 122 байта

a->{/*.indexOf(c)+\" ;}orh:Systmup*/for(char c:a)System.out.print("a->{/*.indexOf(c)+\\\" ;}orh:Systmup".indexOf(c)+" ");}

0 индексируется, и дает -1для символов, которые не являются частью исходного кода.

Объяснение:

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

a->{                         // Method with character-array parameter and no return-type
  /*.indexOf(c)+\" ;}orh:Systmup*/
                             //  Comment containing the remaining characters of the code
  for(char c:a)              //  Loop over the input-array
    System.out.print(        //   Print:
      "a->{/*.indexOf(c)+\\\" ;}orh:Systmup"
                             //    String containing all the characters used in the code
      .indexOf(c)+" ");}     //    Print the index of the char, plus a space as delimiter

1

J , 31 22 байта

11|1+i.~&'11|1+i.~&'''

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

1-индексированный, 0 для символов, которых нет в коде. ''обозначает одну цитату. Найдите каждый символ в строке 11|1+i.~&', добавьте 1, по модулю 11.



1

Perl 5 с -pl, 43 байта

Использует ввод с разделителями новой строки и печатает -1для символов, не появляющихся в программе.

$s=q{$_=index"\$s=q{$s};eval\$s",$_};eval$s

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


Исправлены @Sanchises сейчас, извините за это. Ясно, не читал правильно!
Дом Гастингс

Нет проблем. Спасибо за то, что принесли новую жизнь в этот вызов!
Sanchises

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