5318008-계산기와 재미


32

전 세계의 학교에서 아이들은 LCD 계산기에 숫자를 입력하고 'Boobies'라는 단어를 만든 후 거꾸로 뒤집어 웃음을 터뜨립니다. 물론이 단어는 가장 인기있는 단어이지만 다른 단어도 많이 있습니다.

그러나 모든 단어는 10 자 미만이어야합니다 (사전에는 이보다 긴 단어가 포함되어 있으므로 프로그램에서 필터를 수행해야합니다). 이 사전에는 대문자가 있으므로 모든 단어를 소문자로 변환하십시오.

영어 사전을 사용하여 LCD 계산기에 입력하고 단어를 만들 수있는 숫자 목록을 만듭니다. 모든 코드 골프 질문과 마찬가지로이 작업을 완료하는 가장 짧은 프로그램이 승리합니다.

테스트를 위해 다음을 입력하여 수집 한 UNIX 단어 목록을 사용했습니다.

ln -s /usr/dict/words w.txt

또는 여기에서 확인하십시오 .

예를 들어 위의 이미지는 숫자 35007를 계산기 에 입력하고 거꾸로 뒤집어 만들어졌습니다.

문자와 해당 번호 :

  • b :8
  • g :6
  • l :7
  • 나는 :1
  • o :0
  • s :5
  • z :2
  • h :4
  • e :3

숫자가 0으로 시작하면 그 0 뒤에 소수점이 필요합니다. 숫자는 소수점으로 시작해서는 안됩니다.

나는 이것이 MartinBüttner의 코드라고 생각합니다.

/* Configuration */

var QUESTION_ID = 51871; // Obtain this from the url
// It will be like http://XYZ.stackexchange.com/questions/QUESTION_ID/... on any question page
var ANSWER_FILTER = "!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe";

/* App */

var answers = [], page = 1;

function answersUrl(index) {
  return "http://api.stackexchange.com/2.2/questions/" +  QUESTION_ID + "/answers?page=" + index + "&pagesize=100&order=desc&sort=creation&site=codegolf&filter=" + ANSWER_FILTER;
}

function getAnswers() {
  jQuery.ajax({
    url: answersUrl(page++),
    method: "get",
    dataType: "jsonp",
    crossDomain: true,
    success: function (data) {
      answers.push.apply(answers, data.items);
      if (data.has_more) getAnswers();
      else process();
    }
  });
}

getAnswers();

var SIZE_REG = /\d+(?=[^\d&]*(?:<(?:s>[^&]*<\/s>|[^&]+>)[^\d&]*)*$)/;
var NUMBER_REG = /\d+/;
var LANGUAGE_REG = /^#*\s*([^,]+)/;

function shouldHaveHeading(a) {
  var pass = false;
  var lines = a.body_markdown.split("\n");
  try {
    pass |= /^#/.test(a.body_markdown);
    pass |= ["-", "="]
              .indexOf(lines[1][0]) > -1;
    pass &= LANGUAGE_REG.test(a.body_markdown);
  } catch (ex) {}
  return pass;
}

function shouldHaveScore(a) {
  var pass = false;
  try {
    pass |= SIZE_REG.test(a.body_markdown.split("\n")[0]);
  } catch (ex) {}
  return pass;
}

function getAuthorName(a) {
  return a.owner.display_name;
}

