มันง่ายหรือยาก


21

เพื่อให้คุณทำสิ่งที่ยากลำบากคุณต้องทำสิ่งต่าง ๆ ให้คอมพิวเตอร์ทำเพื่อค้นหาคำศัพท์บางคำด้วยวิธีง่าย ๆ มีการอธิบายบางสิ่งในวิธีที่ง่ายหากใช้เพียงคำที่ใช้มากที่สุดร้อยคำ หากไม่ได้อธิบายไว้ในวิธีที่ยาก นี่อาจเป็นสิ่งที่คอมพิวเตอร์เต็มรูปแบบหรือเป็นส่วนหนึ่งของสิ่งที่คอมพิวเตอร์ (โปรแกรมหรือฟังก์ชั่นเต็มรูปแบบ)

มีสิ่งหนึ่งที่คอมพิวเตอร์จะอ่านซึ่งมีทั้งหมดสิบร้อยคำในนั้นโดยมีช่องว่างระหว่างแต่ละคำ ชื่อของสิ่งที่คอมพิวเตอร์จะอ่านเรียกว่า 'Most used.txt' คุณสามารถเอาสิ่งนี้จากคอมพิวเตอร์เครื่องนี้

คนที่ใช้สิ่งที่คอมพิวเตอร์จะป้อนคำบางคำ (ซึ่งอาจมาจาก STDIN, อาร์กิวเมนต์ของฟังก์ชันหรืออาร์กิวเมนต์บรรทัดคำสั่ง) คอมพิวเตอร์จะต้องพูดอะไรบางอย่างที่เหมือนจริงถ้าคำนั้นง่ายและสิ่งที่ไม่จริงถ้ามันยาก (ความจริงเท็จ ) คนที่ทำให้สิ่งที่สั้นที่สุดที่คอมพิวเตอร์จะทำได้ดีที่สุด สิ่งที่ทุกคนรู้ว่าไม่ดีนั้นไม่ดี ( ช่องโหว่มาตรฐานใช้ )


สิ่งที่ต้องรู้เพิ่มเติมเกี่ยวกับการทำงานของคอมพิวเตอร์:

  • ไม่สำคัญว่าคำจะใหญ่หรือเล็ก

  • รูปภาพที่ทำในสิ่งที่คำว่าหมายถึงง่ายต่อการรู้ (เครื่องหมายวรรคตอน) ไม่สำคัญ ดังนั้นถ้าคนที่ใช้คอมพิวเตอร์พูดว่า "ไม่" มันไม่ได้เป็นคำที่แตกต่างจากคำว่า "ไม่" ตัวเลขและรูปภาพอื่น ๆ ก็ไม่สำคัญ ดังนั้นหากบุคคลนั้นพูดว่า "เขา $$ ll9o" คอมพิวเตอร์ควรอ่านเช่น "hello"

  • เส้นเล็ก ๆ ระหว่างคำ (ขีดกลาง) ทำงานในลักษณะเดียวกับการเว้นวรรค ดังนั้นคำว่า "up-goer-5" จึงเหมือนกับคำว่า "up-goer-5"


สิ่งที่ต้องรู้เพิ่มเติมเกี่ยวกับการสร้างคำเช่นนี้:

https://xkcd.com/1133/

http://splasho.com/upgoer5/#


7
ดังนั้นตรวจสอบคำที่ผู้ใช้สิ่งคอมพิวเตอร์ใช้กับสิ่งที่คำใหญ่เพื่อดูว่าคำทั้งหมดในสิ่งคำเล็ก ๆ อยู่ในสิ่งที่คำใหญ่?
Geobits

24
อาจจะเป็นแค่ฉัน แต่ฉันพบว่ามันยากเกินกว่าจะอ่าน
Alex A.

8
มันอาจจะดีกว่าถ้าให้บทสรุปแบบง่าย ๆ คุยกันตามด้วยข้อมูลจำเพาะจริงในภาษาอังกฤษ "ของจริง"
Geobits

2
ต้องอ่านพจนานุกรมจากไฟล์หรือไม่? นั่นอาจเป็นจริงไม่รวมสองภาษา
Dennis

