เครื่องขยายความจริง


17

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

นอกจากนี้หากnเป็นจำนวนลบสตริงจะต้องมีการกลับรายการ ตัวอย่างเช่นมีs=helloและเอาท์พุทจะเป็นn=-1olleh

วิธีการอินพุตมาตรฐานเอาต์พุตชนิดใดก็ได้ตราบใดที่สามารถจัดการกับอนันต์ได้ หากคุณมีคำตอบที่ไม่จัดการกับอนันต์คุณสามารถโพสต์ได้ถ้ามันน่าสนใจหรือในภาษาที่ไม่สามารถจัดการกับผลลัพธ์ที่ไม่มีที่สิ้นสุด

กรณีทดสอบ

n, s, output

5, "hello world", "hello worldhello worldhello worldhello worldhello world"
0, "PPCG", "PPCGPPCGPPCGPPCG..."
-2, "truThY", "YhTurtYhTurt"
2000, "o", "oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo"

นี่คือดังนั้นรหัสที่สั้นที่สุดชนะ!

นี่คือโพสต์ Sandbox ดั้งเดิม ทำการแก้ไขแล้ว ขอบคุณไปที่ @ComparSparklePony สำหรับการสร้างแนวคิดของการท้าทายนี้

คำตอบ:


3

Haskell, 57 54 ไบต์

f 0=cycle
f n|n<0=f(-n).reverse|n>0=concat.replicate n

คำอธิบาย:

f 0           -- If n=0 ..
 =cycle       -- infinitely repeat the input
f n|n<0       -- Otherwise, if n<0 ..
 =f(-n)       -- call f with the negative of n ..
 .reverse     -- and the reverse of the input
 |n>0         -- Finally, if n>0 ..
 concat       -- concatenate the result of ..
 .replicate n -- repeating the input n times

-3 ไบต์ขอบคุณ @nimi


คุณสามารถใช้แทน-n abs n
nimi


2

MATL , 37 ไบต์

jXJiXI0=?`1wtwDw]}I0>?I:"t]x}PI|:"t]x

ลองออนไลน์!

คำอธิบาย:

j            % input string
XJ           % copy to clipboard J
i            % input
XI           % copy to clipboard I
0            % number literal
=            % is equal? (element-wise, singleton expansion)
?            % if
  `          % do...while
    1        % number literal
    w        % swap elements in stack
    t        % duplicate elements
    w        % swap elements in stack
    D        % convert to string and display / string representation
    w        % swap elements in stack
  ]          % end
}            % else
  I          % paste from clipboard I
  0          % number literal
  >          % is greater than? (element-wise, singleton expansion)
  ?          % if
    I        % paste from clipboard I
    :        % range; vector of equally spaced values
    "        % for
      t      % duplicate elements
    ]        % end
    x        % delete
  }          % else
    P        % flip the order of elements
    I        % paste from clipboard I
    |        % absolute value / norm / determinant
    :        % range; vector of equally spaced values
    "        % for
      t      % duplicate elements
    ]        % end
    x        % delete
             % (implicit) end
             % (implicit) end
             % (implicit) convert to string and display

1

Python 3, 71 ไบต์

def f(n,s,k=1):
 if n<0:s=s[::-1];n=-n
 while n|k:print(end=s);n-=1;k=0

ลองออนไลน์!

ตัวแปรkรับประกันว่าลูปจะทำงานอย่างน้อยหนึ่งครั้งเสมอ ซึ่งหมายความว่าถ้าn=0ไปแล้วnจะเป็นเชิงลบเกี่ยวกับการย้ำต่อไปของวงดังนั้นห่วงจะยังคงที่จะทำงานตลอด


1

Matlab, 87 ไบต์

n=input('')
s=input('','s')
a=repmat(s,1,abs(n))
while~n s=[s s]
end
if n<0,flip(a)
end

ความพยายามครั้งแรกของฉันที่การตีกอล์ฟ! ข้อเสนอแนะใด ๆ สำหรับการเล่นกอล์ฟยินดีต้อนรับ


ยินดีต้อนรับสู่เว็บไซต์! :)
DJMcMayhem

1

05AB1E , 17 16 14 ไบต์

