Покажчики, покажчики, покажчики!


46

Вступ

У вихідних помилках деяких мов, таких як Java, показано покажчик , який дає програмісту уявлення про те, де помилка пішла не так.

Візьмемо цей приклад на Ideone:

Main.java:12: error: ';' expected
    Invalid Java!
                ^

Помітьте, що каре показує, де недійсний код?

Виклик

Ваше завдання полягає в : задане число N і рядок S , помістіть покажчик на N - й символ в S .

Приклади

Вхід :2, "Lorem ipsum, dollar sit amet."

Вихід :

Lorem ipsum, dollar sit amet.
 ^

Правила

  • Вхід приймається через STDIN або параметри функції
  • Виведення друкується на консоль або returnредакцію
  • Виведення нових рядків, пробілів тощо дозволяється у висновку
  • Символ вказівника повинен бути ^ каретом і повинен бути на новому рядку.
  • Це кодовий гольф, тому найкоротша відповідь виграє. Удачі!

16
Я відчуваю, що це надзвичайно проста проблема, тому я не впевнений, що це буде сприйнято занадто добре. Ви можете спробувати пісочницю, як тільки у вас буде достатня кількість представників.
FryAmTheEggman

6
Я думаю, що це могло б бути трохи цікавішим, якби на вході було кілька рядків, так що вам потрібно було вставити нову лінію, пробіли та карати у правильному положенні. Чесно кажучи, специфікація насправді не говорить про те, що це буде єдиний рядок, але я думаю, що примусоване виконання цього рішення визнає несправедливим кілька відповідей, оскільки немає прикладу, який би це свідчив.
Геобіц

3
Як я вже сказав, кіт, мабуть, вийшов з сумки на цьому. Зміни правил після опублікування дійсних відповідей зазвичай не спрацьовують добре. Живіть і вчіться;)
Геобіц

1
@SohamChowdhury Я просто роблю вигляд, що це було навмисно;) Ви хочете, щоб я це виправив?
monkeyonkeyboard

9
Хоча це може бути дуже простим, ви, безумовно, добре зробили для першого виклику! Ви маєте + 16 / -0 голосів, 1300 переглядів та 28 відповідей (станом на цей текст), і ви склали список гарячих мережевих запитань. Хороша робота!
Олексій А.

Відповіді:


36

C 33

Якщо дозволена лише функція, то навіть c може конкурувати.

(Для запису 2 байти зберегли thx в @Cool Guy. Mt thx коментар несподівано випарується.)

Ще 1 картка зберегла thx @Mig

f(a,c){printf("%s\n%*c",a,c,94);}

19
C завжди може конкурувати, він просто не завжди може виграти. ;)
Олексій А.

3
@AlexA. <shrug> мені виглядає як перемога ;-)
Digital Trauma

3
Збережіть 1 чар:f(a,c){printf("%s\n%*c",a,c,94);}
Майкл М.

Якби я була цинічною людиною, я б сказав, що це все-таки приблизно в 4 рази довше, ніж найкоротша відповідь мовою гольфу. Що стосується бізнесу як завжди. ;) Це все-таки розумно. Я думаю, що раніше бачив *варіант у рядку формату, але зовсім забув про нього. Можливо, це стане в нагоді для деяких проблем мистецтва Ascii в майбутньому.
Рето Коради

35

Brainf * ck - 133 байт

+++++>>+>>+++>>+++++++++<<<<<<[[->++++++++++<]>>]<++++<<++<<<<--<,>[->+<<->]>>>,<<[->>-<<]<<[->>>>++++++++++<<<<]>>+[,.]>.>[->.<]>>>.

Очікує введення, [0-9]{2}.*наприклад, "02 Привіт світ !!!" буде виробляти

Привіт Світ!!!
 ^

Ласкаво просимо до головоломки програмування та коду для гольфу! Це чудова перша публікація, приємна робота! : D
Алекс А.

Проблема в тому, що ніхто не знає, чи це навіть дійсний код, не кажучи вже про вирішення проблеми :)
Саймон

Так, я думаю, що тут є помилка по одному. Карета повинна бути відповідно eдо прикладу. Ціною 1 байт це можна виправити, додавши -перед[->.<]
FryAmTheEggman