1
คุณควรจะมีบทลงโทษสำหรับทุกคำที่ใช้ซึ่งยากในโปรแกรม
Beta Decay

คำตอบ:


6

CJam, 41 ไบต์

q"file:///most used.txt"g]{el_euS--S%}/-!

สิ่งนี้ทำให้การสันนิษฐานที่ค่อนข้างไม่สะอาดซึ่งmost used.txtอยู่ในไดเรกทอรีรากเนื่องจาก CJam ไม่สามารถจัดการเส้นทางที่สัมพันธ์กันได้

อีกวิธีหนึ่งเรามีโซลูชันบนเว็บต่อไปนี้ (78 และ 29 ไบต์):

q"https://docs.google.com/uc?id=0B2sM8IORrbL3RVpJWTZNUy1rOFU"g]{el_euS--S%}/-!
q"j.mp/-o_O"g]{el_euS--S%}/-!

วิธีที่ "เหมาะสม" ในการทำเช่นนี้ใน CJam คือการอ่านอินพุตทั้งสองจาก STDIN (อินพุตในบรรทัดแรกพจนานุกรมในวินาที) ซึ่งเป็นไปได้ที่ 18 ไบต์:

qN%{el_euS--S%}/-!

คุณสามารถลองรุ่นสุดท้ายในล่าม CJam (ลิงก์ถาวรทดสอบใน Chrome)

ตัวอย่าง

$ cjam <(echo 'q"file:///most used.txt"g]{el_euS--S%}/-!') <<< 'ten hundred'; echo
1
$ cjam <(echo 'q"file:///most used.txt"g]{el_euS--S%}/-!') <<< 'thousand'; echo
0

2
คุณสามารถใช้ tinyurl บน URL ของ Drive เพื่อทำให้สั้นลง
DeadChex

1
@MIWright คิดออก และอัปโหลดไฟล์ไปยัง Pastebin บันทึกไว้ 12 ไบต์ ขอบคุณ!
Dennis

7

R, 106 ไบต์

ไม่แน่ใจว่าเข้าใจความท้าทายหรือไม่เพราะอ่านยาก

function(s){u=toupper;all(strsplit(gsub("[^A-Z -']","",u(s)),"[ -]")[[1]]%in%u(scan("most used.txt","")))}

สิ่งนี้สร้างส่วนที่ไม่มีชื่อของสิ่งคอมพิวเตอร์ที่ยอมรับสตริงและส่งคืนสิ่งที่เหมือนจริงหรือไม่จริง

คำอธิบาย Ungolfed +:

partOfAComputerThing <- function(s) {
    # Remove everything but letters, spaces, dashes, and single quotes
    s <- gsub("[^A-Z -']", "", toupper(s))

    # Split s into a vector on spaces/dashes
    v <- strsplit(s, "[ -]")[[1]]

    # Read the file of words (assumed to reside in the current directory)
    m <- scan("most used.txt", "")

    # Determine if all words in the input are in the file
    all(v %in% toupper(m))
}

ขอบคุณเดนนิสสำหรับสิ่งที่เป็นแรงบันดาลใจ


2
สิ่งที่part-of-a-computer-thing(s){...}ควรจะเป็นคะแนนโบนัสคุ้มค่า
Dennis

@Dennis: เป็นไงบ้าง :)
อเล็กซ์ A.

ดีมาก!
เดนนิส

3

Python 3, 148 ไบต์

import re
print(all(i in open("most used.txt").read().lower().split(' ')for i in re.sub("[^a-z ']+","",input().replace("-"," ").lower()).split(" ")))

ผลผลิตTrueและFalse

ตัวอย่าง

Input:  Don't
Output: True

Input:  The poison air he's breathing has a dirty smell of dying
Output: False

Input:  Who let the dogs out?
Output: False

สิ่งนี้จะจัดการอินพุตที่don'tถูกต้องหรือไม่?
Alex A.

@AlexA มันกลับTrueมา ถูกต้องหรือไม่
Beta Decay