function process() {
  answers = answers.filter(shouldHaveScore)
                   .filter(shouldHaveHeading);
  answers.sort(function (a, b) {
    var aB = +(a.body_markdown.split("\n")[0].match(SIZE_REG) || [Infinity])[0],
        bB = +(b.body_markdown.split("\n")[0].match(SIZE_REG) || [Infinity])[0];
    return aB - bB
  });

  var languages = {};
  var place = 1;
  var lastSize = null;
  var lastPlace = 1;
  answers.forEach(function (a) {
    var headline = a.body_markdown.split("\n")[0];
    //console.log(a);
    var answer = jQuery("#answer-template").html();
    var num = headline.match(NUMBER_REG)[0];
    var size = (headline.match(SIZE_REG)||[0])[0];
    var language = headline.match(LANGUAGE_REG)[1];
    var user = getAuthorName(a);
    if (size != lastSize)
      lastPlace = place;
    lastSize = size;
    ++place;
    answer = answer.replace("{{PLACE}}", lastPlace + ".")
                   .replace("{{NAME}}", user)
                   .replace("{{LANGUAGE}}", language)
                   .replace("{{SIZE}}", size)
                   .replace("{{LINK}}", a.share_link);
    answer = jQuery(answer)
    jQuery("#answers").append(answer);

    languages[language] = languages[language] || {lang: language, user: user, size: size, link: a.share_link};
  });

  var langs = [];
  for (var lang in languages)
    if (languages.hasOwnProperty(lang))
      langs.push(languages[lang]);

  langs.sort(function (a, b) {
    if (a.lang > b.lang) return 1;
    if (a.lang < b.lang) return -1;
    return 0;
  });

  for (var i = 0; i < langs.length; ++i)
  {
    var language = jQuery("#language-template").html();
    var lang = langs[i];
    language = language.replace("{{LANGUAGE}}", lang.lang)
                       .replace("{{NAME}}", lang.user)
                       .replace("{{SIZE}}", lang.size)
                       .replace("{{LINK}}", lang.link);
    language = jQuery(language);
    jQuery("#languages").append(language);
  }

}
body { text-align: left !important}

#answer-list {
  padding: 10px;
  width: 50%;
  float: left;
}

#language-list {
  padding: 10px;
  width: 50%px;
  float: left;
}

table thead {
  font-weight: bold;
}

