พอยน์เตอร์พอยน์เตอร์พอยน์เตอร์!


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 หรือพารามิเตอร์ฟังก์ชัน
  • เอาต์พุตถูกพิมพ์ไปยังคอนโซลหรือreturned
  • การขึ้นบรรทัดใหม่การเว้นวรรค ฯลฯ อนุญาตให้ใช้ในเอาต์พุต
  • อักขระตัวชี้ต้องเป็น^ คาเร็ตและต้องอยู่ในบรรทัดใหม่
  • นี่คือรหัสกอล์ฟดังนั้นคำตอบที่สั้นที่สุดชนะ โชคดี!

16
ฉันรู้สึกว่านี่เป็นปัญหาที่ง่ายมากดังนั้นฉันไม่แน่ใจว่ามันจะได้รับมากเกินไป คุณอาจต้องการลองsandboxเมื่อคุณมีตัวแทนเพียงพอ
FryAmTheEggman

6
ผมคิดว่านี่จะได้รับการทำบิตน่าสนใจมากขึ้นถ้าใส่ได้หลายบรรทัดเพื่อให้คุณได้มีการขึ้นบรรทัดใหม่แทรกช่องว่างและกะรัตในตำแหน่งที่ถูกต้อง (s) สุจริตข้อมูลจำเพาะไม่ได้บอกว่ามันจะเป็นบรรทัดเดียว แต่ฉันคิดว่าการบังคับใช้ในขณะนี้จะทำให้คำตอบไม่ถูกต้องอย่างไม่ยุติธรรมเนื่องจากไม่มีตัวอย่างที่แสดงสิ่งนี้
Geobits

3
อย่างที่ฉันพูดไปแล้วแมวอาจจะออกมาจากกระเป๋าของแมวตัวนี้ การเปลี่ยนแปลงกฎหลังจากคำตอบที่ถูกต้องมักโพสต์ไม่ได้ผล ใช้ชีวิตและเรียนรู้;)
Geobits

1
@ShaamChowdhury ฉันจะแกล้งทำเป็นเจตนา;) คุณต้องการให้ฉันแก้ไขหรือไม่?
monkeyonkeyboard

9
ในขณะนี้อาจจะง่ายมากคุณทำได้ดีสำหรับการท้าทายครั้งแรก! คุณมีการโหวต +16 / -0, 1,300 การดูและ 28 คำตอบ (จากการเขียนนี้) และคุณได้ทำรายการคำถามในเครือข่ายที่น่าสนใจ งานที่ดี!
Alex A.

คำตอบ:


36

ค 33

ถ้าฟังก์ชั่นได้รับอนุญาตแม้แต่คสามารถแข่งขันได้

(สำหรับบันทึก 2 ไบต์บันทึกขอบคุณไปที่ @Cool Guy ความคิดเห็นของ Mt thx นั้นหายไปโดยไม่คาดคิด)

char อีก 1 ตัวบันทึกไว้ขอบคุณ @Mig

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

19
C สามารถแข่งขันได้เสมอมันไม่สามารถชนะได้เสมอ ;)
Alex A.

3
@AlexA <shrug> ดูเหมือนว่าจะเป็นผู้ชนะสำหรับฉัน ;-)
Digital Trauma

3
ประหยัด 1 ถ่าน:f(a,c){printf("%s\n%*c",a,c,94);}
Michael M.

ถ้าฉันเป็นคนเหยียดหยามฉันจะบอกว่ามันยังคงอยู่ประมาณ 4 ครั้งตราบเท่าที่คำตอบสั้นที่สุดในภาษากอล์ฟ ซึ่งเกี่ยวกับธุรกิจตามปกติ ;) นี่เป็นสิ่งที่ฉลาด ฉันคิดว่าฉันเคยเห็น*ตัวเลือกในสตริงรูปแบบมาก่อน แต่ลืมไปแล้วอย่างสมบูรณ์ อาจมีประโยชน์สำหรับความท้าทายทางศิลปะบางอย่างในอนาคต
Reto Koradi

35

Brainf * ck - 133 ไบต์

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

คาดว่าจะมีการป้อนข้อมูล[0-9]{2}.*เช่น "02Hello world !!!" จะผลิต

สวัสดีชาวโลก!!!
 ^

ยินดีต้อนรับสู่การเขียนโปรแกรมปริศนาและรหัสกอล์ฟ! นี่เป็นโพสต์แรกที่ยอดเยี่ยมมากทำได้ดีมาก! : D
Alex A.

ปัญหาคือไม่มีใครรู้ว่านี้คือแม้รหัสที่ถูกต้องให้อยู่คนเดียวแก้ปัญหา :)
ไซมอน

