ความเท่าเทียมกันของซีซาร์


24

สองสตริงคือ "Caesar สมม" ถ้าระยะทาง (นับขึ้น) ระหว่างตัวอักษรที่เกี่ยวข้องจะเหมือนกัน ใช่ฉันสร้างคำนี้ขึ้นมา นี่คือตัวอย่าง:

"Abc" และ "Cde" เทียบเท่ากันเพราะ

distance from a-c == 2
distance from b-d == 2
distance from c-e == 2

การใช้อักษรตัวพิมพ์ใหญ่ไม่ได้สร้างความแตกต่างใด ๆ

"Hello" และ "World" ไม่เทียบเท่า Caesar เพราะ

distance from h-w == 15
distance from e-o == 10
distance from l-r == 6
distance from l-l == 0
distance from o-d == 15

"Abcd" และ "Yzab" นั้นเทียบเท่ากับ Caesar เพราะ

distance from a-y = 24
distance from b-z = 24
distance from c-a = 24 (it wraps around)
distance from d-b = 24

คุณต้องเขียนโปรแกรมเต็มรูปแบบที่รับสองสายจาก STDIN และพิมพ์ค่าความจริงหากพวกเขาเทียบเท่ากับ Caesar และค่าเท็จถ้าพวกเขาไม่ได้

อินพุตที่ถูกต้อง

  • เนื่องจากการใช้อักษรตัวพิมพ์ใหญ่ไม่สำคัญจะเป็นที่ยอมรับได้หากโปรแกรมของคุณต้องการอินพุตเป็นตัวพิมพ์เล็กตัวพิมพ์ใหญ่หรือตัวพิมพ์ใดก็ได้ตามที่คุณต้องการตราบใดที่คำตอบของคุณระบุไว้

  • อินพุตจะไม่มีช่องว่างหรือเครื่องหมายวรรคตอน

  • อินพุตจะมีความยาวเท่ากัน


8
คงจะดีถ้าอนุญาตให้อินพุตเป็นอาร์กิวเมนต์บรรทัดคำสั่ง ฉันกำลังจะเขียนวิธีแก้ปัญหา C แต่การอ่านจาก stdin ต้องใช้รหัสที่ค่อนข้างยาวโดยเฉพาะถ้าคุณไม่มีความยาวสูงสุดล่วงหน้า
Reto Koradi

@RetoKoradi ทำไมล่ะ มันอาจจะไม่ชนะเพราะ C ไม่เป็นที่รู้จักอย่างแน่นอน
DJMcMayhem

ใช่ฉันสงสัยว่า C จะมีโอกาสชนะแน่นอน ที่ดีที่สุดฉันเปรียบเทียบกับโซลูชั่นที่ใช้ "จริง";) ภาษาการเขียนโปรแกรม แต่ถึงอย่างนั้นภาษาอื่นก็มักจะมีขนาดเล็กลงโดยเฉพาะอย่างยิ่งถ้ามันเกี่ยวข้องกับการประมวลผลสตริง
Reto Koradi

4
ทุกครั้งที่ฉันเห็นสิ่งนี้ในรายการคำถามมันมี upvotes ได้มากเท่าคำตอบ
Alex A.

1
@AlexA ฉันไม่ได้ให้ความสนใจกับการโหวตขึ้นเพื่อตอบอัตราส่วนจนกว่าคุณจะชี้ให้เห็น ตอนนี้มันเป็นสิ่งที่ฉันสังเกตเห็น
DJMcMayhem

คำตอบ:


10

Pyth, 9 ไบต์

}wm=.rzGG

ทั้งสองสายคาดว่าจะเป็นตัวพิมพ์เล็กคั่นขึ้นบรรทัดใหม่

สาธิต.

มันทำงานอย่างไร:

.rเป็นฟังก์ชั่นการแปลแบบหมุนของ Pyth มันแม็พแต่ละองค์ประกอบในอาร์กิวเมนต์แรกจากการเกิดครั้งแรกในอาร์กิวเมนต์ที่สองไปยังรายการถัดไปในอาร์กิวเมนต์ที่สอง ในกรณีนี้อาร์กิวเมนต์ที่สองคือGตัวอักษรตัวเล็กดังนั้นนี่จึงเท่ากับ Caesar shift ของ 1