table td {
  padding: 5px;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<link rel="stylesheet" type="text/css" href="//cdn.sstatic.net/codegolf/all.css?v=83c949450c8b">
<div id="answer-list">
  <h2>Leaderboard</h2>
  <table class="answer-list">
    <thead>
      <tr><td></td><td>Author</td><td>Language</td><td>Size</td></tr>
    </thead>
    <tbody id="answers">

    </tbody>
  </table>
</div>
<div id="language-list">
  <h2>Winners by Language</h2>
  <table class="language-list">
    <thead>
      <tr><td>Language</td><td>User</td><td>Score</td></tr>
    </thead>
    <tbody id="languages">

    </tbody>
  </table>
</div>
<table style="display: none">
  <tbody id="answer-template">
    <tr><td>{{PLACE}}</td><td>{{NAME}}</td><td>{{LANGUAGE}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr>
  </tbody>
</table>
<table style="display: none">
  <tbody id="language-template">
    <tr><td>{{LANGUAGE}}</td><td>{{NAME}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr>
  </tbody>
</table>


4
필요하지 않더라도 첫 번째 숫자 뒤에 소수점을 사용할 수 있습니까?
Dennis

1
우리는 입력해야합니까 0.7734에 대한 인사 또는 것 .7734받아 들일 수?
Dennis

3
사전에 대문자, 문장 부호 등이 포함 된 단어가 포함 된 경우 올바른 동작은 무엇입니까?
피터 테일러

1
@Dennis 0.7734필요
Beta Decay

4
소수점 뒤에 0이 필요한 단어는 어떻습니까? 예를 들어, oligo후행 제로 요구 소수점을 :0.6170
씨 라마

답변:


7

CJam, 44 42 바이트

r{el"oizehsglb"f#W%"0."a.e|N+_,B<*_W&!*r}h

CJam 통역사 에서 온라인으로 사용해보십시오 .

명령 행에서 프로그램을 실행하려면 Java 인터프리터를 다운로드 하고 다음을 실행하십시오.

java -jar cjam-0.6.5.jar 5318008.cjam < /usr/share/dict/words

작동 원리

r            e# Read a whitespace-separated token from STDIN.
{            e# While loop:
 el          e#   Convert to lowercase.
 "oizehsglb" e#   Push that string.
 f#          e#   Get the index of each character from the input in that string.
             e#   This pushes -1 for "not found".
 W%          e#   Reverse the resulting array.
 "0."a       e#   Push ["0."].
 .e|         e#   Vectorized logical NOT. This replaces an initial 0 with "0.".
 N+          e#   Append a linefeed.
 _,B<*       e#   Repeat the array (array.length < 11) times.
 _W&!*       e#   Repeat the array !(array.intersection(-1)) times.
 r           e#   Read a whitespace-separated token from STDIN.
}h           e# If the token is not empty, repeat the loop.

9

배쉬 + 코어 유틸리티, 54

골프 도움을 주신 @TobySpeight에게 다시 한 번 감사드립니다.

rev|tr oizehsglb 0-8|sed '/.\{11\}\|[^0-9]/d;s/^0/&./'

입력 단어 목록은 STDIN에서 가져옵니다.

$ ./5318008.sh < /usr/share/dict/words | head
8
38
338
5338
638
5638
36138
31738
531738
7738
$ 

"Belie"와 "Belies"는 단어입니까? 더 많이 알면 ...
clismique

6

파이썬 2 271 216 211 205 바이트

이것이 내가 지금까지 가진 유일한 아이디어입니다 .. 다른 것을 생각하면 이것을 업데이트 할 것입니다! 파일을 읽어야한다고 가정했지만 알려주지 않으면 업데이트 할 수 있습니다. :)

55 바이트를 절약 해 준 Dennis에게 큰 감사를드립니다 :)

또한 6 바이트를 절약 한 Sp3000 덕분에

d,f,g='oizehsglb',[x.lower()for x in open('w.txt').read().split('\n')if len(x)<10],[]
for x in f:
 c=x[::-1]
 for b in d:c=c.replace(b,`d.find(b)`)
 g=[g,g+[['0.'+c[1:],c][c[0]!='0']]][c.isdigit()]
print g

나는 많은 파이썬을 모르지만 "oizehsglb".index(b)더 짧은 것과 같지 않습니까?
Dennis

3
d[b] == "oizehsglb".index(b). 문자열 / 문자로 캐스트되지 않았을 수 있습니다.
Dennis

1
오, 와우, 우리가 교체 할 수있는 숫자가 순서대로 숫자 값을 갖는 것은 결코 일어나지 않았습니다. 그렇습니다. 감사!
Kade

1
테스트하지는 않았지만 : 1) .find보다 짧습니다 .index. 2) 2.7.10 이상의 open모드 인수가없는 버전에 따라 기본값은 r3입니다.) for x in open(...)작동 하지 않습니까? (후행 줄 바꿈을 제거해야 할 수도 있음) 그렇지 않은 .split('\n')경우.splitlines()
Sp3000

1
또한 g+=[['0.'+c[1:],c][c[0]!='0']]*c.isdigit(), 당신은에 반대하여 몇을 절약 할 수 있습니다 f다음 일을 for c in f대신 가지고 c=x[::-1]. 또한 f한 번만 사용 하므로 변수로 저장할 필요가 없습니다
Sp3000

6

자바 스크립트 (ES7), 73 바이트

이것은 ES7에서 73 바이트에 불과합니다.

s=>[for(w of s)'oizehsglb'.search(w)].reverse().join``.replace(/^0/,'0.')

언 골프 드 :

var b = function b(s) {
    return s.length < 10 && /^[bglioszhe]*$/.test(s) ? s.replace(/./g, function (w) {
        return 'oizehsglb'.search(w);
    }).reverse().join('').replace(/^0/, '0.') : '';
};

용법:

t('hello'); // 0.7734
t('loose'); // 35007
t('impossible'); //

기능:

t=s=>                       // Create a function 't' with an argument named 's' 
   [                        // Return this array  comprehension
     for(i of s)            // Loops through each letter in the string
     'oizehsglb'.search(w)  // Converts it to it's corresponding number
   ]
  .reverse().join``         // Reverse the array and make it a string
  .replace(/^0/,'0.')       // If the first character is a 0, add a decimal after it