@FryAmTheEggman ви праві - дивіться правки. Спочатку я мав його під e, як зараз, але я заплутався, використовуючи два IDE з різними шрифтами.
sudo rm -rf slash

25

Машинний код IA-32, 24 байти

Hexdump:

66 b8 5e 00 42 38 22 75 fb 66 c7 02 0d 0a 42 42
c6 02 20 e2 fa 89 02 c3

Це функція (використовуючи fastcallконвенцію MS ), яка оновлює рядок на місці:

__declspec(naked) void __fastcall carrot(int n, char* s)

Код складання:

    mov ax, '^'; // ah = 0, al = '^'

mystrlen:
    inc edx;
    cmp [edx], ah;
    jne mystrlen;

    mov word ptr [edx], '\r\n'; // append a newline
    inc edx;

mymemset:
    inc edx;
    mov byte ptr [edx], ' ';
    loop mymemset;

    mov [edx], eax; // append a caret and terminate the string
    ret;

Він використовує WORDвеликі (16-бітні) дані в декількох місцях. Це має штраф (1-байтовий префікс) у 32-бітовому коді, але все-таки робить код меншим - за допомогою 32-бітових даних буде введено два нульових байти в код!

Зрештою, він записує 4 байти ( eax) замість 2 байтів ( ax) - код таким чином менший, а 2 зайвих байта небажаної пошти йдуть після закінчення рядка, тому ніхто їх не помічає.

Використання:

int main()
{
    char s[100] = "Lorem ipsum, euro sit amet.";
    carrot(2, s); // credit to Digital Trauma for the name
    puts(s);
}

1
Інструкція 66 b8 5e 00рухається 0x5eдо " alне" ahта "нульового" ahзамість al, тому ваш коментар до асемблерного коду вводить в оману.
Руслан

@Ruslan Дякую! Виправлено. Це був залишок від попередньої версії.
anatolyg

Чому nakedтам? І чому це перше, що я побачив?
caird coinheringaahing

Microsoft вирішила поставити nakedперед: msdn.microsoft.com/en-us/library/h5w10wxs.aspx
anatolyg

20

Піта , 8

zp\^*tQd

Це рішення більше не працює, оскільки комісія після тієї, яку я пов'язував із мовою назви мови, змінилася pна арність 1. Існує декілька інших способів досягнення аналогічних показників у Pyth, які працюють і сьогодні zp+*dQ\^.

Якщо рядок потрібні лапки, додавання vдо початку коду працює. Якщо вона має бути відокремлена комою, вона досягає 10 байт:

eQp\^*dthQ

Я думаю, що це найкоротший досі. Молодці.
monkeyonkeyboard

Алгоритм мені здається неправильним, я думаю ^, завжди буде під першим символом. І, до речі, вхідні параметри в неправильному порядку подаються онлайн-інтерпретатору (так він не виконує виконання).
Джим

1
@Jim Ця відповідь використовувала старішу версію pyth, де pбула аритія 1. Це призвело до того, що спочатку буде надруковано перший рядок виводу, а потім карету в наступному рядку, а потім пробіли. Тепер ви можете зробити z+*dQ\^для більш короткого рахунку, але з pостанньою новою лінією, або додати "a" до, +щоб видалити його. Я не впевнений, що тут робити, оскільки люди підтримали цю версію відповіді, я думаю, я спробую знайти версію, над якою вона працювала.
FryAmTheEggman

16

T-SQL, 90

Хоча досить просте питання, завжди цікаво спробувати їх на мовах, які насправді не прагнуть їх добре підтримувати чи добре гольфувати з цього приводу.

Ця відповідь майже гарантована як найдовша.

Це створює функцію вбудованої таблиці для SQL Server, яка приймає параметри @n і @ і повертає результати як стовпець. Повернення вагона є вагомим, інакше мені потрібно використовувати char (13).

CREATE FUNCTION G(@N INT,@ VARCHAR(MAX))RETURNS TABLE RETURN SELECT @+'
'+SPACE(@n-1)+'^'R

Він використовується наступним чином

SELECT R 
FROM (VALUES
    (1,'This is test 1'),
    (2,'This is test 2'),
    (3,'This is test 3'),
    (4,'This is test 4'),
    (5,'This is test 5')
    )T(n,S)
    CROSS APPLY G(n,S)