วาง=ด้านหน้าของฟังก์ชั่นทำให้มันอยู่ในสถานที่ ดังนั้นจึง=.rzGได้มอบหมายให้การเปลี่ยนแปลงของซีซาร์โดยหนึ่งในการz zโปรดทราบว่าzจะเริ่มต้นได้ที่บรรทัดแรกของการป้อนข้อมูลใน Pyth

นิพจน์นี้ใช้ภายในแผนที่ m=.rzGGใช้การแปลงนี้ถึงz26 ครั้งหนึ่งครั้งสำหรับแต่ละองค์ประกอบGและบันทึกผลลัพธ์ในรายการ zนี้จะช่วยให้รายชื่อของกะซีซาร์เป็นไปได้ทั้งหมดของ

สุดท้าย}wตรวจสอบว่าบรรทัดอินพุตถัดไปอยู่ในรายการนั้นหรือไม่


14

CJam, 17 12 11 bytes

1 ไบต์บันทึกโดย Dennis

ll.m26f%)-!

ทดสอบที่นี่

ต้องการสตริงตัวแรกเป็นตัวเล็กและตัวที่สองเป็นตัวใหญ่ พิมพ์1สำหรับสตริงที่เทียบเท่ากับ Caesar และ0อื่น ๆ

คำอธิบาย

ll           e# Read two lines of input.
  .m         e# Take the differences of corresponding characters.
    26f%     e# Take the differences modulo 26.
        )-   e# Remove all copies of the last difference from the array. This will 
             e# yield an empty array if and only if all differences are the same.
          !  e# Logical NOT, which yields 1 for an empty array and 0 otherwise.

เหตุผลที่เราต้องการสตริงตัวแรกเป็นตัวเล็กและตัวที่สองเป็นตัวใหญ่คือเพื่อให้แน่ใจว่าความแตกต่างนั้นเป็นค่าบวกเสมอ มิฉะนั้นการรับโมดูโล่อาจส่งคืนสิ่งที่เป็นลบและไม่จำเป็นต้องเป็นเอกลักษณ์แม้แต่สำหรับสตริงที่เทียบเท่ากับซีซาร์


1
หากคุณต้องการให้คำแรกเป็นตัวพิมพ์เล็กและคำที่สองเป็นตัวพิมพ์ใหญ่คุณสามารถใช้26f%เพื่อบันทึกหนึ่งไบต์
เดนนิส

คุณสามารถใช้การประชุมเชลล์ ( stackoverflow.com/questions/2933843/… ) เพื่อนำมาไว้ใกล้กับคำตอบของ Pyth
VicAche

1
@VicAche การประชุมที่ยอมรับคือการตีความความจริงและความเท็จไม่ว่าภาษาของคุณจะตีความอย่างไร นอกจากนี้หากฉันลบ!ฉันจะไม่มี 0 หรือ 1 แต่เป็นอาร์เรย์ว่างหรือไม่ว่าง
Martin Ender

9

Python2, 68 67 70 69 Bytes

print len({(ord(y)-ord(x))%26for x,y in zip(*raw_input().split())})<2

Python3, 67 66 ไบต์

print(len({(ord(y)-ord(x))%26for x,y in zip(*input().split())})<2)

มันค่อนข้างยากที่จะ ungolf ดังนั้นเพียงอธิบายชิ้นส่วน:

  • zip(*raw_input().split())นำข้อมูลเข้าแยกออกเป็นรายการของคำสองคำโดยสมมติว่าคำนั้นคั่นด้วยช่องว่าง หลังจากนั้นแต่ละคำจะถูกส่งผ่านเป็นพารามิเตอร์ของzipฟังก์ชันโดยใช้*โอเปอเรเตอร์ zipฟังก์ชั่นจะสร้างรายการของตัวอักษรคู่สำหรับตัวอักษรในตำแหน่งเดียวกัน
  • (ord(y)-ord(x))%26for x,y in ... นี่แค่แปลงรายชื่อตัวอักษร 2 ตัวเป็นนิพจน์ตัวสร้างของระยะทางระหว่างตัวอักษรเหล่านั้น
  • {...} ลดนิพจน์นี้เป็นชุดโดยทิ้งการทำซ้ำ
  • len(...)<2 ตรวจสอบว่ามีเพียงหนึ่งรายการที่เหลืออยู่ในชุด (หรือ 0 สำหรับสตริงว่าง) ซึ่งเป็นหลักหมายถึงตัวอักษรทั้งหมดมีระยะทางเดียวกัน
  • print ส่งออกค่าที่