나는 이것을 UNIX wordlist에서 실행하고 결과를 paste bin에 넣었습니다.

결과

Firefox 에서 결과를 얻는 데 사용되는 코드 :

document.querySelector('pre').innerHTML.split('\n').map(i => t(i.toLowerCase())).join('\n').replace(/^\s*[\r\n]/gm, '');

어떻게됩니까 t('Impossible')?
Arturo Torres Sánchez

@ ArturoTorresSánchez 당신이 맞아요, 내가
고쳤습니다

ES2015에 가입 했습니까? 아니면 ES2015 이전에 있습니까?
WallyWest

@WallyWest ES6 기능입니다. 대부분의 주요 브라우저에서 지원됩니다
Downgoat

ES7이 구체적입니까?
Arjun

5

파이썬 2, 121 바이트

for s in open("w.txt"):
 L=map("oizehsglb".find,s[-2::-1].lower())
 if-min(L)<1>len(L)-9:print`L[0]`+"."[L[0]:]+`L`[4::3]

사전 파일을 가정합니다 w.txt 이 후행 줄 바꿈으로 끝나고 빈 줄이 없다고 가정합니다.


3

GNU sed, 82

(1 포함 -r )

골프 도움말에 대한 @TobySpeight에게 감사합니다.

s/$/:/
:
s/(.)(:.*)/\2\1/
t
s/://
y/oizehsglb/012345678/
/.{11}|[^0-9]/d;s/^0/&./

입력 단어 목록은 STDIN에서 가져옵니다.

$ sed -rf 5318008.sed /usr/share/dict/words | tail
3705
53705
1705
0.705
50705
5705
505
2
0.02
5002
$ 

2

TI 기본, 75 88 바이트

편집 2 : 한 번에 한 단어 (사전이 아닌) 만 허용하므로 기술적으로 유효하지 않습니다. 입력으로 둘 이상의 단어를 허용하도록 수정하려고합니다 ...

편집 : 죄송합니다; 나는 원래가에 0.0을 표시했다 경우 마지막 숫자가 0이 아닌 다른 방법으로 주위이었다. 이것은 다소 나쁜 해결 방법이지만 (0으로 시작하면 숫자와 함께 "0"을 표시하고 그렇지 않으면 같은 장소에 두 개의 공백을 표시합니다) 수정되었습니다. 밝은면에서는 실제로 10 진수를 표시하지 않으므로 "Otto"(0을 모두 표시)와 같은 단어를 올바르게 처리합니다!


나는 이것을 할 더 좋은 언어를 생각할 수 없다. 확실히 더 골프를 칠 수 있지만, 지금 너무 피곤하다. 물결표는 부정 기호입니다.( - ) 버튼]입니다.

입력은 계산기의 응답 변수에서 가져옵니다. 즉 _, 대화식 파이썬 쉘에서 와 같이 마지막으로 평가 된 항목을 의미 하므로 홈 화면에 문자열을 입력하고 (인용 부호가 켜져 있음 ALPHA+)를 누른 ENTER다음 프로그램을 실행하십시오. 또는 콜론을 사용하여 명령을 분리 할 수 ​​있으므로 프로그램 이름을 "CALCTEXT"로 지정하고 문자열 "HELLO"에서 실행하려는 "HELLO":prgmCALCTEXT경우 별도로 수행하지 않고 입력 할 수 있습니다 .