І повертається

R
---------------
This is test 1
^
This is test 2
 ^
This is test 3
  ^
This is test 4
   ^
This is test 5
    ^

Дуже креативно використовує мову, не дуже розроблену для гольфу;) +1
monkeyonkeyboard

14

Пітона, 27

lambda n,s:s+'\n%%%dc'%n%94

Тут використовується два рівні форматування рядків.

І ось 25- байтне рішення, частково викрадене з відповіді feersum (із зміною порядку аргументів):

lambda*p:'%s\n%%%dc'%p%94

12

Баш, 27

printf %s\\n%$[$1-1]s^ "$2"

Вихід

$ ./carrot.sh 2 "Lorem ipsum, dollar sit amet."
Lorem ipsum, dollar sit amet.
 ^$ 

Морква? Також, який долар в кінці?
Scimonster

7
Долар, здається, підкаже оболонку.
М.Герцкамп

3
@Scimonster Carrot була моєю спробою жарту - дивіться мою редакцію питання . І так, $кінець - це підказка оболонки. Питання вказує, що дозволені нові рядки дозволені, але не говорять, що вони необхідні.
Цифрова травма

10

Пітона, 29

lambda n,s:s+'\n'+' '*~-n+'^'

З’єднує рядок, нову рядок, n-1пробіли та a ^.


2
Якби rjustне так довго ...
Sp3000

10
Ах, оператор пуголовка.
користувач253751

10

sed, 16

2y/1/ /;2s/ $/^/

Це щось із тестів цього метавідповіді . Зокрема, я вимагаю, щоб число N було введено одинаково. Наприклад, для каретки в положенні 2, вхід для N буде 11. Також чітко не вказано, яким повинен бути порядок S і N , тому тут S йде першим, а за ним унарним N на новій лінії, через STDIN.

Вихід:

$ { echo "Lorem ipsum, dollar sit amet."; echo 11; } | sed '2y/1/ /;2s/ $/^/'
Lorem ipsum, dollar sit amet.
 ^
$

1
2y/1/ /;2s/ $/^/
манатура

@manatwork Добрий дзвінок!
Цифрова травма

9

JavaScript (ES6): 63 62 56 52 32 байт

Завдяки nderscore за значне зменшення розміру коду.

p=(a,b)=>b+`\n${' '.repeat(a)}^`

Версія, яка працює в інших браузерах (47 байт):

p=function(a,b){return b+`\n${' '.repeat(a)}^`}

1. У запитанні використовується індексація на основі 1, тому вам потрібно Array(a-1). 2. Анонімні функції дозволені за замовчуванням, тому вам не потрібно point=. 3. Для версії ES6 ви можете позбутися returnзаяви і дужок. Просто використовуйте (a,b)=>b+"\n"+Array(a-1).join(" ")+" ^".
Денніс

1
33 байти: (замінити \nфактичним p=(a,b)=>b+`\n${' '.repeat(a-1)}^`
новим

@dennis Індексація прекрасно працює для мене: i.stack.imgur.com/Tdejc.png
adroitwhiz

@Dennis Array(1).join(' ')призводить до порожнього рядка :)
nderscore

@nderscore Я не можу знайти власне новий рядок, коли він не спричинить розрив рядка в фрагменті коду, і індексація слідує наведеному прикладу: i.stack.imgur.com/Tdejc.png
adroitwhiz

7

CJam, 9 байт