0‹iR}¹Ä×¹_i[²?

ลองออนไลน์!

คำอธิบาย:

0‹iR}¹Ä×¹_i[²?
0‹             Is the input negative?
  iR}          If so, reverse the second input.
     ¹Ä        Get the absolute value of the first input.
       ×       Repeat the string that many times.
        ¹_     Boolean NOT the first input. (Is the first input 0?)
          i    If so...
           [   Do forever...
            ²? Print the second input without a newline.

บันทึก 2 ไบต์ขอบคุณ @EriktheOutgolfer


คุณสามารถแทนที่'-åด้วย0‹และมี0Q _
Erik the Outgolfer

@EriktheOutgolfer ขอบคุณแก้ไขแล้ว
สหาย SparklePony

1

Cubix , 41 สี่สิบสี่ 45ไบต์

ใช้อินพุตเป็น <N> <String>

.uq.sB.p$IA;p?;ouu(..!q/o()uq?..@<w?q<<_)

ลองออนไลน์!

Cubified:

      . u q
      . s B
      . p $
I A ; p ? ; o u u ( . .
! q / o ( ) u q ? . . @
< w ? q < < _ ) . . . .
      . . .
      . . .
      . . .

ดูมันทำงานอยู่

ยังคงมีจำนวนของตัวเลือกในรหัสที่ฉันอาจจะสามารถได้รับอีกไม่กี่ไบต์ แต่ต้องการที่จะได้รับมันขึ้นมาก่อนที่ฉันจะทำลายมัน

ขั้นตอนพื้นฐานคือ

  • I รับตัวนับจากอินพุต
  • A ใช้เวลาที่เหลือป้อนเป็นตัวอักษร
  • ;p? ลบช่องว่างนำตัวเลขขึ้นมาและทดสอบ
    • psuqB$)หากตัวนับเป็นลบให้สลับสแต็กกลับ สิ่งนี้เกี่ยวข้องกับการจัดการหมายเลขอินพุตและเครื่องหมาย EOI (-1) เพิ่มเคาน์เตอร์
    • ;p;ouqu หากตัวนับเป็นศูนย์ให้ลบตัวนับและตัวทำเครื่องหมาย EOI และเริ่มต้นวนลูปเอาท์พุทถาวร
    • ( ถ้าบวกลดลงเคาน์เตอร์
  • <<q?/o()uห่วงเอาท์พุท สิ่งนี้จะส่งออกแต่ละอักขระของสแต็กจนกว่าจะถึง EOI marker (-1)
  • ... _ ... ?wq!ในตอนท้าย EOI marker ไปรอบ ๆ ลูกบาศก์และสะท้อนกลับไปที่?เปลี่ยนเลนวาง EOI marker ไปที่ด้านล่างและทดสอบตัวนับ
  • @ ถ้าศูนย์หยุด
  • ?u( ถ้าบวกกลับและลดลงเป็นบวกพวกเขาจะตีจุดเริ่มต้นของวง
  • ? ... <) ถ้าเป็นลบให้ไปรอบ ๆ ลูกบาศก์ไปยังที่อื่น ๆ เปลี่ยนเส้นทางไปยังจุดเริ่มต้นของการวนรอบในขณะที่ผ่านการเพิ่มขึ้น
  • /)< หากการเพิ่มขึ้นเชิงลบและดำเนินการเพื่อเอาท์พุทห่วง

สิ่งนี้ไม่ทำงานหากสตริงขึ้นต้นด้วยตัวเลขหรือไม่
เลมอนที่ถูกทำลาย

@DestructibleLemon แก้ไขแล้ว
MickyT

0

JavaScript (ES6), 79 ไบต์

 f=(n,s)=>n<0?f(-n,[...s].reverse().join``):(alert(!n?s:s.repeat(n)),!n&&f(n,s))

ตัวอย่างข้อมูล:

f=(n,s)=>n<0?f(-n,[...s].reverse().join``):(alert(!n?s:s.repeat(n)),!n&&f(n,s))

f(5, "hello world")
//f(0, "PPCG")  //uncomment this at your peril!!!
f(-2, "truThY")
f(2000, "o")


ฉันพยายามทำบางสิ่งซ้ำ ๆ แบบนี้ แต่ฉันไม่คิดว่าจะ!n&&วนซ้ำไปเรื่อย ๆ อย่างไรก็ตามสิ่งนี้จะกระทบกับ StackOverflow หรือไม่ it should never terminate.
Stephen