ขอบคุณ xnor ที่เตือนฉันset(...)สามารถเปลี่ยนได้{...}และforไม่จำเป็นต้องใช้ช่องว่างก่อน นอกจากนี้ยังต้องขอบคุณ Josay สำหรับ<=1การ<2เพิ่มประสิทธิภาพ


ค่อนข้างคล้ายกับโซลูชันของฉันโพสต์คร่าว ๆ ในนาทีเดียวกัน คุณฉลาดกว่าฉันที่จะป้อนข้อมูล แต่คุณสามารถลด<=1เป็น '<2'
SylvainD

1
คุณสามารถทำความเข้าใจชุดโดยตรงมากกว่า{...} set((...))รหัสของคุณต้องพิมพ์ผลลัพธ์จริง
xnor

@KillianDS กฎเริ่มต้นจำเป็นต้องพิมพ์ไปที่ STDOUT หรือส่งคืน (ไม่ใช่การประเมิน REPL) และนี่คือการพิมพ์ที่ระบุ OP มิฉะนั้นทางที่สั้นที่สุดทั่วไปคือการใช้lambdaการบันทึกเกี่ยวกับการเขียนหรือprint return
xnor

1
โดยวิธีการที่คุณทำไม่ได้เว้นวรรคก่อนfor; lexer 26forหลามอย่างถูกต้องแยก
xnor

5

APL (15)

1=≢∪26|-⌿⎕A⍳↑⍞⍞

มันต้องการตัวอักษรเป็นตัวพิมพ์ใหญ่และพิมพ์อย่างใดอย่างหนึ่ง1หรือ0เช่น:

      1=≢∪26|-⌿⎕A⍳↑⍞⍞
ABCD
YZAB
1

      1=≢∪26|-⌿⎕A⍳↑⍞⍞
HELLO
WORLD
0

คำอธิบาย:

  • ↑⍞⍞: อ่านสองบรรทัดจากแป้นพิมพ์และจัดเรียงอักขระในเมทริกซ์ N × 2
  • ⎕A⍳สำหรับตัวละครแต่ละตัวหาตำแหน่งที่มันเกิดขึ้นใน⎕A(ตัวอักษรตัวพิมพ์ใหญ่)
  • -⌿: สำหรับแต่ละคอลัมน์ลบค่าที่สองจากค่าแรก
  • 26|: ใช้ mod-26 ของแต่ละหมายเลขเหล่านั้น
  • หากสตริงเท่ากับ Caesar ตัวเลขทั้งหมดในรายการนี้จะเท่ากันดังนั้น:
  • ≢∪: ค้นหาจำนวนค่าที่ไม่ซ้ำกันในรายการ
  • 1=: 1เปรียบเทียบกับ

ฉันจะไม่
ถอนการ

@AlexA: ฉันใช้ Dyalog APL 14. ถ้าคุณมี Raspberry Pi ก็ฟรี สำหรับนักเรียนฟรีเช่นกัน มิฉะนั้นคุณสามารถดาวน์โหลดเวอร์ชันที่ไม่ได้ลงทะเบียนซึ่งเป็น nagware แต่สามารถใช้งานได้เหมือนกับของจริง dyalog.com TryAPL ขึ้นอยู่กับสิ่งนี้โดยวิธีการ
marinus

ฉันสนใจที่จะรับฟังความคิดเห็นของคุณเกี่ยวกับ Dyalog เทียบกับ GNU APL, ngn / apl และ APLX ถึงแม้ว่าความคิดเห็นจะไม่ใช่สถานที่สำหรับการสนทนาเช่นนี้ ;)
Alex A.

3