ใช่ฉันคิดว่ามีข้อผิดพลาดแบบออฟไลน์โดยที่นี่ เครื่องหมายรูปหมวกควรอยู่ภายใต้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

@ Ruslan ขอบคุณ! แก้ไขแล้ว. นั่นคือส่วนที่เหลือจากรุ่นก่อนหน้า
Anatolyg

ทำไมอยู่ที่nakedนั่น? และทำไมมันเป็นสิ่งแรกที่ฉันเห็น
caird coinheringaahing

Microsoft เป็นผู้ตัดสินใจที่จะนำnakedหน้า: msdn.microsoft.com/en-us/library/h5w10wxs.aspx
Anatolyg

20

Pyth , 8

zp\^*tQd

การแก้ปัญหานี้ไม่ทำงานเนื่องจากกระทำหลังจากที่ฉันได้เชื่อมโยงกับชื่อภาษามีการเปลี่ยนแปลงpที่จะมี arity 1. มีวิธีการอื่น ๆ อีกหลายของการบรรลุคะแนนที่คล้ายกันใน Pyth zp+*dQ\^ที่ยังคงทำงานในวันนี้เช่น

หากสตริงต้องการอัญประกาศการเพิ่มvไปยังจุดเริ่มต้นของรหัสจะใช้งานได้ หากต้องคั่นด้วยเครื่องหมายจุลภาคจะมีขนาดสูงสุด 10 ไบต์:

eQp\^*dthQ

ฉันคิดว่านี่เป็นสิ่งที่สั้นที่สุด ทำได้ดี.
monkeyonkeyboard

อัลกอริทึมดูเหมือนจะผิดสำหรับฉันฉันคิดว่า^จะเป็นตัวละครตัวแรก และโดยวิธีการป้อนพารามิเตอร์จะได้รับในลำดับที่ไม่ถูกต้องกับล่ามออนไลน์ (ดังนั้นมันจึงล้มเหลวในการดำเนินการ)
Jim

1
@Jim คำตอบนี้ใช้เวอร์ชันเก่าของ pyth โดยที่parity 1 ทำให้บรรทัดแรกของเอาต์พุตถูกพิมพ์ก่อนจากนั้น caret บนบรรทัดถัดไปตามด้วยช่องว่าง ตอนนี้คุณสามารถทำz+*dQ\^คะแนนให้สั้นลง แต่มีบรรทัดใหม่ต่อท้ายหรือเพิ่มpก่อนหน้า+เพื่อลบออก ฉันไม่แน่ใจว่าจะทำอะไรที่นี่เนื่องจากผู้คนตอบคำถามรุ่นนี้มากเกินไปฉันคิดว่าฉันจะพยายามหาเวอร์ชันที่ใช้งานได้
FryAmTheEggman

16

T-SQL, 90

ในขณะที่คำถามที่ค่อนข้างง่ายมันน่าสนใจเสมอที่จะลองสิ่งเหล่านี้ในภาษาที่ไม่น่าจะสนับสนุนพวกเขาได้ดีหรือเล่นกอล์ฟได้ดีในเรื่องนั้น

คำตอบนี้รับประกันได้ว่าจะเป็นคำที่ยาวที่สุด