มันจะแจ้งเตือนสตริง PPCG ซ้ำ ๆ ใน Chrome (อย่างน้อย) ฉันต้องฆ่าเบราว์เซอร์เพื่อหยุด
Rick Hitchcock

ฉันเข้าใจประเด็นของคุณ ฉันคิดว่ารหัสของฉันจะใช้ประโยชน์จากการเพิ่มประสิทธิภาพการเรียกซ้ำแบบหางเรียกในเบราว์เซอร์ที่สนับสนุน
Rick Hitchcock

ทดสอบด้วย console.log ฉันได้รับข้อผิดพลาด
Stephen

อืมคุณพูดถูกแล้ว: (
Rick Hitchcock

0

JavaScript (ES6), 98 94 91 83 ไบต์

n=>s=>{s=n<0?[...s].reverse().join``:s;while(!n)l(s);l(s.repeat(n<0?-n:n))}

-4, -5 ไบต์ขอบคุณ Arjun

-3 ไบต์ขอบคุณ Rick Hitchcock

เริ่มแตกต่างจากคำตอบ Javaแต่อย่างรวดเร็วกลายเป็นคล้ายกันมากหลังจากเล่นกอล์ฟ การแจ้งเตือนเป็นอนันต์ console.logแต่ถ้าคุณอยากให้มันดูดีสลับไป l=alert;และการเขียนออกมาalertมีความยาวเท่ากัน แต่ถ้าคุณเปลี่ยนไปใช้console.logจะสั้นกว่าเพื่อกำหนดใหม่


1
while(!n)l(s)if(!n)for(;;)l(s)แทน
Arjun

2
[...s].reverse()แทนs.split''.reverse()
Rick Hitchcock

@ RickHitchcock ฉันมักจะลืมเรื่องนั้น :(
Stephen

l(s.repeat(Math.abs(n)))แทนการforวนซ้ำในที่สุด
Arjun

0

QBICขนาด 36 ไบต์

ging มากมายที่นี่และ QBIC / QBasic เพียงแค่ไม่มีไวยากรณ์ที่จะจัดการกับเงื่อนไขดังกล่าวอย่างสง่างาม

~:<0|;=_fA}[abs(a)|Z=Z+A]~a|_X}{?A';

คำอธิบาย:

~:<0|       IF cmd line arg 'a' is negative
  ;=_fA         Make cmd line arg A$ into its reverse
}           Close the IF (this eliminates the need for a | fuction terminator on _f)
[abs(a)|    FOR b = 1 to (abs(a) (hammering out negatives)
  Z=Z+A         Add A$ to Z$ (on exit, Z$ is printed explicitly)
]           NEXT
~a|_X       IF a is non-zero, terminate the program
}           END IF
{?A';       If we're here, just start a DO-loop and keep on printing the input.

0

Java (OpenJDK 8) , 137 ไบต์

void f(String[] a){for(long n=Long.valueOf(a[0]),i=0;n==0|i++<Math.abs(n);)System.out.print(n<0?new StringBuilder(a[1]).reverse():a[1]);}

ลองออนไลน์!


ลักษณะเช่นนี้ตัวอย่างมากกว่าโปรแกรมเต็มรูปแบบซึ่งไม่ได้รับอนุญาตโดยฉันทามติของชุมชน
แยกผลไม้

ตามที่โพสต์ที่เชื่อมโยง"เริ่มต้นควรจะ 'โปรแกรมหรือฟังก์ชั่น" ดังนั้นเนื่องจาก OP ไม่ได้ระบุอย่างชัดเจนว่าพวกเขาต้องการโปรแกรมเต็มฉันได้อัปเดตคำตอบของฉัน ตอนนี้มันประกอบไปด้วยวิธีการ
Beluga ขี้อาย

0

STR , 30 ไบต์

I#Lbd0<[_u_][d0='e'u#?]#?xo;db

ลองออนไลน์!

คำอธิบาย

I#Lbd0<[_u_][d0='e'u#?]#?xo;db
...........................;      preamble
I                                 read number
 #L                               read rest of STDIN
   b                              buffer the STDIN
    d                             duplicate number
     0<[   ]           #?         if the number is less than zero
        _                         negate that number
         u_                       and reverse STDIN from buffer
            [         ]           otherwise
             d0='e  #?            if its 0, push the empty string
                  'u              otherwise, push the unbuffered STDIN untouched
                         x        repeat STDIN by the TOS
                          o       and output
                           ;..    main program (only activates when input = 0)
                            d     duplicate the implicitly unbuffered STDIN
                             b    and rebuffer it
                                  implicitly displayed

0

C (gcc) , 115 112 109 107 104 ไบต์

f(n,s,l,p,d)char*s;{d=n<0?-1:1;do for(l=1,p=0;p>=0;p+=l)s[p]?d==l&&putchar(s[p]):l--;while(!n||(n-=d));}

ลองออนไลน์!

ใครบอกว่าเราต้องstrlen?

C (gcc) , 115 ไบต์ (134 ที่#include<string.h>ด้านหน้า)

#include<string.h>
f(n,s)char*s;{int l=strlen(s),d=n<0?0:2,m=d--,p;do for(p=m?0:l-1;p!=(m?l:-1);p+=d)putchar(s[p]);while(!n||(n-=d));}

ลองออนไลน์!

โดยไม่ต้อง#include<string.h>เราได้รับต้นแบบโดยปริยายสำหรับstrlenผลตอบแทนที่intแต่strlenเป็นsize_t(อย่างน้อยในปัจจุบันไม่ได้ดีเลิศแน่ใจเกี่ยวกับ K & R หรือ c89 แต่ผมเชื่อว่ามันจะกลับมาintในวันเก่า)

สิ่งที่ขาดหายไป#include <stdio.h>ไม่ใช่ปัญหาเพราะเนื่องจากการส่งเสริมการขายจำนวนเต็มต้นแบบเริ่มต้นจะint putchar(int)เป็นสิ่งที่เราต้องการ


0

เรติน่า 49 ไบต์

/¶-/&V`^.+
/¶0/&//+>G0`
~`(.+)¶-*(\d+)
.-$2+>K`$1

รูปแบบอินพุต: ใช้เวลาในสตริงตามด้วยขึ้นบรรทัดใหม่ตามด้วยหมายเลข

ลองออนไลน์!

คำอธิบาย:

/¶-/&V`^.+

/¶-/&วิ่งเส้นนี้เท่านั้นถ้าจำนวนเป็นลบ Vเป็นสเตจย้อนกลับและมันกลับด้าน^.+ซึ่งจับคู่สตริง ( .จับคู่อักขระทุกตัวนอกเหนือจากการขึ้นบรรทัดใหม่)

/¶0/&//+>G0`

/¶0/&วิ่งเส้นนี้เท่านั้นถ้าตัวเลขเป็น 0 //+>เริ่มต้นวง จำกัด ซึ่งพิมพ์สตริงทำงานหลังจากที่แต่ละซ้ำ G0รับสายและทิ้งหมายเลข; มันทำสิ่งนี้อย่างไม่สิ้นสุดการพิมพ์ทุกครั้ง

~`...

รหัสนี้ทำเครื่องหมายที่จะสร้างสตริง โปรแกรมประเมินสตริงเป็นโค้ด Retina หลังจาก

(.+)¶-*(\d+)
.-$2+>K`$1

(.+)¶-*(\d+)ตรงกับสตริงทั้งหมดและทำให้สตริงในการจับภาพกลุ่มที่ 1 และจำนวนในการจับภาพกลุ่ม 2. .-$2+>K` $1สร้างรหัส Retina จะทำงาน: . เปลี่ยนเอาท์พุทนัยปิด (มิฉะนั้นสตริงจะพิมพ์ 1 + n ครั้ง), -$2+ชุดห่วงซ้ำ ที่ทำซ้ำสำหรับ {การจับภาพกลุ่ม 2} ครั้ง เครื่องหมายลบที่จุดเริ่มต้นเปลี่ยนตัวเลขเป็นจำนวนลบเนื่องจากจะปิดใช้งานฟังก์ชันการลู่เข้าในวงวนซึ่งจะหยุดมันหลังจากการวนซ้ำครั้งที่ 1 >ตั้งค่าลูปนี้เพื่อพิมพ์หลังการวนซ้ำแต่ละครั้ง ส่วนที่เหลือของรหัสเป็นเพียงการพิมพ์สตริง


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