ด้วยเหตุผลใดก็ตามที่คุณแยกmost used.txtตามบรรทัดใหม่? ฉันไม่แน่ใจ 100% เกี่ยวกับวิธีการทำงาน แต่ฉันคิดว่าคุณพยายามที่จะแยกมันเป็นคำแต่ละคำในไฟล์หรือไม่
DeadChex

@DeadChex ไฟล์ข้อความที่ให้มาคั่นด้วยอะไร? ฉันไม่สามารถเข้าถึงได้เพราะมันทำให้เกิดข้อผิดพลาด SSL
สลายตัวเบต้า

1
คำถามระบุว่า "มีสิ่งหนึ่งที่คอมพิวเตอร์จะอ่านซึ่งมีทั้งหมดสิบร้อยคำโดยมีช่องว่างระหว่างคำแต่ละคำ"
DeadChex

2

Pyth, 35 ไบต์

!-Fm@LGcrXd\-bZ),zs'"most used.txt

ทดสอบโดยที่ไฟล์ข้างต้นเป็นไฟล์ common.pyth

$ pyth common.pyth <<< 'I can write this way too-hell99#0O.'
True
$ pyth common.pyth <<< 'But I get confused easily.'
False

คำอธิบาย:

!-Fm@LGcrXd\-bZ),zs'"most used.txt
   m            ,zs'"most used.txt    Map over input and input file:
         Xd\-b                        Replace hyphens with newlines.
        r     Z                       Cast to lower case.
       c       )                      Split on whitespace.
    @LG                               Remove non-alphabetic characters.
 -F                                   Setwise difference - remove anything in
                                      the text file from the input.
!                                     Logical negation.

0

APL (Dyalog) , 69 ไบต์

สมมติว่าไฟล์อยู่ในไดเรกทอรีปัจจุบัน

s819' '(1↓¨,⊂⍨⊣=,)'[- ]' '\W'R' ' ''
∧/(s⍞)∊s⊃⎕NGET'most used.txt'

ลองออนไลน์!

บรรทัดแรกกำหนดฟังก์ชั่นตัวช่วย normalizing และ splitting-in-list-of-strings s :

s←sคือ
819⌶ lowercased
' '( ผลมาจากฟังก์ชั่นดังต่อไปนี้มีพื้นที่เป็นอาร์กิวเมนต์ซ้าย ...
1↓¨ ลดลงจากแต่ละ
, เรียงต่อกันของการขัดแย้ง
⊂⍨ ตัดก่อนที่แต่ละองค์ประกอบที่
 อาร์กิวเมนต์ซ้าย
= เท่ากับ
, เรียงต่อกันของการขัดแย้งที่
) นำไปใช้
'[- ]' '\W'⎕R' ' ''  ทดแทน PCRE ประ / space → space, ไม่ใช่คำ - ถ่าน→ไม่มีอะไร

∧/() เป็นจริงหรือไม่ที่
s การ
 ป้อนข้อความปกติและการแบ่งข้อความ
 เป็นสมาชิกของ องค์ประกอบแรก
s และแยกส่วน
แรกของ
⎕NGET'most used.txt' (เนื้อหา, การเข้ารหัส, ลักษณะบรรทัดใหม่)


0

JavaScript (ES7), 161 ไบต์

(ไม่ใช่การแข่งขันตามคำถามล่วงหน้าของข้อมูลจำเพาะ ES7)