J, 19 ไบต์

1=[:#@~.26|-&(3&u:)

ตัวอักษรที่อยู่ในตำแหน่งเดียวกันควรมีตัวพิมพ์ใหญ่เหมือนกัน

หลังจากแปลงทั้งสตริงอินพุตเป็นตัวแทน codepoint ของพวกเขากับ&(3&u:)เราเปรียบเทียบ1กับความยาว#ของ nub ~.ของ modulo 26 26|ของความแตกต่าง-ของสองอาร์เรย์ เม็ดจะเป็น1ถ้าระยะทางซีซาร์ทั้งหมดเหมือนกัน

การใช้งาน:

   'abcd' (1=[:#@~.26|-&(3&u:)) 'yzab'
1

ลองออนไลน์ได้ที่นี่


3

Julia, 91 87 83 ไบต์

a=readline()
b=readline()
show(length(Set([mod(a[i]-b[i],26)for i=1:length(a)]))<2)

คำอธิบาย Ungolfed +:

# Read two strings from STDIN
a = readline()
b = readline()

# Get the absolute difference mod 26 of the character values in the strings
x = [mod(a[i] - b[i], 26) for i = 1:length(a)]

# Construct a set consisting of the elements of x. If the set has only a
# single element, the strings are Caesar equivalent. This will print a
# boolean value to STDOUT.
show(length(Set(x)) < 2)

สิ่งนี้ใช้ประโยชน์จากข้อเท็จจริงที่ว่าสตริงใน Julia นั้นสามารถใช้เป็นอาร์เรย์อักขระได้และการดำเนินการทางคณิตศาสตร์นั้นสามารถทำได้กับค่าของอักขระ สตริงอินพุตสามารถมีการรวมตัวพิมพ์ใหญ่ใด ๆ ที่คุณต้องการตราบใดที่การใช้อักษรตัวพิมพ์ใหญ่ในแต่ละตำแหน่งตรงกันระหว่างสตริง


3

C99, 92 ไบต์พร้อมบั๊ก   101 92 ไบต์

  r,i;main(z,a)char**a;{for(;z=a[2][++i];)r|=(a[1][i]-z+*a[2]-*a[1]+52)%26;putchar(49-!!r);}

ตรงไปตรงมาสวย; สมมติว่าคำมาเป็นอาร์กิวเมนต์ตัวแรกและตัวที่สองตามลำดับ -std=c99รวบรวมกับ


สิ่งนี้ให้ผลลัพธ์ที่ผิดสำหรับอินพุตตัวอย่างที่สอง
Reto Koradi

คุณพูดถูกฉันคิดถึงมัน คงที่
rr-


2

CJam, 13 ไบต์

{r(fm26f%}2*=

มันต้องมีอักขระตัวแรกในแต่ละคำที่จะเป็นตัวพิมพ์ใหญ่ในขณะที่คนอื่น ๆ ในกรณีที่ต่ำกว่า

ลองมันนี่ ( Firefox ที่นี่ )

น่าเสียดายที่ตัวแปร APL ไม่รองรับตัวละครแบบคณิตศาสตร์ ...

คำอธิบาย

{
    r       e# Read a word.
    (f-     e# Return each character value minus the first character.
    26f%    e# Mod 26.
}2*         e# Repeat 2 times.
=           e# Check if they are equal.

2

Perl, 80

แก้ไข : การเพิ่มประสิทธิภาพที่ล้มเหลวได้ลื่นลงในรหัส golfed ตอนนี้มันตรงกับเวอร์ชั่นที่ไม่ดี (นับจำนวนไบต์ถูกต้อง)

@a=unpack"W*",<>;for(<>=~/./g){$n=ord()-shift@a;$p=!$c++||$p&&$n==$o;$o=$n}say$p

ทำงานกับ Perl รุ่น 5.10 ( perl -M5.10.0หรือperl -E …) say()สำหรับ เวอร์ชันที่ขยายเพิ่มขึ้นเล็กน้อย:

@a=unpack"W*",<>;             # read first string, split and convert to numbers

for(<>=~/./g){                # reads the second string and splits it
   $n=ord()-shift@a;          # convert next character of second string and compare
   $p= !$c++ || $p && $n==$o; # compare differences (special case for first char)
   $o=$n
}

say $p

โค้ดที่ส่งออก1(ความจริงใน Perl) หากสตริงนั้นเทียบเท่ากับ Caesar และสตริงว่าง (falsy ใน Perl) หากพวกเขาไม่ใช่ ถ้าเป็นแบบนี้เกินไปหลวมการตีความที่ฉันจำเป็นต้องเพิ่ม 2 ไบต์say$p+0ซึ่งพิมพ์หรือ10

กรณีตัวละครจะต้องตรงกับระหว่างอินพุต


จากความคิดเห็นของคำถามข้างต้นคุณสามารถรับอาร์กิวเมนต์เป็นบรรทัดคำสั่งได้เช่นกัน คุณสามารถใช้เพื่อใช้ในสายที่สองซึ่งจะเก็บไว้ในตัวแปร-i $^Iนอกจากนี้การใช้-Eแทน-eเมื่อทำงานบนบรรทัดคำสั่งคุณจะได้รับsayฟรีเพื่อให้คุณสามารถใช้งานได้โดยไม่ต้องเพิ่มไบต์ใด ๆ ลองใช้วิธีนี้: perl -iteststring -E'say$^I'คุณอาจย่อให้สั้นลงด้วย-iเล่ห์เหลี่ยม
hmatt1

ขอบคุณ @ chilemagic -iเคล็ดลับนั้นเรียบร้อย (และฉันก็ไม่รู้เหมือนกัน!) ในกรณีนี้ผมไม่คิดว่ามันจะช่วยให้เพราะมีความยาวมากกว่า$^I <>
xebtl

@ chilemagic โอ้และตามการสนทนานี้ฉันไม่ได้นับไบต์สำหรับ-M5.10.0ต่อไป (แต่ฉันพูดถึง-Eสวิตช์ในการแก้ไข)
xebtl

2

Matlab, 49 48 ไบต์

นี่เป็นสิ่งที่รวดเร็วจริงๆ น่าเศร้าที่รับสายจาก stdin นั้นค่อนข้างแพง

x=@()input('','s');sum(diff(mod(x()-x(),26)))==0

โปรดทราบว่ามันเป็นเช่นเดียวกับส่วนใหญ่ถ้าไม่ใช่คำตอบทั้งหมดเป็นกรณี ๆ ไป

แก้ไข: โกนออกหนึ่งไบต์โดยการกำหนดฟังก์ชั่นที่ไม่ระบุชื่อ!



2

C, 97 ไบต์

#define D (*a[2]++-*a[1]+++26)%26
d,r;main(int c,char**a){for(d=D;*a[1];r|=d-D);puts(r?"N":"Y");}

1
เย้! คุณได้คืนค่าสมดุล!
DJMcMayhem

คุณสามารถบันทึกได้ 4 ตัวอักษรหากนำมาใช้ซ้ำ dและประกาศaพารามิเตอร์ภายนอกเช่นนี้: d,r;main(int c,char**a){r;main(d,a)char**a;{
rr-

1

สกาลา, 57 ไบต์

(readLine zip readLine map(x=>x._1-x._2%26)toSet).size==1

มีความยาวน้อยกว่าคนอื่น ๆ และเทียบเท่า แต่เป็นภาษาที่แตกต่างกันไป!

ฉันยังมีรุ่นนี้ (56 ไบต์):

(readLine zip readLine map(_._1-x$1._2%26)toSet).size==1

แต่ฉันไม่รู้ว่า x $ 1 ทำงานเป็นเรื่องบังเอิญหรือโดยการออกแบบ ...


1
มันแปลกจริง ๆ แล้วมันx$1ทำงานอย่างไรโดยไม่xถูกกำหนดเลย?
Dan Getz

@DanGetz ฉันค่อนข้างแน่ใจว่ามันเป็นคอมไพเลอร์ฟลุค ฉันอาจถามคำถามเกี่ยวกับสแต็คล้นเกี่ยวกับมัน: D
อื่น ๆ

1

Python 2, 80 ไบต์

รับ 2 สตริงที่คล้ายกันจาก stdin คั่นด้วยช่องว่าง:

s,t=raw_input().split();print len(set((ord(c)-ord(d))%26 for c,d in zip(s,t)))<2

ทดสอบในกรณีทดสอบต่อไปนี้:

tests = [
    ("abc", "abc", True),
    ("abcd", "abc", False),
    ("abc", "cde", True),
    ("Abc", "Cde", True),
    ("abc", "deg", False),
    ("Hello", "World", False),
    ("Abcd", "Yzab", True),
    ("", "", True)
]

for s, t, v in tests:
    if len(s) == len(t): # I didn't read that at first
        assert v == (len(set((ord(c) - ord(d)) % 26 for c, d in zip(s, t))) < 2)

1

Python 2 - 241 237 188 147 ไบต์

รับอินพุตเป็นสตริงตัวพิมพ์เล็กที่อยู่ในเครื่องหมายคำพูดคั่นด้วยช่องว่าง จะต้องมีวิธีที่ดีกว่า ..

s=[[ord(x)for x in y]for y in input().split()];v=[];v=[v+[(s[1][i]-s[0][i])%26]for i in xrange(0,len(s[0]))];v=sum(v,[]);print sum(v)//v[0]==len(v)

Ungolfed (260 ไบต์แปลก)

strs = [[ord(x) for x in y] for y in raw_input().split()]
vals = []
for i in xrange(0, len(strs[0])):
if strs[0][i]<strs[1][i]:
    vals += [strs[1][i]-strs[0][i]]
else:
    vals += [26-(strs[0][i]-strs[1][i])]
return sum(vals)//vals[0] == len(vals)

ฉันแน่ใจว่าคุณสามารถทำให้ตัวแปรทั้งหมดยาว 1 อักขระและบันทึกเป็นไบต์ คุณต้องเพิ่ม 4 คะแนนของคุณตามที่คุณคาดหวัง 4 "วินาทีพิเศษในการป้อนข้อมูลของคุณ

@Reatity ฉันไม่อยากจะเชื่อเลยว่าไม่ได้ทำให้ตัวแปรสั้นลง ฉันเพิ่ม 2 จำนวนไบต์เนื่องจากฉันอธิบายไม่ถูกต้อง อินพุตทำงานเช่น "abc cde"
Kade

1

R, 83 84

ค่อนข้างมากเหมือนกับโซลูชันอื่น ๆ แปลงสตริงเป็นเวกเตอร์ของจำนวนเต็ม ปรับเปลี่ยนความแตกต่างของเวกเตอร์ด้วย 26 ทำสิ่งที่ไม่ซ้ำกันเหนือรายการเนื่องจากตรวจสอบความยาวคือ 1 โดยคาดว่าตัวพิมพ์จะเหมือนกันในอักขระที่สอดคล้องกันในแต่ละสตริง

length(unique(((S=strtoi)((R=charToRaw)((I=readline)()),16L)-S(R(I()),16L))%%26))<2

มันจะรอให้มีการป้อนสตริงสองรายการ

> length(unique(((S=strtoi)((R=charToRaw)((I=readline)()),16L)-S(R(I()),16L))%%26))<2
abcdefghijklmnopqrstuvwxyz
opqrstuvwxyzabcdefghijklmn
[1] TRUE
> length(unique(((S=strtoi)((R=charToRaw)((I=readline)()),16L)-S(R(I()),16L))%%26))<2
Hello
World
[1] FALSE
> length(unique(((S=strtoi)((R=charToRaw)((I=readline)()),16L)-S(R(I()),16L))%%26))<2
Bob
Nan
[1] TRUE
>

คุณสามารถประหยัดไบต์โดยใช้มากกว่า<2 ==1
Alex A.

คุณสามารถบันทึก 3 ไบต์โดยเพียงแค่แสดงผล1หรือ0

@AlexA ขอบคุณอเล็กซ์ฉันคิดถึงอันนั้น ... และตอนนี้ฉันก็พลาดไป :)
มิกกี้

@Reatity: อย่างไร
Alex A.

@Reatity น่าเสียดายที่มันจะคืนค่า 1 หรือมากกว่านั้น
MickyT

1

Matlab / Octave, 53 52

x=@()input('','s');isscalar(unique(mod(x()-x(),26)))

อินพุตทั้งหมดควรเป็นกรณีเดียวกัน

น่าเศร้าที่ Matlab ไม่ค่อยดีกับการป้อนข้อมูลของผู้ใช้ ในฐานะที่เป็นหมายเลขอ้างอิงที่ไม่ระบุชื่อนี่อาจเป็นเพียง 35 ไบต์:

@(a,b)isscalar(unique(mod(a-b,26)))

Matlab ถือว่าตัวละครของสตริงเป็นเวกเตอร์ของตัวเลข การลบทำให้เราแตกต่างและuniqueแปลงเวกเตอร์นั้นเป็นเวกเตอร์ที่มีค่าไม่ซ้ำกันเท่านั้น หากมีเพียงหนึ่งหมายเลขคำนั้นจะเทียบเท่ากับ caeser และ isscalar ส่งคืน 1 มิฉะนั้นจะส่งคืน 0


Oh! อีกรายการ Matlab! ดูคำตอบหลังจากตอบตัวเองเท่านั้น
Oebele

เพิ่งค้นพบว่าคุณสามารถบันทึกหนึ่งไบต์โดยการกำหนด x = @ () อินพุต ('', 's');
Oebele

@Oebele ขอบคุณ! ฉันคิดว่าฉันจะเริ่มลองแก้ไขปัญหากอล์ฟใน Matlab มากขึ้นฉันพบว่ามันค่อนข้างสนุก
FryAmTheEggman

ใช่มันเป็น สำหรับปัญหามากมายมันสามารถรัดกุมมากกับสิ่งที่ใช้เมทริกซ์ อ็อกเทฟมีซินแท็กซ์ฟรีอีกเล็กน้อยซึ่งบางครั้งก็สามารถบันทึกได้อีกไม่กี่ไบต์เช่นการกำหนดตัวแปรอินไลน์
Oebele

1

ทุบตี, 71 48

การใช้“มาตรฐาน” caesar(6)โปรแกรมระบบปฏิบัติการยูนิกซ์

รุ่นใหม่ (พร้อมความช่วยเหลือมากมายจาก @DigitalTrauma):

read a b;seq -f"caesar %g <<<$a" 26|bash|grep $b
  • อินพุตต้องอยู่ในบรรทัดเดียวกันคั่นด้วยช่องว่าง
  • กรณีตัวละครจะต้องตรงกับระหว่างอินพุต
  • พิมพ์1ค่าจริงหรือไม่จริง

หากอนุญาตให้ป้อนผ่านอาร์กิวเมนต์บรรทัดคำสั่งจะสามารถย่อให้เหลือ39 ไบต์ :

 seq -f"caesar %g <<<$1" 26|bash|grep $2

รุ่นเก่าสำหรับบันทึก:

 read a b;for i in `seq 26`;do [ `echo $a|caesar $i` = $b ]&&echo 1;done

48 ไบต์ตามจำนวนของฉัน: read a b;seq -f"caesar %g <<<$a" 26|bash|grep $bผลลัพธ์อยู่ใน$?ตัวแปรบิวอินโดยที่ 0 == FALSE และ 1 == TRUE ตามความหมายของเชลล์มาตรฐาน
Digital Trauma

@DigitalTrauma เหล่านี้เป็นความคิดที่ดี! ฉันชอบโดยเฉพาะอย่างยิ่งseq -f | bashบิตผลลัพธ์$?ไม่ถูกต้องโดยการอ่านความท้าทายของฉัน แต่เช่นเดียวกับรหัสของฉันผลลัพธ์ของคุณไม่มีอะไรที่เป็นเท็จและบางอย่างเป็นจริง (ยกเว้นในกรณีเส้นเขตแดนของสองสตริงอินพุตว่าง) อย่างไรก็ตามมันรู้สึกเหมือนการโกงที่จะใช้ทั้งหมดนี้ในคำตอบของฉันบางทีคุณควรส่งของคุณเอง
xebtl

ไม่ต้องกังวล - ฉันขอเสนอเคล็ดลับการตีกอล์ฟเพื่อให้คุณใช้ ถ้าฉันต้องการใช้พวกเขาฉันก็ทำไปแล้ว :) สำหรับสิ่งที่เป็นความจริง / เท็จฉันมักจะตีความว่าเป็นสิ่งที่จริงและเท็จอยู่ในภาษาของคุณ - ลอง[ 0 == 0 ] ; echo $?และ[ 0 == 1 ] ; echo $?
บาดเจ็บดิจิตอล

1

> <> (ปลา) 50 ไบต์

i:3b*(?v88+0.;n1<
0)?vc1.>~ri-&l?!^i-&:&-2d*%
;n0<

คาดว่าตัวอักษรในตำแหน่งเดียวกันจะมีตัวพิมพ์ใหญ่เหมือนกัน

คำอธิบาย

  • i:3b*(?vอ่านคำแรกในสแต็กด้วย88+0.การระบุการวนซ้ำ
  • ~ri-&เอา~พื้นที่แยกจากกองฝืนสแต็คr(ตัวอักษรตัวแรกจะอยู่ด้านบน) อ่านในอักษรตัวแรกของคำที่สองiคำนวณชดเชยจากอักษรตัวแรกคำแรกของและเก็บไว้ในการลงทะเบียน-&
  • l?!^i-&:&-2d*%0)?vอ่านจดหมายทุกฉบับต่อไปของคำที่สอง substracting ได้จากตัวอักษรที่สอดคล้องกันคำแรกซึ่งเป็นที่ด้านบนของ substracts สแต็คชดเชย&:&-เก็บไว้ในการลงทะเบียนและการตรวจสอบถ้าผลที่ได้คือ 0 mod 2d*%26 ถ้าไม่ได้พิมพ์ 0 0n;และสิ้นสุด c1.ให้การกระโดดแบบวนซ้ำ
  • ถ้าถึงจุดสิ้นสุดของคำที่สองโปรแกรมจะพิมพ์ 1 1n;และสิ้นสุด

0

KDB (Q), 35 ไบต์

{0=sum(1_-':)mod[;26](-)."i"$(x;y)}

คำอธิบาย

                         "i"$(x;y)      / convert to ascii decimal
                     (-).               / get differences
             mod[;26]                   / mod 26
      (1_-':)                           / difference between the differences
 0=sum                                  / sum should be 0 if equivalent
{                                 }     / lambda

ทดสอบ

q){0=sum(1_-':)mod[;26](-)."i"$(x;y)}["abcd";"yzab"]
1b

0

Java 281

import java.util.*;enum C{E;Scanner s=new Scanner(System.in);public static void main(String[]z){char[]u=E.n(),v=E.n();int i=0,d=(u[0]-v[0]+26)%26;boolean e=true;for(;++i<u.length;)e&=d==(u[i]-v[i]+26)%26;System.out.print(e);}char[]n(){return s.next().toUpperCase().toCharArray();}}

ขยาย:

import java.util.*;
enum Caesar{
    Equivalence;
    Scanner input=new Scanner(System.in);
    public static void main(String[]z){
        char[]firstString=Equivalence.nextInput(),secondString=Equivalence.nextInput();
        int index=0,difference=(firstString[0]-secondString[0]+26)%26;
        boolean isEqual=true;
        for(;++index<firstString.length;)
            isEqual&=difference==(firstString[index]-secondString[index]+26)%26;
        System.out.print(isEqual);
    }
    char[]nextInput(){
        return input.next().toUpperCase().toCharArray();
    }
}

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


0

เยลลี่ 5 ไบต์

Oạ/ċ2

ลองออนไลน์!

แสดงผลเป็นจำนวนเต็มบวกสำหรับเทียบเท่า 0 มิฉะนั้น

มันทำงานอย่างไร

Oạ/ċ2 - Main link. Argument A (a list of strings)  e.g. ["abc", "cde"]

O     - Ordinal. Cast to code point                     [[97, 98, 99], [99, 100, 101]]
  /   - Reduce the list by...
 ạ    -   absolute difference                           [2, 2, 2]
   ċ2 - Count the number of 2s in the list              3
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.