สิ่งนี้สร้างฟังก์ชันตารางแบบอินไลน์สำหรับ SQL Server ที่รับ @n และ @ เป็นพารามิเตอร์และส่งคืนผลลัพธ์เป็นคอลัมน์ ผลตอบแทนการขนส่งมีความสำคัญมิฉะนั้นฉันจะต้องใช้ถ่าน (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

Python, 27

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

ใช้การจัดรูปแบบสตริงสองระดับ

และนี่คือโซลูชัน25 ไบต์ที่ถูกขโมยไปบางส่วนจากคำตอบของ feersum (โดยมีคำสั่งโต้แย้งกลับรายการ):

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

12

Bash, 27

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

เอาท์พุต

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

แครอท? นอกจากนี้เงินดอลลาร์ในตอนท้ายคืออะไร?
Scimonster

7
ดอลล่าร์ดูเหมือนจะเป็นพรอมต์ของเชลล์
M.Herzkamp

3
@Scimonster แครอทเป็นความพยายามของฉันที่เรื่องตลก - ดูการแก้ไขคำถามของฉัน และใช่$จุดสิ้นสุดคือเชลล์พรอมต์ คำถามระบุว่าอนุญาตให้ขึ้นบรรทัดใหม่ต่อท้ายได้ แต่ไม่ได้บอกว่าจำเป็น
Digital Trauma

10

Python, 29

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

เชื่อมสตริงขึ้นบรรทัดใหม่, ช่องว่างและn-1^


2
ถ้าเพียงrjustไม่นาน ...
Sp3000

10
อาโอเปอเรเตอร์ของลูกอ๊อด
user253751

10

sed, 16

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

นี่คือตัวอย่างของคำตอบเมตานี้ โดยเฉพาะฉันต้องการให้หมายเลขNเป็นอินพุตในเอกภาพ เช่นสำหรับรูปหมวกในตำแหน่งที่ 2, การป้อนข้อมูลสำหรับN11จะเป็น นอกจากนี้ยังไม่ได้ระบุอย่างเคร่งครัดว่าคำสั่งSและNควรเป็นอย่างไรดังนั้นที่นี่Sไปก่อนแล้วตามด้วย unary Nในบรรทัดใหม่ทั้งหมดผ่าน STDIN

เอาท์พุท:

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

1
2y/1/ /;2s/ $/^/
จัดการ

@ manatwork โทรดีมาก!
Digital Trauma

9

JavaScript (ES6): 63 62 56 52 32 ไบต์

ขอบคุณที่ขีดล่างสำหรับการลดขนาดของรหัส

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(" ")+" ^"ใช้เพียงแค่
Dennis

1
33 ไบต์: (แทนที่\nด้วยขึ้นบรรทัดใหม่จริง)p=(a,b)=>b+`\n${' '.repeat(a-1)}^`
nderscore

@dennis การจัดทำดัชนีทำงานได้อย่างสมบูรณ์แบบสำหรับฉัน: i.stack.imgur.com/Tdejc.png
adroitwhiz

@Dennis Array(1).join(' ')ส่งผลให้เป็นสตริงว่าง :)
nderscore

@ ขีดฉันไม่สามารถหาวิธีใช้ newline จริงโดยไม่ทำให้เกิดการแบ่งบรรทัดในข้อมูลโค้ดและการทำดัชนีตามตัวอย่างที่กำหนด: 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

Python, 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)),"^

ทั้งสองสิ่งนี้สมมติว่าหน้าจอถูกล้างออกก่อนที่จะทำงาน


คุณน่าจะดีกว่าที่จะรับอินพุตจากอินพุตสำหรับหมายเลขและ Ans สำหรับสตริง
lirtosiast

อันแรกก็ใช้ไม่ได้ถ้าชื่อโปรแกรมการมอบหมายและการรวมสายอักขระยาวเกิน 16 ตัวอักษร
lirtosiast

@ThomasKwa 26 จริง ๆ แล้วเนื่องจากฉันมีเครื่องคิดเลขสี: P มันใช้งานได้จริงถ้าคุณนับการเขียนทับส่วนหนึ่งของอินพุตว่า 'ทำงาน'
MI Wright

อันแรกทำงานได้ถ้าคุณเพิ่ม ClrHome: อินพุต N เนื่องจากการลงคะแนนในเมตาปัจจุบันสำหรับการผสมวิธี I / O อยู่ที่ +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

ฟังก์ชั่น, แนวคิดคล้ายกับคำตอบ C ของฉัน, แต่เวลากลับมาสั้นกว่าเอาท์พุท

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

4

SAS, 35 ไบต์

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

นั่นคือเทียบเท่ากับ SAS ของฟังก์ชันเปล่า เพื่อเพิ่มขั้นตอนข้อมูลที่จะเรียกมัน (เทียบเท่ากับฟังก์ชั่นหลักของ C ที่จะเรียกมัน) จะเพิ่มขึ้นอีกนิดหน่อย (Ty เพิ่มเติมอีก 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 ของถิ่นที่อยู่ของ SO ที่นี่บน PPCG :)
อเล็กซ์ A.

ฉันค่อนข้างแน่ใจว่าตัวจับเวลาเก่าบางคนที่รู้ว่าการเขียนสคริปต์ DM สามารถทำคะแนนให้ดีที่สุดได้ ... และทักษะการ cmdmac ของฉันดูด
Joe

ฉันมักจะลืมว่า DM มีอยู่จริงและฉันก็ไม่รู้ด้วยซ้ำว่า cmdmac คืออะไร! Btw เมื่อคุณนับจำนวนไบต์สำหรับขั้นตอนข้อมูลทั้งหมดคุณไม่ต้องการdata a;คุณสามารถทำได้data;ซึ่งจะประหยัด 2 ไบต์ แต่อย่างที่คุณพูดมันไม่จำเป็นสำหรับจุดประสงค์นี้อยู่ดี
Alex A.

ใช่การตอบสนองแบบ SAS ที่ฝังแน่นของฉันจะไม่ปล่อยให้ฉันใช้สิ่งที่ฉันคาดเดาได้โดยสัญชาตญาณ :) ขอบคุณ
Joe