seq(inString("OIZEHSGLB",sub(Ans,X,1))-1,X,length(Ans),1,~1
Text(0,0,sub("0.  ",1+2(0 or Ans(1)),2),sum(seq(Ans(X)10^(dim(Ans)-X),X,1,dim(Ans

2

파이썬 2 147 158 156 바이트

이 '0'이 누락되었습니다. 요구 사항. 희망은 이제 잘 작동합니다.

편집 : ".readlines ()"를 제거하고 여전히 작동합니다 .p

edit2 : 공백을 제거하고 인쇄를 세 번째 줄로 이동

edit3 : Sp3000 덕분에 2 바이트 절약 (인쇄 후 공간 제거 및 '색인'을 '찾기'로 변경)

for x in open("w.txt"):
 a="oizehsglb";g=[`a.find(b)`for b in x[::-1].lower()if b in a]
 if len(g)==len(x)-1<10:
  if g[0]=="0":g[0]="0."
  print"".join(g)

1

파이썬 2, 184 174 바이트

for s in open('w.txt'):
 try:a=''.join(map(lambda c:dict(zip('bglioszhe','867105243'))[c],s[:-1][::-1]));a=[a,'0.'+a[1:]][a[0]=='0'];print['',''.join(a)][len(s)<11]
 except:0

1

루비 2, 88 86 바이트

x="oizehsglb"
puts$_.tr(x,"0-8").reverse.sub /^0/,"0." if$_.size<11&&$_.delete(x)<?A

바이트 수에는 ln명령 행 옵션에 2가 포함됩니다 .

$ ruby -ln 5318008.rb wordlist.txt

이 경우 ==""으로 교체 할 수 있습니다 <?A. 그리고 필요 gsub()로는 sub()충분하지 않습니다.
manatwork

1

C, 182 172 181분의 169 172 바이트

char*l="oizehsglb",S[99],*s,*t;main(x){for(;t=S+98,gets(S);){for(s=S;*s;s++)if(x=strchr(l,*s|32))*--t=48+x-(int)l;else break;*t==48?*t--=46,*t=48:0;*s||s-S>10?0:puts(t);}}

넓히는

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char *l="oizehsglb",S[99],*s,*t;

main(int x, char **argv)
{
    for (;t=S+98,gets(S);){
        for (s=S;*s;s++)
            if (x=strchr(l,*s|32))
                *--t=48+x-(int)l;
            else
                break;
        if (*t==48) {       // '0'
            *t--=46;        // '.'
            *t=48;  // '0'
        }

        if (!*s && s-S <= 10)
            puts(t);
    }
}

소문자 변환과 함께 링크 된 words.txt 사용 :

$ ./a.out  < words.txt  | tail
2212
0.2
0.802
0.602
7702
37702
0.02
321607002
515002
0.02002

$ ./a.out < words.txt   | wc -l
 550

1
*s|32이 문맥에서 소문자 변환으로 작동 하지 않습니까?
Hagen von Eitzen 2016 년

좋은 생각이야! 감사!
일부 사용자

1

Haskell, 가져 오기없이 175 바이트 (가져 오기로 229 바이트)

관련 코드 (예 : File Calc.hs) :

import Data.Char(toLower)
import Data.Maybe(mapMaybe)
s="oizehsglb\n"
g('0':r)="0."++r
g x=x
main=mapM_(putStrLn.g.reverse.mapMaybe(`lookup`zip s['0'..'8'])).filter(\l->length l<10&&all(`elem`s)l).lines.map toLower=<<getContents

$ cat /usr/share/dict/words | runghc Calc.hs

0

자바 208 200 176 바이트

String f(char[] w){String o="",l="oizehsglb";for(int i=w.length;i>0;i--)o+=l.indexOf(w[i-1]|32);if(o.contains("-")||o.length()>8)o="  ";return o.charAt(0)+"."+o.substring(1);}

넓히는

String f(char[] w)
{
    String o = "", l = "oizehsglb";
    for(int i = w.length; i > 0; i--)
        o+=l.indexOf(w[i-1]|32);
    if(o.contains("-")||o.length() > 8)
        o = "  ";
    return o.charAt(0) + "." + o.substring(1);
}

항상 10 진수를 추가하고 유효하지 않은 경우 ""를 반환합니다. 그러나 그렇지 않으면 정상적으로 작동합니다. :피

@ LegionMammal978 감사합니다!


및 로 변경 ;String l=하여 7 바이트를 절약 할 수 있습니다 . ,l==o++=
군단 포유류 978
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.