s=>fetch("most used.txt").then(t=>t.text()).then(d=>alert(s.split(/[ -]/g).every(l=>d.split` `.map(w=>w.replace(/[\.']/,"")).includes(l.replace(/[^a-z]/g,"")))))

ใครมีสำเนาของไฟล์ออนไลน์ที่ฉันสามารถใช้ในการสร้างตัวอย่างการทำงาน?


ฉันเดาว่าคุณสามารถบันทึก 22 ไบต์โดยการลบthenและ 7 alertไบต์โดยการเอา
ติตัส

คุณช่วยอธิบาย @Titus ได้ไหม? แต่ละขั้นตอนของสิ่งนี้คืนสัญญาดังนั้นthens จะต้องรันโค้ดที่ตามมาเมื่อพวกเขาแก้ไข
ขนปุย

ฉันไม่คุ้นเคยกับ ES7; กำลังคิดผิดทาง แต่บางทีคุณอาจมีบางสิ่งบางอย่างที่สั้นกว่านี้หากคุณลดการป้อนข้อมูลลงในคำทั้งหมดที่ไม่ได้อยู่ในรายการ ฉันสงสัยว่า PHP สามารถเอาชนะ JS ได้เกือบ 40%
ติตัส

โอ้ใช่มีห้องพักสำหรับการปรับปรุงที่แน่นอน; นี่เป็นความท้าทายครั้งสุดท้ายของฉันในวันนั้นและฉันก็มีอาการปวดหัวดังนั้นฉันจึงโพสต์สิ่งที่ฉันมีเพื่อมาเยี่ยมพรุ่งนี้ น่าเสียดายที่สัญญาที่ต้องใช้เพื่อให้ได้เนื้อหาของไฟล์ทำให้ JS เสียเปรียบในความท้าทายเหล่านี้กับ PHP ที่ชอบ แต่ก็ยังดีกว่าทางเลือกในการใช้ XHR
ขนปุย

0

PHP, 101 ไบต์

foreach(preg_split("#[^\w']+#",$argn)as$w)preg_match("#\b$w\b#i",end(file("most used.txt")))?:die(1);

ใช้อินพุตจาก STDIN สมมติว่าพจนานุกรมบรรทัดเดียวจบ
ด้วย1(ข้อผิดพลาด) สำหรับความเท็จ0(ok) สำหรับความจริง -Rทำงานด้วย

แยกการป้อนข้อมูลด้วยตัวอักษรที่ไม่ใช่คำวนซ้ำผ่านอาร์เรย์ผลลัพธ์ (คำ):
หากคำอยู่ในพจนานุกรมให้ดำเนินการต่อ; exit(1)อื่น โดยปริยาย
exit(0)

หรือใส่เพียง:

หนึ่งคำถัดจากคำอื่น: หากคำนั้นเป็นคำที่ใช้บ่อยที่สุดให้ทำต่อไป; อื่นกลับมา 1. ส่งคืน 0

และ: ฉันสามารถบันทึกสองจุดหากคำที่ใช้มากที่สุดมีช่องว่างด้านหน้าและท้ายที่สุด


-1

Java, 248 ไบต์

ด้วยวลีที่ส่งผ่านเป็นอาร์กิวเมนต์

void g(String s) throws Exception{String c=new java.util.Scanner(new java.io.File("most used.txt")).useDelimiter("\\Z").next(),x="false";for(String l:s.split(" "))if(c.contains(l.toLowerCase().replaceAll("![a-z]","")))x="true";System.out.print(x);}

อินพุต / เอาต์พุต:

g("was he")         --> "true"
g("was h!e")         --> "true"
g("delicious cake") --> "false"

เว้นระยะและแท็บออก:

void g(String s) throws Exception{
    String c=new java.util.Scanner(new java.io.File("most used.txt")).useDelimiter("\\Z").next()
      ,x="false";
    for(String l:s.split(" "))
      if(c.contains(l.toLowerCase().replaceAll("![a-z]","")))
          x="true";
    System.out.print(x);
}

คุณหมายถึงอะไรก็ขึ้นอยู่กับคุณที่จะนำเข้าสิ่งที่จำเป็น ?
Beta Decay

@ เบต้าฉันใช้คลาสยูทิลิตี้บางอย่างของ Java ซึ่งถ้าคุณใส่ฟังก์ชั่นนี้ในโปรแกรมที่คุณจะต้องนำเข้า (เช่นjava.io.*และjava.util.*) คล้ายกับคำสั่ง pythons ที่นำเข้า
DeadChex

3
คุณต้องรวมการนำเข้าเหล่านี้ในการนับไบต์ของคุณ คุณไม่ได้รับอนุญาตให้ยกเว้นคำสั่งนำเข้าใน Python ดังนั้นคุณจึงไม่สามารถยกเว้นได้ใน Java
Beta Decay

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