เมื่อพูดถึงตัวจับเวลาเก่าฉันคิดว่าคุณสามารถบันทึกสองสามไบต์ได้ด้วยการเอาชนะสัญชาตญาณ SAS ทั้งหมดและใช้มาโครแบบเก่า ฉันจำไม่ได้ว่าพวกเขาสามารถยอมรับพารามิเตอร์ได้หรือไม่
Alex A.

3

Matlab / Octave, 41

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

นี่คือฟังก์ชันที่ไม่ระบุชื่อที่ส่งคืนสตริง warning offนี้ผลิตคำเตือนซึ่งสามารถระงับโดยการเรียกก่อนหน้านี้


คุณหมายถึงคำเตือนจากบรรณาธิการหรือพิมพ์คำเตือนให้คุณจริงหรือ? นอกจากนี้ฉันเอาชนะคุณได้ 16 ตัว ;-) แต่ฉันพิมพ์ออกมาได้ans =เล็กน้อยดังนั้นหลังจากแก้ไขแล้วมันก็มีความแตกต่างเพียง 10 ตัวเท่านั้น
Oebele

@Oebele มันพิมพ์คำเตือน แต่สตริงกลับไม่ได้รับผลกระทบ
FryAmTheEggman

3

K, 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 ใช้ seperator ของ \ 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
                            ^
>

function (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ฟังก์ชั่นมาก่อน มีวิธีง่าย ๆ ในการบอกว่าทำอะไร? ฉันไม่สามารถเข้าใจได้จากเอกสารประกอบ
ดิ้นรน

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
Dennis

ฉันอ่อนแอกับการดำเนินงานบิตและคณิตศาสตร์ .... ขอบคุณต่อไป! :-D
Spikatrix

2

Julia, 27 ไบต์

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

สิ่งนี้จะสร้างฟังก์ชั่นที่ไม่มีชื่อที่รับจำนวนเต็มและสตริงเป็นอินพุตและส่งคืนสตริง f=(n,s)->...เรียกว่าให้มันชื่อเช่น

สิ่งที่เกิดขึ้นที่นี่คือเรากำลังผนวกบรรทัดใหม่n-1ช่องว่างและเครื่องหมายรูปหมวก สตริงจะดำเนินการใช้และสตริงซ้ำกับ*^

Ungolfed:

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ด้วยnewline จริง จำนวนทั้งหมดคือ 5 ไบต์ ใช้งานได้กับ PBP4.1 และด้านล่างเท่านั้น
Ismael Miguel

ว้าวข้อผิดพลาดมากมายในความคิดเห็นนั้น ... ฉันหมายถึงมันยาว 26 ไบต์และใช้งานได้กับ PHP4.1 เท่านั้น และมันก็เป็นของคุณ!
Ismael Miguel

2

Matlab, 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

นัดแรกของฉันที่ codegolf

Java, 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ที่ไหน
Ismael Miguel

2
publicไม่จำเป็นต้อง และเปลี่ยนIntStream.range(1,i).forEach(j->System.out.print(" "));เป็นfor(;--i>0;)System.out.print(" ");
Spikatrix

@CoolGuy aha! บางครั้งง่ายดีกว่า
pallavt

คุณสามารถย้ายส่วนเริ่มต้นs+="\n"ภายในfor()เพื่อใช้เครื่องหมายอัฒภาคได้หรือไม่
lirtosiast

@ThomasKwa น้อยกว่า 1 ไบต์
pallavt

2

รวดเร็ว 41

มันเป็นเรื่องที่น่าผิดหวังที่สวิฟท์ไม่ได้มีผู้ประกอบการ*เกี่ยวกับหรือArrayString

{$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;"^"

Apostrophe 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
      ^

มันชี้ไปที่ตัวละครที่เจ็ด


Nice บันทึก Scimonster O_O
Florrie

1
alert((P=prompt)()+"\n"+Array(P()+1).join(" ")+"^")คุณสามารถเขียนมันเหมือน และคุณประหยัดได้ 2 ไบต์ นอกจากนี้คุณสามารถทำให้เป็น stasksnippet เพื่อแสดงรหัสที่ใช้งานได้ นั่นคาดว่าสายจะมาก่อนจากนั้นตำแหน่ง
Ismael Miguel

1

Perl 5, 31

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

คุณสามารถบันทึก 2-3 ตัวอักษร วาง newline สุดท้ายตามที่ไม่จำเป็นจากนั้นเปลี่ยน newline แรกเป็น newline แท้จริง (Perl คือโอเคกับสตริงหลายคู่สาย)
นาย Llama

@ Mr.Llama ขอบคุณพวกเขาดี
hobbs
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.