q~N@(S*'^

Спробуйте в Інтернеті.

Як це працює

q~  e# Read the input from STDIN and interpret it.
    e# This pushes the integer and the string on the stack.
N@  e# Push a linefeed an rotate the integer on top of it.
(S* e# Subtract 1 and push a string consisting of that many spaces.
'^  e# Push a caret.

6

Пітона, 29

Ось більш цікавий спосіб зробити це за 29:

lambda*p:'%s\n%*s'%(p+('^',))

Приклад використання:

>>> f=lambda*p:'%s\n%*s'%(p+('^',))
>>> print f('lorem',5)
lorem
    ^

5

TI-BASIC, 10 (?) Байт

Disp Ans
Output(3,N,"^

Вхід подається у змінній N, як задається питанням, але ви не можете використовувати літеру var S як рядок. Замість цього, він приймає рядок введення від Ans, так , щоб запустити приклад в OP: 2->N:"Lorem ipsum, dollar sit amet.":prgm<program name>.

Я усвідомлюю, що це, мабуть, не враховується, оскільки кожен сегмент, відмежений двокрапкою, технічно є окремим твердженням; ось 46-байтна програма, яка приймає дані як N "S"( 2 "Lorem ipsum, dollar sit amet.")

Input Str1
2+inString(Str1," 
//^there's a space after the quote
Disp sub(Str1,Ans,length(Str1)-Ans
Output(4,expr(sub(Str1,1,1)),"^

Обидва вони припускають, що екран був очищений перед запуском.


Вам буде краще взяти дані з Input для номера та Ans для рядка.
lirtosiast

Перший також не працює, якщо назва програми, призначення та рядок поєднуються довше 16 символів.
lirtosiast

@ThomasKwa 26, власне, оскільки у мене є кольоровий калькулятор: P Це технічно працює, якщо ви вважаєте, що перезаписана частина вводу є "робочою".
MI MI Райт

Перший працює, якщо додати ClrHome: Input N, оскільки поточне голосування за мета для змішування методів вводу / виводу становить +7.
lirtosiast

5

DC, 19

?pr256r^255/32*62+P

Вхід від STDIN. dcрядки - це макроозначення та містяться в [ ]. Рядок пробілів генерується шляхом обчислення числа, яке при вираженні у базовому потоці 256 байтів дає потрібний нам рядок. Розрахунок є ((n ^ 256) / 255) * 32). Це дає nпрогалини (ASCII символ 32), але нам потрібно n-1потім ^, щоб ми просто додати 62 до останньої базової 256 цифр.

Вихід

$ dc -e '?pr256r^255/32*62+P' <<< "2 [Lorem ipsum, dollar sit amet.]"
Lorem ipsum, dollar sit amet.
 ^$

4

C, 59 57 47 байт

f(a,c){for(puts(a);--c;putchar(32));puts("^");}

Досить прямо. Безгольова версія:

f(char* a,int c){
    puts(a);        //Print the string first

    for(;--c;)      //Until number-1 is not 0
        putchar(32);//Print a space
    puts("^");      //Print a caret
}

Перевірте це тут
Завдяки @anatolyg для економії 10 байт!


Більш красиво переміщатися puts(a)і putchar(32)в дужки forпетлі - там рівно 2 порожніх місця! Крім того, я не думаю, що вам потрібно декларувати тип aі c- просто використовувати неявні intдля них - спрацюють, якщо ви цього не зробите #include <stdio.h>.
anatolyg

@anatolyg, спасибі! Я не думав, що опущення типів буде спрацьовувати, але, на мій подив, це вдалося.
Spikatrix

4

C # 55

Функція, концепція, аналогічна моїй відповіді С, але повернення цього разу коротше, ніж вихід.

string f(string a,int b){return a+'\n'+"^".PadLeft(b);}

4

SAS, 35 байт

%macro a(n,s);put &s/@&n."^";%mend;

Це еквівалент SAS голої функції; додати крок даних для його виклику (еквівалент основній функції C, щоб викликати його) було б трохи більше (ще 9 байт - Ty Alex), але я думаю, що це не потрібно для цієї мети. Як це називалося:

data;
%a(3,"My String");
run;

Існує реалізація лише для макросів, але вона набагато довша, навіть якщо ви дозволяєте їй надсилати попередження про недійсні параметри на n = 1.

Якби ми могли використати заздалегідь задані параметри, SAS був би досить коротким порівняно з цим, що є рідкістю для мови, яка, безумовно, не повинна бути короткою.


Якщо набір даних дозволено бути джерелом введення, саме таким чином ви б це зробили в SAS (або за допомогою% let тверджень), але, ймовірно, це не дозволено, це ще коротше ( 27 байт , що фактично може бути 25 якщо ви гарантували, що набір даних буде побудований безпосередньо перед запуском цього [як ви могли просто використовувати set;]):

(попередній набір даних)

data b;
  n=3;
  s="My String";
run;

(фактичний код)

data;set b;put s/@n"^";run;

Приємно бачити резидента спеціаліста SAS в області ППСГ. :)
Олексій А.

Я впевнений, що деякі з старих таймерів, які знають сценарії DM, можуть найкраще оцінити цю оцінку ... І мої навички cmdmac відстійні.
Джо

Я завжди забуваю, що DM навіть існує, і я навіть не знаю, що таке cmdmac! До речі, коли ви підраховуєте байти за весь крок даних, вам не потрібно data a;, ви можете просто зробити, data;що збереже 2 байти. Але, як ви сказали, все одно для цього не потрібно.
Олексій А.

Так, мої вроджені рефлекси SAS не дозволяють мені використовувати це інтуїтивно, напевно :). Дякую.
Джо

Говорячи про старі таймери, я думаю, ви могли б зберегти пару байт, відмовившись від інтуїції SAS та використовуючи макрос старого стилю. Я не можу пригадати, чи можуть вони приймати параметри.
Олексій А.

3

Матлаб / Октава, 41

@(n,s)sprintf('%s\n%s^',s,ones(1,n-1)+31)

Це анонімна функція, яка повертає рядок. Це створює попередження, яке можна придушити попереднім викликом warning off.


Ви маєте на увазі попередження редактора, чи воно насправді друкує попередження? Крім того, я побив вас на 16 символів ;-) Але мій друкує ans =шматочки, тож після виправлення це лише 10 різниць символів.
Oebele

@Oebele він друкує попередження, але повернута рядок не впливає.
FryAmTheEggman

3

К, 21 байт

{y,"\n",1_|"^",x#" "}

Приклад:

ryan@DevPC-LX:~/golf/caret$ rlwrap k
K Console - Enter \ for help

  `0:{y,"\n",1_|"^",x#" "}[2;"Lorem ipsum, dollar sit amet."]
Lorem ipsum, dollar sit amet.
 ^  

Пояснення ( xце число, yце рядок):

{                   }   enclosing function
               x#" "    repeat the space `x` times
           "^",         prepend the caret
          |             reverse the string to put the caret at the end
        1_              drop the extra space
   "\n",                prepend a newline
 y,                     prepend the text

3

R, 49 48 46

Як неназвана функція, яка виводить на STDOUT. Дякуємо @Flounderer за покращення.

тепер використовує strwrap для ідентифікації карети n-1. cat використовує сепаратор \ n, а не порожній рядок.

function(n,s)cat(s,strwrap('^',,n-1),sep='\n')

Тестовий запуск

> f=function(n,s)cat(s,strwrap('^',,n-1),sep='\n')
> f(29,'The caret should point here v hopefully')
The caret should point here v hopefully
                            ^
>

функція (n, x) cat (x, "\ n", rep ("", n-1), "^", sep = "") - це 48 символів
Flounderer

@Flounderer Спасибі за це ... моя оригінальна ідея була схожа на цю, але я не зробив це так чудово
MickyT

Якщо мені дозволено два початкові пробіли, це спрацьовує: function(n,x)cat(" ",x,"\n",rep("",n),"^")і зберігає декілька символів
Flounderer

@Flounderer я не підозрюю. strwrap також має деякі можливості, але це, ймовірно, закінчиться довше.
MickyT

1
Це мило! Я ніколи раніше не бачив strwrapфункції. Чи є простий спосіб сказати, що це робить? Я не можу це зрозуміти з документації.
Flounderer

3

Python3, 38 36 байт

def f(s,i):return s+'\n'+' '*~-i+'^'

# OR 

def f(s,i):print(s+'\n'+' '*~-i+'^')

Тестуйте його тут
Завдяки @Dennis за збереження 2 байтів!


(i-1)->~-i
Денніс

Я слабкий з бітовими операціями та математикою .... Спасибі все одно! :-D
Spikatrix

2

Юлія, 27 байт

(n,s)->s*"\n"*" "^(n-1)*"^"

Це створює неназвану функцію, яка приймає ціле число та рядок як вхідні дані та повертає рядок. Щоб зателефонувати, дайте ім’я, наприклад f=(n,s)->....

Все, що тут відбувається - це додавання нової n-1лінії , пробілів та каре. Зв'язування рядків виконується за допомогою *та повторення рядків за допомогою ^.

Безголівки:

function f(n, s)
    s * "\n" * " "^(n-1) * "^"
end

Приклад:

julia> println(f(2, "Lorem ipsum, dollar sit amet."))
Lorem ipsum, dollar sit amet.
 ^

2

PHP (CLI) - 42

<?=sprintf("%s\n%$argv[1]s",$argv[2],'^');

Викличте його з командного рядка:

php pointer.php 2 "Lorem ipsum, dollar sit amet."

Я лише зараз помітив. Але ваша відповідь точно така, як мій другий варіант. Я пропоную його вам: <?printf("$S\n%{$P}s",'^');. Замінити \nз реальним символом нового рядка. Всього 5 байт. Це працює лише на PBP4.1 і нижче.
Ісмаїл Мігель

Ух, стільки помилок у цьому коментарі ... Я мав на увазі, що це 26 байт і працює лише на PHP4.1. І це твоє!
Ісмаель Мігель

2

Матлаб, 25

Цей надзвичайно нахабний. Мабуть, відображає відбитки недрукувальних символів як пробіли. Наступний код визначає функцію з назвою ans, яка відповідає специфікаціям.

@(N,S)[S 10 ones(N-1) 94]

тому називаючи цю функцію так:

ans(2, 'Lorem ipsum, dollar sit amet.')

дає вихід:

ans =

Lorem ipsum, dollar sit amet.
 ^

Мені завжди не подобається ans =частина відповідей Matlab. Якщо це проблема, мені потрібно додати 6 байт ... але я завжди бачив це так у відповідях Matlab. Зауважте, що запуск цього коду перезаписує змінну ans, тому вам потрібно переглянути нову функцію, якщо ви хочете використовувати її вдруге!


Дуже хороша! Я не знав, що введення струни у вектор працює так. Моє розуміння полягало в тому, що оскільки це функція, рядок повертає їй значуще значення, а середовище відбиття MATLAB просто відбувається, щоб роздрукувати її. тобто якщо ви цього x=ans(2, 'asdf');не отримаєте, то ans = річ.
FryAmTheEggman

2

Мій перший вистріл у кодегольф

Ява, 133 65

String g(int i,String s){for(s+="\n";--i>0;)s+=" ";return s+"^";}

Я впевнений, що її можна зменшити ще більше.

Старий код

public void go(int i,String s){System.out.println(s);IntStream.range(1,i).forEach(j->System.out.print(" "));System.out.println("^");}

Можна System.outдесь зберігати ?
Ісмаїл Мігель

2
Не потрібно public. І перейти IntStream.range(1,i).forEach(j->System.out.print(" "));наfor(;--i>0;)System.out.print(" ");
Spikatrix

@CoolGuy ага! іноді просто - краще
pallavt

Чи можете ви перемістити s+="\n"всередину for()ініціалізації, щоб використовувати там крапку з комою?
lirtosiast

@ThomasKwa на 1 байт менше
pallavt

2

Швидка, 41

Розчаровує, що у Swift немає оператора *на Arrayабо String.

{$1+reduce(0..<$0,"\n",{$0.0+" "})+"^"}

Для Swift 2.0:{$1+(0..<$0).reduce("\n"){$0.0+" "}+"^"}
Kametrixom

1

SpecBAS - 34

1 INPUT n,s$: PRINT s$'TAB n-1;"^"

Апостроф PRINTзмушує новий рядок, тоді просто треба перемістити курсор у правильне положення.



1

JavaScript - 52 байти

Ось моя, це досить просто.

function f(n,s){return s+"\n"+Array(n).join(" ")+"^"}

Використання:

$ console.log(f(7, "Any string at all"))

Any string at all
      ^

Це вказує на сьомий символ.


Приємно зберегти Scimonster O_O
Флорі

1
Ви можете це написати так alert((P=prompt)()+"\n"+Array(P()+1).join(" ")+"^"). І ви економите 2 байти. Крім того, ви можете перетворити його в stasksnippet, щоб показати код, що працює. Це очікує, що рядок прийде першим, а потім позиція
Ісмаель Мігель

1

Perl 5, 31

sub{"$_[0]
"." "x($_[1]-1)."^"}

Можна зберегти 2-3 символи. Закиньте остаточний рядок, оскільки це не потрібно, а потім змініть перший новий рядок на буквальний новий. (Perl добре з багаторядковими рядками)
Містер Лама

@ Mr.Llama спасибі, це добре.
варення
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.